§1The problem
Interactive content (before/after, maps, 3D, media) usually gets stuck inside apps or social networks. The idea is a simple way to build and share it by link, with no following, likes or algorithm. This is the second version, restarted from scratch after a first one (a social network) was frozen.
§2What I built
- Card viewerHorizontal swipes change card, vertical swipes change groopse (inspired by a news-in-cards format).
- Card types10 of them.
- Editor and accountsEditor to create groopses, accounts and login (including Sign in with Apple).
- SharingLink sharing with preview, light discovery and moderation.
- Feed ruleA simple, explainable vertical feed (no algorithm).
- APIIts own server, separate from the web UI, documented.
- Launch basicsLegal texts and outgoing email configured.
- TestsUnit and end-to-end tests (Vitest and Playwright).
§3The hard parts
5 entries- 01
Gesture rules as a differentiator
Inside a card every touch belongs to the card; changing card only from the bottom strip and changing groopse only from the right strip. You don't leave a card by accident.
- 02
Layered architecture
The server is the only owner of the data; the web has only UI and a BFF and never opens the database; types and validation shared in a common package.
- 03
Ready to switch hosting
Database only through Drizzle, media only through a MediaStore layer, everything via environment variables.
- 04
Production and development apart
Separate ports and databases on the same machine.
- 05
Link preview and opening card
Both work without an account.
§4Result
- plan items done
- 36 / 40
- card types
- 10
In production on my private network since 31 October 2026. 36 of the 40 items in the plan are done. A native app (Expo) is planned for after launch.
§5Stack
- Next.js 16 (App Router)
- React 19
- Tailwind 4
- Zustand
- Hono
- Drizzle ORM
- SQLite
- Better Auth
- Zod 4
- TypeScript
- Vitest
- Playwright
- pm2
- Tailscale