Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
209 commits
Select commit Hold shift + click to select a range
c758e16
small rewording
EDRipper Mar 25, 2026
12c6e4d
Merge pull request #1 from PianoMan0/main - fill out FAQ answers
EDRipper Mar 25, 2026
50e7627
feat: refactor backend to use nestJS
EDRipper Mar 25, 2026
0a7df20
fix: escape quotation mark
EDRipper Mar 25, 2026
6ddf39a
implement backend validation for RSVP
EDRipper Mar 25, 2026
7b5eb51
fix: remove .vscode from tracking and gitignore editor configs
EDRipper Mar 25, 2026
ed1d711
rename beest/ to frontend/
EDRipper Mar 25, 2026
bf5aede
fix: make RSVP error text black and remove button scale animation
EDRipper Mar 26, 2026
660cf8d
feat: add auth guard, validate emls before storing
EDRipper Mar 26, 2026
1c3d375
fix: optimise first paint and remove unused assets
EDRipper Mar 26, 2026
2700d45
parralaz
EDRipper Mar 26, 2026
aeb59fc
make demo deployable
EDRipper Mar 27, 2026
9b5c438
fronting the end
EDRipper Mar 31, 2026
77ee7f4
fix: switch backend port
EDRipper Mar 31, 2026
9f029b6
meh yall dont need that lol
EDRipper Mar 31, 2026
aacb126
chore: untrack CLAUDE.md files and add to .gitignore
EDRipper Mar 31, 2026
f8c8872
synch to hackatime?
EDRipper Apr 1, 2026
789f15d
fail gracefully without hackatime secret
EDRipper Apr 1, 2026
c9b2746
chore: frontend logging
EDRipper Apr 1, 2026
3932933
add health endpoint
EDRipper Apr 1, 2026
5a3e1ec
feat: check slack onboarding status in tut
EDRipper Apr 1, 2026
1bf62ac
feat: most of the frontend
EDRipper Apr 1, 2026
59bea3b
chore: resize sticker
EDRipper Apr 2, 2026
52d7c3d
chore: ui fix
EDRipper Apr 2, 2026
2759e28
feat: create project UI
EDRipper Apr 2, 2026
a6ae013
fix: close create project UI on page change
EDRipper Apr 2, 2026
75ff38c
half a backend
EDRipper Apr 2, 2026
f6ec1af
fix: specify type for project entity URL columns
EDRipper Apr 2, 2026
1c76f42
-schema migrations, hackatime integrations, matching front end fixes
EDRipper Apr 3, 2026
cf72b9e
fix: optimise and fix tutorial
EDRipper Apr 3, 2026
cfc71af
a commit for sure, i think this one does UI and schema changes and er…
EDRipper Apr 3, 2026
ffed6ad
crop landing page images to save render, position with css
EDRipper Apr 3, 2026
cf4549b
remove unused assets
EDRipper Apr 3, 2026
62a8578
feat: admin stuff
EDRipper Apr 3, 2026
b6b4050
fix: dont depend build on pre-existing migration
EDRipper Apr 3, 2026
871c1c2
feat: leaderboard
EDRipper Apr 3, 2026
e0b606f
link up to new HCA route
EDRipper Apr 3, 2026
b161a1d
synch sticker links, admin news and user filter
EDRipper Apr 3, 2026
c6b5c11
remove old endpoint
EDRipper Apr 3, 2026
2935ea1
pt2
EDRipper Apr 3, 2026
d0fd0ff
remove unused page
EDRipper Apr 3, 2026
06979c5
scroll hint fix
EDRipper Apr 3, 2026
2b643af
shop stuff
EDRipper Apr 3, 2026
2ad2a06
fix: force refresh on bans
EDRipper Apr 3, 2026
213a8f9
feat: review dash stuff
EDRipper Apr 3, 2026
daa2d48
feat: wire up project feedback
EDRipper Apr 3, 2026
545e1d8
fix: screenshot removal
EDRipper Apr 5, 2026
240d7c7
shop fix
EDRipper Apr 6, 2026
09c1caa
feat: resubmission
EDRipper Apr 6, 2026
a65bdeb
chore(deps): bump path-to-regexp, @nestjs/core and @nestjs/platform-e…
dependabot[bot] Apr 6, 2026
2b92822
feat: putting the fun in user funnel
EDRipper Apr 6, 2026
df993e0
fix: update Airtable field names to include 'loops' prefix
EDRipper Apr 6, 2026
e8f7242
fix: use capital L
EDRipper Apr 6, 2026
3e4c731
chore: replace filler text
EDRipper Apr 6, 2026
20a94fd
fix: onboarding custom flow
EDRipper Apr 6, 2026
453674d
fix: make it all okay
EDRipper Apr 6, 2026
6976542
fix: allow big ss
EDRipper Apr 6, 2026
ab99d91
fix: update Dockerfile body size limit and simplify adapter configura…
EDRipper Apr 6, 2026
e35f0ec
make workie
EDRipper Apr 6, 2026
d82ec21
fix: synch hackatime to admin panel
EDRipper Apr 6, 2026
6905765
chore(deps-dev): bump vite from 7.3.1 to 7.3.2 in /frontend
dependabot[bot] Apr 7, 2026
fe83b2b
smh
EDRipper Apr 7, 2026
4934d27
fix: use the gif
EDRipper Apr 7, 2026
055e472
maybe fix lables
EDRipper Apr 7, 2026
1c52c77
Merge pull request #5 from hackclub/dependabot/npm_and_yarn/frontend/…
PianoMan0 Apr 7, 2026
8ab3648
fix favicon
EDRipper Apr 7, 2026
c0a332b
fix: address layout inconsistency in chrome
EDRipper Apr 8, 2026
b82db86
make mobile warning dismissable
EDRipper Apr 8, 2026
50db4dc
fix: maybe?
EDRipper Apr 8, 2026
5e5573a
fix: open tutorial after warning dismissal
EDRipper Apr 8, 2026
f19042c
fix: probably?
EDRipper Apr 9, 2026
1fbdffe
stylistic fix
EDRipper Apr 9, 2026
e594282
show users feedback
EDRipper Apr 9, 2026
cbde99c
fix: flex bg
EDRipper Apr 9, 2026
debb7c3
fix: favicon background transparency
EDRipper Apr 10, 2026
d1eb55b
chore: change the text
EDRipper Apr 10, 2026
aec792a
chore: Q&A addition
EDRipper Apr 10, 2026
54bcd30
fix: show a name rather than UID in admin log
EDRipper Apr 10, 2026
e119a6c
fix UI on root
EDRipper Apr 10, 2026
d8f85ac
stat cards
EDRipper Apr 10, 2026
100daeb
remove dead scroll
EDRipper Apr 10, 2026
b00b588
make things look nice
EDRipper Apr 10, 2026
4ceb26f
mobile fix
EDRipper Apr 10, 2026
044b985
rename security bounty from bug bounty
EDRipper Apr 13, 2026
b6f97f9
fix: link styling
EDRipper Apr 13, 2026
3906cca
fix mismatch
EDRipper Apr 13, 2026
470577b
try some debugging
EDRipper Apr 13, 2026
43fb3cb
fix admin panel sizing
EDRipper Apr 13, 2026
6fc9e7a
fix: prevent all fraud ever
EDRipper Apr 13, 2026
83617f2
fix the thing
EDRipper Apr 13, 2026
50e70ab
shop cards scale down
EDRipper Apr 14, 2026
a9b95a0
make shop card better
EDRipper Apr 15, 2026
a6a9733
feat: add stages to user funnel and backfil
EDRipper Apr 16, 2026
0902ac3
feat [auth]: persist tokens and sessions
EDRipper Apr 17, 2026
30ea06b
drop sessions
EDRipper Apr 17, 2026
fa77fc2
style: enforce 3 cards per row in shop
EDRipper Apr 17, 2026
af6745e
feat [metrics]: introduce and backfill DetailedProject funnel stage
EDRipper Apr 17, 2026
046496e
new pipe image
EDRipper Apr 17, 2026
df195f4
feat: allow re pushing to airtable
EDRipper Apr 17, 2026
c71990a
fix: proxy backend resync-airtable route
EDRipper Apr 17, 2026
fd4880e
feat: re-review
EDRipper Apr 17, 2026
bc2aec2
fix: make it good
EDRipper Apr 17, 2026
860c393
feat: detailed shop itematxdfycvguyihbuojio;
EDRipper Apr 17, 2026
1205768
fix [FAQ]: typo
EDRipper Apr 20, 2026
001c153
feat[admin]: DAU
EDRipper Apr 20, 2026
04831e6
fix [admin]: proxy DAUs to backend
EDRipper Apr 20, 2026
f6cd415
amber commit
EDRipper Apr 21, 2026
315509a
add other option
EDRipper Apr 21, 2026
d430fb0
yeah you dont need that
EDRipper Apr 21, 2026
b849846
and in frontent
EDRipper Apr 21, 2026
6dfec3a
first last name
EDRipper Apr 21, 2026
4d81a04
fix [admin]: Restrict meaning of DAU
EDRipper Apr 21, 2026
366733c
fix: lock down approved hours on front page
EDRipper Apr 21, 2026
8644aab
feat [docs]: add review guidelines
EDRipper Apr 22, 2026
9c0c505
feat[UI]: sidebar menu floats in shop section
EDRipper Apr 22, 2026
71b7958
chore [wording]: indicate need to redo tutorial
EDRipper Apr 22, 2026
1a785e8
feat [admin]: lock down scope of reviewers
EDRipper Apr 22, 2026
8d15c24
upsie daisy
EDRipper Apr 22, 2026
3904731
chore: update gitignore to include dumps
EDRipper Apr 23, 2026
44a7599
feat [admin]: Backfill and track DAUs with line graph
EDRipper Apr 23, 2026
fdcf222
fix [admin]: hover tooltip on DAUs
EDRipper Apr 23, 2026
94186c1
feat [tooling]: Adjust Balance field
EDRipper Apr 23, 2026
10a2f6f
chore [shop]: rewording
EDRipper Apr 23, 2026
53560bf
fix [shop]: hide overflow
EDRipper Apr 23, 2026
d39ae08
fix [integrations]: prompt hackatime auth on project update
EDRipper Apr 23, 2026
da92dda
feat [admin]: stats page
EDRipper Apr 23, 2026
41cd708
fix make it good
EDRipper Apr 24, 2026
ae7acf3
add genders
EDRipper Apr 24, 2026
eb63415
shop cards
EDRipper Apr 24, 2026
95fc552
fix: adjust approved hours calculation based on project status
EDRipper Apr 24, 2026
6e5ca76
add refund feature
EDRipper Apr 28, 2026
61ad90e
fix: small UI tweaks and mobile landing texture flicker
EDRipper Apr 28, 2026
e4e013d
fix: only show approved hours on leaderboard
EDRipper Apr 28, 2026
edb597e
feat: add user attribution tracking and database fields
EDRipper Apr 30, 2026
b8a205f
fix: amend date (2025 -> 2026)
taqidotdev May 3, 2026
18f7ea8
fix: grant pipes from total approved hours instead of per project
EDRipper May 5, 2026
c2e79f3
fix: progress bar correctly accounts for earned hours
EDRipper May 5, 2026
feef9db
feat: shop suggestions with voting
EDRipper May 5, 2026
8b922e5
fix: input sanitisation
EDRipper May 5, 2026
f09cb50
fix: prevent reduction of approved hours below granted pipes and add …
EDRipper May 5, 2026
10bdff6
fix: display project card at half screen height not page height
EDRipper May 5, 2026
9909ce6
fix: change gender color from black (unreadable)
taqidotdev May 5, 2026
6f8b59c
Merge branch 'main' into fix-2025
taqidotdev May 5, 2026
a424291
feat: ship everything!
EDRipper May 6, 2026
0367a02
Implement feature X to enhance user experience and fix bug Y in module Z
EDRipper May 6, 2026
53e1749
fix [UI]: project card arrangement
EDRipper May 6, 2026
a9c1d00
fix fix
EDRipper May 6, 2026
723b75f
Merge pull request #4 from hackclub/dependabot/npm_and_yarn/backend/m…
EDRipper May 7, 2026
266c61e
chore(deps): bump lodash and @nestjs/config in /backend
dependabot[bot] May 7, 2026
1024c7b
feat: refund orders user side
EDRipper May 7, 2026
43d470e
Merge branch 'main' of https://github.com/hackclub/beest
EDRipper May 7, 2026
93ee240
Merge pull request #13 from taqidotdev/gender-colour
EDRipper May 7, 2026
d5f6655
Merge pull request #11 from taqidotdev/fix-2025
EDRipper May 7, 2026
a5cf40c
Merge pull request #15 from hackclub/dependabot/npm_and_yarn/backend/…
EDRipper May 7, 2026
9d831b2
feat: redirect from beast
EDRipper May 7, 2026
b6a0fb6
Merge branch 'main' of https://github.com/hackclub/beest
EDRipper May 7, 2026
c6b247a
add dates
EDRipper May 7, 2026
60ba89e
fix, i hope
EDRipper May 8, 2026
936dd4a
enforce IDV
EDRipper May 8, 2026
d73fe0d
fix: tut link to faq
EDRipper May 8, 2026
3ad6f2c
feat: prevent all fraud ever
EDRipper May 8, 2026
9ba2d4c
i am the abode of fears and dreams alike, the mother of many crimes a…
EDRipper May 8, 2026
f7f92ae
chore: swap out emails
EDRipper May 8, 2026
94659ff
oops!
EDRipper May 9, 2026
a5e2559
chore [admin]: show email instead of slack ID in fulfilment view
EDRipper May 9, 2026
3f23756
fix: write the right code?
EDRipper May 9, 2026
761cae4
chore: order shop items by price ascending
ascpixi May 9, 2026
4ef9ce2
feat: add featured flag to shop items
ascpixi May 10, 2026
6db45da
Merge pull request #17 from ascpixi/chore/shop-order-by-price
EDRipper May 10, 2026
c88262d
show me ur address
EDRipper May 11, 2026
17b9a64
Merge branch 'main' of https://github.com/hackclub/beest
EDRipper May 11, 2026
452fa65
feat [admin]: show unreviewed hours total on stats page
EDRipper May 11, 2026
b6ca37f
fix [admin]: add SvelteKit proxy for /admin/stats/unreviewed-hours
EDRipper May 11, 2026
cd18155
feat [admin]: predict approved hours from historical approval rate
EDRipper May 11, 2026
a9e06c7
feat: optional reviewer note on ship + resubmit
EDRipper May 11, 2026
eb381df
chore: add fraud-backfill scripts
EDRipper May 11, 2026
14ad116
fix: feature card size cap
EDRipper May 11, 2026
b0038d0
fix!: use airbridge instead of raw airtable
ImShyMike May 11, 2026
c0ee327
Implement show more button for leaderboard
siddharthan-pradeep07 May 12, 2026
2176e21
fix: deslop
EDRipper May 12, 2026
ec514f7
fix [admin]: user funnel
EDRipper May 13, 2026
422e827
Merge pull request #19 from siddharthan-pradeep07/patch-1
PianoMan0 May 13, 2026
9a76235
preferencial: clarify type
EDRipper May 13, 2026
223e0fc
Restore maxRecords and fields filtering on airbridge dupe check
EDRipper May 13, 2026
04ac36a
Merge pull request #18 from ImShyMike/airbridge-dupe-checking
EDRipper May 13, 2026
5c0a7d3
fix: font
EDRipper May 14, 2026
ebdf16d
feat: show position in review queue
EDRipper May 14, 2026
c8d5039
jkkbaOD
EDRipper May 14, 2026
d7ebd54
fix the proxy on the onboarding route
EDRipper May 14, 2026
a1e9c70
feat: merge orders on the backend
EDRipper May 14, 2026
010d774
fix: overflow containment
EDRipper May 27, 2026
6e1e5b0
restore db dumps + admin stuff
EDRipper May 27, 2026
5141f55
feat [ux]: Mobile fix
EDRipper May 27, 2026
a7895ab
unban the unbanned
EDRipper May 27, 2026
b242b7b
fixy smixy
EDRipper May 27, 2026
fb71e26
fraud reviewers can ban and audit
EDRipper May 28, 2026
09e3ca6
and that too
EDRipper May 28, 2026
3dc2ed2
awawawa
EDRipper May 28, 2026
f9f80b9
feat [admin]: one shot super admin audits
EDRipper May 28, 2026
88177fb
show resub logic on one shot audit
EDRipper May 28, 2026
f1767f8
fix: show the correct validation
EDRipper May 28, 2026
556edc8
chore: stop tracking local scripts/
EDRipper Jun 2, 2026
0f4dfea
fix [hackatime]: only ban when the linked account is itself banned/re…
EDRipper Jun 2, 2026
93ad7ab
feat [admin]: Lapse timelapse integration for reviewers
EDRipper Jun 2, 2026
b50e109
feat [admin]: HCB card grant integration
EDRipper Jun 2, 2026
4fec6f0
feat: gather intent on landing
EDRipper Jun 3, 2026
6554c72
feat [hcb]: default card grants to one-time-use + pre-authorization
EDRipper Jun 3, 2026
a11c2b6
chore(deps): npm audit fix — resolve known vulnerabilities
EDRipper Jun 3, 2026
cfa4d4e
chore(deps): bump uuid and typeorm in /backend
dependabot[bot] Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
35 changes: 35 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
node_modules
dist

