Skip to content

Repository files navigation

Kith

The living map of your real circle. Hard cap of twelve.

See who is free, drop a Pulse, hang when you are nearby.

There is no public feed, no followers, no For You, no ads.

Run it

Needs Node 20+ (LTS).

npm install
npm run db:seed
npm run dev

Open http://127.0.0.1:45621. On a laptop the app sits in a phone frame. /pitch is full-width.

npm run db:seed resets SQLite and rebuilds Riverside Hall. npm run build / npm test also work.

Demo accounts

Password for all three: riverside

Who Email What you see
Maya Chen maya@riverside.kith Default demo. Jordan is nearby. Two unopened Pulses.
Jordan Hale jordan@riverside.kith The other side of the hang and the rooftop Pulse.
Priya Nair priya@riverside.kith Busy in the library. Accepted hang with Wren.

Or tap Enter Riverside Hall — no typing.

From You → Present as, switch Maya / Jordan / Priya without signing out.

Three minutes for an investor

  1. Open /pitch. One breath on the story: twelve is the product, not a feature Meta can bolt onto Reels.
  2. Open the live demoEnter Riverside Hall. The map should already be alive: breathing orbs, amber rings, a voice pip on Jordan.
  3. Tap Jordan’s glowing orb. Rooftop Pulse, dual still, voice. Leave a sticker or a voice. Ring drains because you opened it.
  4. The hang sheet is up — he is in the courtyard. 5 min?.
  5. Center shutter. Capture or upload a Pulse. The lock badge is honest: solid if in-app camera, dashed if file upload. Not C2PA.
  6. Chapters — this week’s filmstrip, letterboxed, date ticks.
  7. Circle — 12/12, tokens you cannot spend because the cap is real. Press a token onto Kai on floor 3; the API refuses.
  8. You → Present as Jordan. See Maya’s new Pulse and the hang you sent.

The metric this is designed to show: a stranger enters a dense circle and posts a Pulse in session one.

What it is

  • MapLibre + OSM/CARTO dark tiles. No Google billing.
  • Pulses persist to public/uploads (swappable storage helper in lib/storage.ts).
  • Presence: free breathes, busy freezes, ghost desaturates and hides exact coordinates.
  • Quiet hours, location precision (off / fuzzy / exact), block, report.
  • Invite tokens are scarce; circle cap is enforced in API and UI.
  • PWA: manifest, icons, theme color, service worker, apple-mobile-web-app.
  • Realtime via SSE (/api/events). Short polling fallback is the same payload on /api/me.

Tests

npm test

Covers circle cap, invite tokens, ghost location privacy, and auth sessions.

Stack

Next.js App Router, TypeScript, Tailwind v4, Prisma, SQLite, MapLibre GL, httpOnly JWT cookies.

GitHub Pages (static demo)

The full Next+Prisma app cannot run on Pages. static-demo/ is a client-only Vite walkthrough of Riverside Hall.

npm run build:pages

Public URL after Pages is enabled: https://amineux.github.io/kith/

Pitch and auth load without MapLibre. The map library is an async chunk, fetched only when the map screen mounts.

Enable: GitHub repo Settings → Pages → Source: GitHub Actions. The workflow .github/workflows/pages.yml deploys on push to main.

Vercel

Set AUTH_SECRET on the project (see .env.example). Leave DATABASE_URL as file:./dev.db for build — npm run build seeds Riverside Hall into prisma/dev.db. On Vercel the app copies that file to /tmp on cold start so SQLite can write; it will not persist across instances. Seed images in public/ are fine.

About

Kith — the living map of your real circle. Cap of 12.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages