A weatherproof box + web app for storing valuables outside of homes and banks. Drop a pin on a map, add a note and a photo, and always know where a stash is.
Generated by FleetCrown — the captain-mode command center for your AI agent fleet.
- Next.js 16 (App Router, Server Components, Server Actions)
- Postgres via Drizzle ORM
- Leaflet + OpenStreetMap for the map picker (no API key needed)
- Tailwind CSS v4
- TypeScript, Vitest
git clone <this-repo-url>
cd HamsterCheek
pnpm install
cp .env.example .env.local # fill in DATABASE_URL
pnpm run db:generate # generate SQL migrations from src/db/schema.ts
pnpm run db:migrate # apply them
pnpm run devOpen http://localhost:3000.
src/
├── app/
│ ├── page.tsx ← home: list of stashes
│ ├── new/page.tsx ← add-a-stash form (map picker + photo upload)
│ ├── stashes/[id]/page.tsx ← stash detail
│ └── actions.ts ← server action: create a stash
├── components/
│ ├── MapPicker.tsx ← click-to-drop-pin Leaflet map
│ └── StashLocationMap.tsx ← read-only map for the detail page
├── db/
│ ├── schema.ts ← the `stashes` table (Drizzle)
│ ├── index.ts ← DB client
│ └── migrate.ts ← runs drizzle/*.sql against DATABASE_URL
└── lib/coordinates.ts ← lat/lng validation + formatting
Uploaded photos are saved to public/uploads/ on disk — fine for a single-server
deployment, not for anything horizontally scaled or ephemeral-filesystem hosted.
- Auth:
pnpm add next-auth@beta+ scope stashes to a user - Move photo storage to an object store (S3, R2) instead of local disk
- Deploy: self-host behind a reverse proxy (build, then run
next starton your server)
Open this project in FleetCrown's Control panel to dispatch AI agents at it.