# Local dev database
docker-compose.dev.yml

# DB dumps
backups/
*.dmp
*.dump
*.sql.gz

# Env
.env
.env.*
!.env.example
!.env.test

# OS
.DS_Store
Thumbs.db

# Editor/tool configs
.vscode/
.claude/
CLAUDE.md
.mcp.json

# Dev-server stdout captures
*-dev.log
*.log

# One-off / local scripts
/scripts/
backend/scripts/
3 changes: 0 additions & 3 deletions .vscode/settings.json

This file was deleted.

138 changes: 138 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<div align="center">
<img src="https://assets.hackclub.com/flag-standalone.svg" width="100" alt="Hack Club flag" />
<h2><a href="https://github.com/hackclub/beest">Beest</a></h2>
<p>The NestJS + SvelteKit + PostgreSQL codebase powering Beest, a hackathon in the Netherlands</p>
</div>

---

# Beest

The Beest codebase is what runs on https://beest.hackclub.com. That website is the You Ship We Ship platform allowing participants to sign in, create and share projects, recieve feedback and earn prizes through the shop.


## Architecture

This is a monorepo with two applications:

| Layer | Stack | Role |
|-------|-------|------|
| **`backend/`** | NestJS 11, TypeORM, PostgreSQL | Single source of truth - all auth, business logic, and data access |
| **`frontend/`** | SvelteKit 2, Svelte 5 | Thin proxy - renders UI, sets cookies, forwards requests to the backend |



