01 — 2026

entrepreNewer

A living journal for business ideas — AI scores each one, then keeps re-scoring as the news changes.

Role
Solo — design, build, ship
Year
2026
Stack
TypeScript · Fastify 5 · Postgres + pgvector (Supabase) · Raspberry Pi 5 · Cloudflare Tunnel · Prisma 6 · Expo / React Native · GitHub Actions
Links
LiveSource on request
entrepreNewer landing page — the headline “Turn scattered ideas into a ranked, actionable portfolio” beside a phone showing scored idea cards

What it is

entrepreNewer is a notebook for half-formed business ideas that refuses to let them go stale. You capture an idea by voice or text; the AI distills it into a card, fleshes it out, and scores it 0–100 with sources. From then on the system watches the news, links relevant articles back to your active cards, and recomputes the score as the world changes. Every score is written to a history table, so an idea's standing is a trend you can watch, not a one-time verdict.

I built it end to end: the Fastify API, the Prisma schema on Postgres + pgvector, the Expo app that runs on iOS, Android and the web from one codebase, and the production setup that serves it. The web app is a static export on Vercel; the API runs on a Raspberry Pi 5 in my room, published through a Cloudflare Tunnel, with deploys driven by a GitHub Actions runner that lives on the Pi.

How it's built

  • Monorepo: apps/server (Fastify 5 + Prisma 6), apps/app (Expo SDK 56 with Expo Router), packages/shared (the typed API client the app uses).
  • Auth is Supabase. The API verifies each JWT locally against the project's JWKS (ES256 via jose) — no round-trip to Supabase per request — and provisions the user row the first time it sees a new subject.
  • Semantic matching uses OpenAI text-embedding-3-small vectors in pgvector with HNSW cosine indexes; Claude Sonnet handles coaching and scoring, Haiku handles nudges.
  • News ingestion sits behind a NewsSource interface: keyless RSS by default (curated feeds plus Google News queries derived from each card's sector and tags), NewsData.io optional.
  • Production: Expo web static export → Vercel. API → Raspberry Pi 5 behind a Cloudflare Tunnel. A push to main runs tests, build, prisma migrate deploy, restart and a health poll on the Pi's self-hosted runner; a failed step leaves the previous build running.

Highlights

  1. 01Persistence is the product: every AI score lands in a history table and the matching loop re-runs on a schedule, so a score is a trend rather than a snapshot.
  2. 02Hardened for a public API: explicit CORS allowlist, 100 requests/min per IP globally with a stricter 10/min bucket on AI routes, job endpoints gated by a token, and dev-only auth seams hard-disabled in production.
  3. 03Diagnosed intermittent 530s on the live API down to campus Wi-Fi silently dropping UDP — cloudflared's QUIC transport and Tailscale's WireGuard died at the same instant — and fixed it by pinning the tunnel to HTTP/2 over TCP.
  4. 04Prisma can't run migrations against Supabase's managed extensions, so the schema evolves through diff-generated SQL migrations reviewed by hand; the vector indexes Prisma can't express live in their own SQL file.
  5. 05143 commits over three months, with the specs, plans and ops runbooks in the repo next to the code.

What I'd do next

  • Turn on Google sign-in — the client code exists; the provider isn't enabled yet.
  • Move scheduling from node-cron to a queue so re-scoring survives restarts.
  • Push notifications — email digests ship today; push is stubbed behind a flag.

More screens

The features section of the entrepreNewer landing page
The entrepreNewer landing page on a phone