## Development Setup

```bash
git clone https://github.com/hackclub/beest
cd beest

# Start the database
docker compose -f docker-compose.dev.yml up -d

# Backend
cd backend
npm install
cp .env.example .env # fill in credentials
npm run migration:run
npm run start:dev # runs on :3001

# Frontend (in a second terminal)
cd frontend
npm install
npm run dev # runs on :5173
```

## Environment Variables

### Backend (`backend/.env`)

```bash
# Airtable
AIRTABLE_API_KEY=
AIRTABLE_BASE_ID=
AIRTABLE_TABLE_NAME=

# Hack Club Auth OAuth
CLIENT_ID=
CLIENT_SECRET=
REDIRECT_URI=http://localhost:5173/oauth/callback

# JWT & encryption
JWT_SECRET=
DB_ENCRYPTION_KEY= # 32-byte hex string for AES-256-GCM

# Hackatime OAuth
HACKATIME_CLIENT_ID=
HACKATIME_CLIENT_SECRET=
HACKATIME_REDIRECT_URI=http://localhost:5173/auth/hackatime/callback
HACKATIME_BASE_URL=https://hackatime.hackclub.com

# Database
DATABASE_URL=postgresql://postgres:password@localhost:5432/postgres

# Slack
SLACK_BOT_TOKEN=
```

### Frontend (`frontend/.env`)

```bash
BACKEND_URL=http://localhost:3001
```

## Deployment

### Docker Compose

```bash
docker compose up --build
```

### Dockerfile (standalone)

Both `backend/` and `frontend/` have their own multi-stage Dockerfiles (Node 22 Alpine). Point `DATABASE_URL` at your PostgreSQL instance and set all backend env vars.

| Service | Internal Port |
|---------|---------------|
| Frontend | 3000 |
| Backend | 3001 |
| PostgreSQL | 5432 |

## API

All endpoints live under the backend at `/api`. Auth-protected routes require a `Bearer` JWT in the `Authorization` header.

| Endpoint | Method | Auth | Purpose |
|----------|--------|------|---------|
| `/api/health` | GET | — | Health check |
| `/api/auth/start` | POST | — | Begin OAuth flow |
| `/api/auth/handle-callback` | POST | — | Complete OAuth, issue tokens |
| `/api/auth/refresh` | POST | — | Rotate refresh token |
| `/api/auth/me` | GET | JWT | Current user claims |
| `/api/auth/logout` | POST | — | Invalidate session |
| `/api/auth/rsvp` | POST | JWT | RSVP using authenticated session |
| `/api/auth/scope` | GET | JWT | Check user permissions |
| `/api/rsvp` | POST | — | Submit an RSVP |
| `/api/hackatime/start` | POST | JWT | Begin Hackatime OAuth |
| `/api/hackatime/callback` | POST | JWT | Complete Hackatime OAuth |
| `/api/hackatime/projects` | GET | JWT | User's Hackatime project names |
| `/api/projects` | GET | JWT | List user's projects |
| `/api/projects` | POST | JWT | Create a project |
| `/api/projects/:id` | PATCH | JWT | Update a project |
| `/api/projects/:id` | DELETE | JWT | Delete a project |
| `/api/projects/hours` | GET | JWT | Hackatime hours breakdown |
| `/api/leaderboard` | GET | JWT | Top 10 users by approved hours |
| `/api/onboarding/status` | GET | JWT | Onboarding step completion |
| `/api/onboarding/two-emails` | POST | JWT | Confirm different Slack email |
| `/api/onboarding/sticker-link` | GET | JWT | User's unique sticker form link |
| `/api/audit-log` | GET | JWT | User's audit log entries |
| `/api/admin/users` | GET | Admin | List all users |
| `/api/admin/users/:id` | GET | Admin | Get specific user |
| `/api/admin/users/:id/ban` | POST | Admin | Ban a user |
| `/api/admin/users/:id/perms` | PATCH | Admin | Update user permissions |

---

Made with &#60;3 by [euan](https://github.com/EDRipper) , give it a ⭐
41 changes: 41 additions & 0 deletions backend/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
AIRTABLE_API_KEY=
AIRTABLE_BASE_ID=
AIRTABLE_TABLE_NAME=
PORT=3001

# Hack Club Auth
CLIENT_ID=
CLIENT_SECRET=
JWT_SECRET=
REDIRECT_URI=http://localhost:5173/oauth/callback

# Hackatime OAuth
HACKATIME_CLIENT_ID=
HACKATIME_CLIENT_SECRET=
HACKATIME_REDIRECT_URI=http://localhost:5173/auth/hackatime/callback
HACKATIME_BASE_URL=https://hackatime.hackclub.com
HACKATIME_ADMIN_API_KEY=

# Database (use container name in prod, public hostname in staging)
DATABASE_URL=postgresql://postgres:password@localhost:5432/postgres
# 32-byte hex key for AES-256-GCM column encryption (generate: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")
DB_ENCRYPTION_KEY=

# Lapse (https://github.com/hackclub/lapse) — program key for server-to-server
# lookups so reviewers can watch a builder's timelapses inline. Leave blank to
# disable; the feature degrades silently when unset.
LAPSE_BASE_URL=https://lapse.hackclub.com
LAPSE_PROGRAM_KEY=

# HCB card grants (https://hcb.hackclub.com) — confidential OAuth app, scopes "read write".
# I'm sorry you can't really recreate these unless you work at HQ. Self host hcb?
HCB_BASE_URL=https://hcb.hackclub.com
HCB_CLIENT_ID=
HCB_CLIENT_SECRET=
HCB_REDIRECT_URI=http://localhost:5173/oauth/hcb/callback
# Public ID or slug of the single org that issues grants
HCB_ORG_ID=
# Suggested grant amount only (NOT a cap): the popup prefills amount as
# pipes_spent * HCB_CENTS_PER_PIPE, but admins can override to any value.
# Cents per pipe — 500 = $5 per pipe. Leave blank to prefill nothing.
HCB_CENTS_PER_PIPE=
4 changes: 4 additions & 0 deletions backend/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"trailingComma": "all"
}
17 changes: 17 additions & 0 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-alpine
RUN apk add --no-cache curl
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/package*.json ./
RUN npm ci --omit=dev
EXPOSE 3001
HEALTHCHECK --interval=10s --timeout=3s --start-period=30s --retries=3 \
CMD curl -f http://localhost:3001/api/health || exit 1
CMD ["node", "dist/main"]
98 changes: 98 additions & 0 deletions backend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<p align="center">
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a>
</p>

[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
[circleci-url]: https://circleci.com/gh/nestjs/nest

<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
<p align="center">
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg" alt="Donate us"/></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow" alt="Follow us on Twitter"></a>
</p>
<!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer)
[![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)-->

## Description

[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.

## Project setup

```bash
$ npm install
```

## Compile and run the project

```bash
# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod
```

## Run tests

```bash
# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov
```

## Deployment

When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information.

If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps:

```bash
$ npm install -g @nestjs/mau
$ mau deploy
```

With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure.

## Resources

Check out a few resources that may come in handy when working with NestJS:

- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework.
- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy).
- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/).
- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks.
- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com).
- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com).
- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs).
- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com).

## Support

Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).

## Stay in touch

- Author - [Kamil Myśliwiec](https://twitter.com/kammysliwiec)
- Website - [https://nestjs.com](https://nestjs.com/)
- Twitter - [@nestframework](https://twitter.com/nestframework)

## License

Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE).
35 changes: 35 additions & 0 deletions backend/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// @ts-check
import eslint from '@eslint/js';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
import globals from 'globals';
import tseslint from 'typescript-eslint';

export default tseslint.config(
{
ignores: ['eslint.config.mjs'],
},
eslint.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
eslintPluginPrettierRecommended,
{
languageOptions: {
globals: {
...globals.node,
...globals.jest,
},
sourceType: 'commonjs',
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
{
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-floating-promises': 'warn',
'@typescript-eslint/no-unsafe-argument': 'warn',
"prettier/prettier": ["error", { endOfLine: "auto" }],
},
},
);
8 changes: 8 additions & 0 deletions backend/nest-cli.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": true
}
}
Loading