Product Manager exploring development with AI. This site tracks my journey building projects with Claude Code.

HankeRadar
AI-powered construction tender matching for Estonian builders. Scrapes Hange.ee + Holt.ee, matches via Haiku 4.5, sends email + Telegram notifications. Desktop responsive with editable profiles and dual notification cadence.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, grammy, Cheerio, Clerk v7, Fraunces + DM Sans + Epilogue + JetBrains Mono fonts
Services: Neon PostgreSQL (companies, trades, listings, matches), Vercel (hosting + serverless), Anthropic Claude Haiku 4.5 (AI match scoring), Resend (email notifications — digest + instant), Telegram Bot API via grammy (@HankeRadarBot — instant alerts), Clerk (auth), ariregister.rik.ee (Business Register lookup), GitHub Actions (scrape cron every 2h + daily digest 7:00 UTC)
How it works: GitHub Actions scrapes Hange.ee (paginated, ~387 listings) and Holt.ee every 2h. Location pre-filter narrows by county neighbor map with Tallinn-specific handling. Haiku 4.5 scores each listing-company pair 1-10 with Estonian reasoning. Score ≥7 triggers instant Telegram + email (Resend). Daily digest collects all unnotified matches. Two cadences: Päevakokkuvõte (daily) or Koheselt (instant). 6-step onboarding with Äriregister auto-fill. Editable trades and location (17 options incl. Tallinn/Tallinn+Harjumaa). SÕEL design system.

Kalkulaator
Estonian calculator aggregator competing with kalkulaator.ee. Three calculators live: vehicle tax, salary/payroll, and VAT. 225 unit tests, exact E2E parity verified. Zero ads, modern UX, dark mode.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Vitest, Plus Jakarta Sans + JetBrains Mono fonts
Services: Vercel (hosting + static generation)
How it works: Pure client-side calculation engines with law-derived formulas reverse-engineered from kalkulaator.ee source code via Codex. Automaks: all vehicle types, engine types, CO₂ modes, annual tax + registration fee with component breakdowns. Palgakalkulaator: bidirectional gross/net/employer-cost conversion, 2022-2026 tax years, sliding tax-free income, pension/unemployment toggles, minimum social tax. Flywheel workflow: Codex extracts source → writes handoff → Claude builds with golden fixture parity gates.

Allekirjoitus.fi V3
Enterprise-focused V3 redesign of the Allekirjoitus.fi e-signature landing page. Complete webmaster handover package with all brand assets, pricing tiers (Enterprise €275/mo + Basic S/M/L), signing method explainers, FAQ, and contact form. Self-contained static HTML — no build step.
Built with: HTML, CSS, JavaScript, Metropolis + Barlow Condensed fonts
Services: Vercel (hosting)
How it works: Self-contained static landing page with all CSS inline and vanilla JS accordion. Brand assets (icons, illustrations, photos, fonts) flattened into a clean directory structure for webmaster handover. HANDOVER.md provides deployment instructions, section map with line references, and asset replacement guide. No framework, no build step — upload files to any static host.

Idea Radar
Personal inspiration discovery dashboard for indie builders. Scrapes 15 sources across 7 platforms, AI-scores projects for feasibility, novelty, and stretch against your builder portfolio. Growth compass — surfaces what you haven't built yet, not more of the same.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, Newsreader + Plus Jakarta Sans fonts
Services: Neon PostgreSQL (discoveries, sources, builder profile, scrape runs), Vercel (hosting), Loop Control Center (manual pipeline scheduling), Federated Tracker Admin (shared with EUDI + Allekirjoitus)
How it works: Three-stage pipeline cloned from EUDI Wallet Tracker: 15 source parsers (Product Hunt, GitHub Search API, Hacker News Show HN, Dev.to, Reddit, Lobsters, Medium) fetch raw items into Neon. Keyword pre-filter drops 60-70% noise. Claude Code in-session scores survivors against a Builder Profile (auto-generated from 41 project STACK.md files) on feasibility/novelty/stretch axes with wildcard picks for maximum growth. Dashboard shows curated cards with composite scores, 'Why this matters' summaries, and Sparked/Pass feedback buttons.

Trump Roast Lab
Satirical Trump-style roast tweet generator. Enter friend details, AI searches 2,808 filtered Trump insult posts for matching patterns, Claude generates an original parody roast rendered as a pixel-perfect X/Twitter tweet card. Export as PNG and share on WhatsApp to prank friends.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, html2canvas, Inter Tight + Newsreader + JetBrains Mono fonts
Services: Anthropic Claude API Opus 4 (roast text generation from dossier + matched archive posts), Vercel (hosting + serverless API)
How it works: User fills a friend dossier (name, details, inside jokes, intensity 1-10). API route keyword-searches 2,808 pre-filtered Trump insult posts bundled as static JSON, feeds top matches + dossier to Claude Opus 4 which generates an original Trump-style roast with nickname, ALL CAPS, and signature signoffs. Output renders as a pixel-perfect X/Twitter tweet card with Trump profile photo, verified badge, and randomized engagement numbers. html2canvas exports the card as PNG (parody label excluded) for WhatsApp/social sharing. Web Share API + platform deep links for direct sharing.

Allekirjoitus Sales Template Tool
Multi-brand sales enablement tool for SK ID Solutions KA managers. Generates branded Enterprise proposals with full FI/EN localization — KB content, pricing labels, service terms, and UI. localStorage autosave on edit, desktop-only guard, dynamic PDF filenames, and print-to-PDF export.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Metropolis + Barlow Condensed fonts
Services: Neon PostgreSQL (created, not yet connected), Vercel (hosting + production deploy)
How it works: Brand-driven multi-tenant architecture with BrandProvider injecting CSS vars and React context. Markdown KB files parsed into structured sections with 6 layer toggles, depth switch, and 4 pricing tiers — all fully localized EN/FI including pricing labels, table headers, and service terms. Onboarding sets language, customer, sender, template, and PDF format. Four templates: Enterprise Offer, Feature Introduction, Pricing Proposal, Price List. Edit mode with contentEditable + deletable rows. localStorage autosave triggers only on actual content edits (not casual browsing) with resume banner on reload. Desktop-only guard blocks mobile editor. Dynamic PDF filename includes brand, template, customer, and date.

DJ Recall
Personal DJ self-learning hub for refreshing transition techniques before gigs. Features 10 technique cards with curated YouTube tutorials, Denon SC Live 4 gear reference with controls cheat sheet, and a live YouTube tutorial feed embedded via iframe from a separate FeedBoard Pro app.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, next-themes, Bebas Neue + JetBrains Mono fonts
Services: Vercel (hosting), FeedBoard Pro (embedded YouTube feed via iframe — separate app providing a curated DJ techniques feed with auto-refresh)
How it works: Static one-pager with 10 DJ transition technique cards, each linked to a curated YouTube tutorial. Gear section references the Denon SC Live 4 with specs, manual links, and a quick controls cheat sheet. A FeedBoard Pro iframe embeds a live, auto-refreshing YouTube feed filtered for DJ content from a separate app. Design system generated via Claude Design, harmonized with the DJ Portfolio site for potential future merging.

Feedboard Pro
RSS feed design studio replacing rss.app ($8-83/mo). Create Google News, YouTube, Reddit, and RSS feeds from keywords or channels. Feed categories group channels by topic (AI & Tech, DJ Techniques) with separate merged views. Public embed route renders any category iframe-safe with dark/light theme and 5-minute auto-refresh — used to power the DJ Recall learning hub.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: Neon PostgreSQL (feeds + feed_categories tables), Vercel (hosting + serverless API routes)
How it works: Custom regex-based RSS/Atom parsers fetch Google News, YouTube, Reddit, and RSS feeds server-side. YouTube @handle resolution via page scraping. Feed categories table groups feeds by topic within source types — sidebar renders 3-level nesting (type → category → feeds). Public embed route at /embed/[type]/[slug] serves a category's merged feed iframe-safe with dark/light theme, is_public toggle, optional share_token, and client-side 5-minute auto-refresh.

TrackID Radar
Spotify DJ playlist update tracker. Monitors 23+ Track IDs playlists for changes using public embed fingerprinting — no Spotify API auth needed. Add playlists by URL, click to open in Spotify, unread-style update badges clear on visit. Daily cron checks for changes.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, Inter + JetBrains Mono fonts
Services: Neon PostgreSQL (playlist registry, fingerprints, click timestamps), Spotify oEmbed API (cover art + title, no auth), Spotify Embed Pages (track list scraping for MD5 fingerprint change detection), Vercel (hosting + daily cron)
How it works: Daily cron fetches each tracked playlist's embed page, parses the track list from HTML, computes an MD5 fingerprint, and compares with the stored hash. Changed fingerprint = playlist updated. Users see green 'Updated' badges that clear when they click 'Open in Spotify' (records click timestamp in DB). Add any Spotify playlist by pasting its URL — oEmbed validates and fetches metadata instantly. Grid and list view toggle, search filter, updated-first sorting.
Allekirjoitus Competitive Intel Tracker
User-triggered competitive intelligence agent for Allekirjoitus.fi. Scrapes 15 tracked competitor pages (Visma Sign, Scrive, Dokobit, Signicat), diffs vs prior snapshots, and surgically updates a living Master Brief through Claude-in-session analysis. Sources managed via the EUDI admin extended with a project switcher; runs reported to the Loop Control Center dashboard.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, Plus Jakarta Sans + Inter fonts
Services: Neon PostgreSQL (separate per-project instance — sources, snapshots, scrape_runs), Cloudflare Browser Rendering API (markdown scraping, 10s rate-limit spacing), EUDI Wallet Tracker admin (federated source management via project switcher), Loop Control Center (manual-mode run dashboard), Claude Code subscription (in-session substantive-vs-cosmetic classification + surgical brief edits), Vercel (public brief viewer)
How it works: User types /allekirjoitus-scan in Claude Code. Worker scrapes active competitor URLs through Cloudflare with rate-limit spacing, sha256-hashes each page, and stores new snapshots only when content changed. Emits a changes JSON that Claude reads in-session to classify each delta (substantive = pricing/features/integrations/certs/eID shifts; cosmetic = wording/nav/timestamps — skipped). Substantive changes produce surgical Edit-tool replacements in brief/MASTER_COMPETITIVE_BRIEF.md scoped to the right theme subsection, plus a prepended Recent Changes log entry with impact. First-ever scan is a silent baseline — no log entries, only a header timestamp. Run result POSTed to LCC. Public viewer renders the brief in Editorial Signature styling with sticky left-rail nav and a Recent Changes card at top.

Sinu Aed
Garden price comparison across 4 Estonian chains — 469 products, 38 brands, 8 categories. Pre-built catalog with watchlist, deals engine, and automated twice-weekly price refresh.
Built with: Next.js 16, TypeScript, Tailwind CSS 4, Upstash Redis, GitHub Actions, Plus Jakarta Sans + Inter fonts
Services: Vercel (hosting + API routes), Upstash Redis (catalog + cache), Klevu Search API (Decora + Ehituse ABC), Algolia (Espak), Bauhof __NUXT__ decoder, GitHub Actions (scheduled catalog builder)
How it works: Background catalog builder searches 38 top brands at all 4 chains (twice weekly via GitHub Actions), matches products by brand+type+size, stores 469 comparable products in Redis. Users get instant results from pre-built catalog. Watchlist feature lets users heart products for a personal price dashboard. Deals engine surfaces biggest cross-chain price spreads.

Thesis Showcase
Interactive web presentation of my TalTech master's thesis on business analytics in FP&A. Qualitative research with 13 expert interviews, benchmarked against 2024–2026 AI developments.
Built with: Next.js 15, TypeScript, Tailwind CSS 4, Newsreader + Inter fonts, Material Symbols
Services: Vercel (hosting), TalTech Digital Library (original thesis)
How it works: Static single-page showcase following a custom TalTech-inspired design system. Thesis content translated to English, interview quotes verified against original Estonian source. Includes a 2024 vs 2026 benchmarking section with verified industry research.

WHO DIS? — The Wall
Branded hub + fullscreen celebrity photo screensaver. Auto-cycling slideshow with B&W portraits, cool facts, and configurable settings. Gateway to the WHO DIS? experience collection.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Space Grotesk + Manrope fonts
Services: Neon PostgreSQL (shared celebrity DB — read-only), Cloudflare R2 (shared photo CDN), Vercel (hosting + serverless API)
How it works: Hub landing page with 3 experience cards. Screensaver fetches all celebrities from Neon, applies user filters (category, era, shuffle), auto-advances with configurable transitions. Settings persisted in localStorage. Keyboard controls for pause, skip, fullscreen.

WHO DIS?
Photo-based celebrity guessing game. 49 iconic celebrities from the 70s–00s hidden behind a 6-square grid. Reveal squares through hints, guess the icon, score points. Neo-Noir design with Vinyl Yellow accents, personal score tracking, and session history.
Built with: Next.js 15, React 19, TypeScript, Tailwind CSS 4, Space Grotesk + Manrope fonts
Services: Neon PostgreSQL (celebrity metadata — names, hints, categories), Cloudflare R2 (photo CDN — 49 B&W celebrity photos), Vercel (hosting + serverless API)
How it works: 5 rounds per session. Each round: 1 random grid square auto-revealed, player guesses for 3 pts. Use Hint 1 reveals 2 more squares + clue (2 pts max). Use Hint 2 reveals all 6 + second clue (1 pt max). Wrong guess = 0 pts, round over. Scores persisted in localStorage with personal best tracking.

E-Seal Prototype
First open-source CSC v2 compliant remote e-sealing service. Full working prototype: 6 API endpoints, TypeScript client SDK (8 modules, 24 tests), live demo with SSE Process X-Ray, PAdES B-T signatures with RFC 3161 timestamps. Hash-only privacy model - documents never leave client infrastructure.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, node-forge, pdf-lib, @signpdf, jose
Services: Neon PostgreSQL (tenants, credentials, audit log, SAD tokens), Sectigo Qualified TSA (RFC 3161 timestamps), Vercel (hosting + serverless API), Swagger UI (interactive API docs)
How it works: Client SDK computes SHA-256 of PDF byte ranges locally (document never leaves client), builds CMS SignedAttributes, then calls CSC v2 API: OAuth2 token, SCAL2 PIN authorization (SAD token), signHash. Server signs with RSA PKCS#1 v1.5. SDK assembles CMS/PKCS#7 SignedData, fetches RFC 3161 timestamp, injects into PDF placeholder. Output: PAdES B-T sealed PDF validated by EU DSS.

E-Seal Developer Portal
Developer portal for CSC v2 remote e-sealing service. OAuth credential management, SCAL2 PIN generation, multi-certificate display (3 seal credentials), and interactive seal playground showing the full 8-step API flow with API/SDK tagging. Educational annotations explain eIDAS regulation at each step.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, bcryptjs, Intersection Observer API
Services: Neon PostgreSQL (tenants, credentials), Sectigo Qualified TSA (RFC 3161 timestamps), Vercel (hosting + serverless API)
How it works: Developer generates OAuth client_secret and SCAL2 PIN, selects a seal credential from 3 pre-provisioned certificates, uploads a PDF, and watches the full CSC v2 sealing flow execute step-by-step with real request/response data. Steps tagged as API (OAuth, SCAL2 authorize, signHash) or Client SDK (PDF prep, CMS assembly, timestamping). Scroll-aware educational annotations explain eIDAS/EN 419 241-1 regulation throughout.

Allekirjoitus.fi v2
Redesigned enterprise landing page for Finnish e-signature platform. Updated hero with brand photography, rewritten platform capabilities with brand book icons, QES signing method added, trusted-by logos, pricing with three tiers, FAQ, and contact section with character illustrations.
Built with: HTML, CSS, JavaScript, Metropolis + Barlow Condensed fonts
Services: Vercel (hosting)
How it works: Static enterprise landing page for Allekirjoitus.fi e-signature service. Brand book assets extracted from PDF (icons, illustrations, photos) used throughout. Three signing methods (Finnish Bank ID, Mobile ID, QES), tiered pricing, and responsive layout.

Smart-ID for Adobe Acrobat Sign v2
Copy-revised landing page for Smart-ID integration with Adobe Acrobat Sign. Tightened benefit copy, restructured sections, replaced generic icons with brand SVGs, updated pricing model, and removed speculative claims. Built as static HTML for handoff to Elementor.
Built with: HTML, Tailwind CSS (CDN), Google Fonts, SVG icons
Services: Vercel (hosting), GitHub (source)
How it works: Static single-page landing site for Smart-ID as an Adobe Acrobat Sign integration. Copy-revised from v1 with restructured sections, updated pricing, brand-aligned teal circle SVG icons, and platform logo integrations. Serves as visual reference for WordPress/Elementor build.
EUDI Wallet Tracker
Automated intelligence monitoring for EU Digital Identity Wallet developments. Three-stage AI pipeline: scrapes 36 sources twice weekly, filters for EUDI relevance, then AI-curates with summaries and scoring. Three public tabs — raw feed, filtered, and curated — with search, category filters, and source filtering.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, Cheerio, rss-parser
Services: Neon PostgreSQL (sources, articles, scrape runs), GitHub Actions (twice-weekly scraper), Anthropic Claude (CSS selector analysis), Loop Control Center (AI loop scheduling), Vercel (hosting), Google Fonts (Fraunces, DM Sans, Epilogue)
How it works: GitHub Actions scrapes 36 RSS and CSS sources twice weekly into Neon. Claude Code filter loop marks articles as EUDI-relevant or irrelevant. Curation loop scores accepted articles 1-10, writes summaries, and assigns categories. Three public dashboard tabs show raw feed, filtered (noise removed), and curated (AI-scored with summaries). SÕEL-inspired design with warm parchment palette.
EUDI Wallet Tracker — Admin
Source management console for the EUDI Wallet Tracker. Add sources by URL with automatic RSS detection or AI-powered CSS selector analysis. Health monitoring (healthy/needs setup/broken/paused), dry-run preview, batch AI selector setup for CSS sources, bulk import with duplicate detection, and scrape run history.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: Neon PostgreSQL (36 sources, config storage), Anthropic Claude Sonnet (one-off CSS selector generation, ~$0.01/source), Vercel (hosting)
How it works: Password-protected admin. Add source flow: paste URL, system auto-detects RSS feed or runs Claude API to generate CSS selectors, shows dry-run preview, activate. Batch setup button runs AI analysis on all unconfigured CSS sources at once. Bulk import accepts JSON from AI research with automatic duplicate URL detection. Health dashboard shows source status with last scrape time, article counts, and error details.

PriceHNTR
Mobile-only drink price comparison app for Estonia. Browse the cheapest drinks across 5 retail chains (Selver, Prisma, Rimi, Barbora, Cityalko) with store, category, and package size filters. Search any product to find the cheapest store. Bilingual EN/ET. First official consumer of the Alkoholiks API.
Built with: React 19, Vite 8, TypeScript, Tailwind CSS 4
Services: Alkoholiks API (OAuth 2.0 SDK, drink prices from 5 stores), Vercel (hosting + API proxy via rewrites)
How it works: Pure client-side SPA consuming the Alkoholiks API via its official TypeScript SDK. OAuth 2.0 Client Credentials flow handled automatically by the SDK. Two views: Best Prices (browse cheapest products across all stores with store/category/size filters, 75 results capped, alcohol-free excluded) and Search (debounced query, results sorted by cheapest price with CHEAPEST badge). Fetches all 5 stores in parallel, filters and sorts client-side. API calls proxied through Vercel rewrites to avoid CORS.

Alkoholiks API
Production-grade REST API for Estonian drink prices. OAuth 2.0 Client Credentials flow, OpenAPI 3.1 spec with Swagger UI, rate limiting (100 req/hr), developer dashboard with credential management and usage stats, and 1,871 products across 5 store chains.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, Swagger UI React
Services: Clerk (developer portal auth), Neon PostgreSQL (consumers, credentials, usage logs), Upstash Redis (OAuth tokens, rate limits, product cache), Vercel (hosting + daily cron)
How it works: API product with full OAuth 2.0 Client Credentials flow — developers register via Clerk, get alk_cid/alk_sec credentials, exchange for 1h Bearer tokens stored in Redis. Four authenticated endpoints serve product data scraped daily from 5 Estonian stores (Selver, Prisma, Rimi, Barbora, Cityalko) and cached in Redis with 24h TTL. Rate limiting via Redis counters with X-RateLimit headers on every response. Developer dashboard shows credentials and live usage stats.

Rental Business Kit — Landing
Customer-facing booking page for Estonian rental businesses. Multi-service support — browse a service carousel, pick one or more services, see combined availability on an interactive calendar, and pay per-service line items via Stripe. First tenant: Mets (ice cream + cotton candy machines).
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, react-day-picker
Services: Neon PostgreSQL (multi-tenant DB), Stripe (checkout + webhook), Resend (transactional emails), Cloudflare R2 (image storage), Vercel (hosting)
How it works: Multi-tenant platform — middleware resolves tenant from hostname, rewrites to /t/[tenant]/ routes. Service carousel displays per-service photos, pricing, and included items. Customer selects services, calendar re-fetches combined availability, booking form collects details, Stripe Checkout shows itemized per-service line items. Webhook confirms booking and sends customer + operator emails via Resend. All content, colors (8 palettes), fonts (8 themes), and sections managed by tenant through admin console.

Rental Business Kit — Console
Tenant management console with 9 sections: bookings, per-service calendar blocking, services manager (add/edit/reorder with photos and pricing), content editor, media uploads (R2), branding (8 color palettes + 8 font themes), FAQ, testimonials, and email customization. Clerk auth with Google sign-in.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: Clerk (Google OAuth, tenant auth), Neon PostgreSQL (tenant-scoped queries), Cloudflare R2 (logo, hero, gallery, service photo uploads), Vercel (hosting)
How it works: Clerk protects /admin routes. requireTenant() resolves the logged-in Clerk user to their tenant record. 9 admin sections: bookings table with detail modal, per-service availability calendar (dropdown selector + block/unblock dates), services CRUD (name, description, price, photos, included items, reorder), content editor with inline section toggles, media manager (R2 upload), 8-palette color picker + 8-font theme selector, FAQ/testimonials CRUD with reorder, and email settings. All changes reflect on landing page immediately via SSR.

GymPal
Fat-loss strength training PWA. Generates tier-based, recency-aware full body workouts with exercise rotation, live timer, swap/shuffle, vault for favorites, and calendar history. Dark mode with lime accent, alternating exercise thumbnails, and iOS-optimized gym UX.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Framer Motion, Drizzle ORM
Services: Clerk (Google auth), Neon PostgreSQL (sessions, exercises, vault, settings), Vercel (hosting)
How it works: 36-exercise catalog with A/B/C tier ratings and 6 movement patterns. Workout generator picks exercises by tier priority and recency from last 2 sessions. Wake Lock API keeps screen on during workouts. Exercise thumbnails crossfade between start/end positions. Weekly progress tracking, streak badges, and session history on calendar with stat cards.

Energiatark
Personal electricity consumption tracker for Estonian homes. Visualizes Estfeed CSV data with monthly bar charts, day-of-week patterns, period comparison, and live NordPool spot prices with cheapest/expensive hour windows.
Built with: React Native, Expo SDK 55, NativeWind v4, react-native-gifted-charts, Expo Router
Services: Elering Dashboard API (NordPool prices via CF Worker proxy), Vercel (static web hosting), Cloudflare Workers (elering-proxy CORS proxy)
How it works: Expo app exported as static web build. Estfeed CSV files are parsed at build time into bundled JSON — drop new CSVs, push to GitHub, Vercel auto-rebuilds. NordPool spot prices fetched live via Cloudflare Worker proxy. Three views: monthly usage with color-coded bars, period comparison with grouped overlay, and hourly price charts with cheapest/expensive 3h windows.

SÕEL
AI-curated daily digest of the best articles on Claude Code, AI tools, and development. Mobile-first PWA that renders scored and categorized articles from Google Sheets, with hero layouts, grid sections, and an archive view.
Built with: React 19, Vite 7, TypeScript, Tailwind CSS 4, React Router 7, vite-plugin-pwa
Services: Google Sheets API v4 (article database + section config), Vercel (hosting), Google Cloud (API key management)
How it works: Frontend-only PWA that reads articles and layout configuration from a public Google Sheet via API key. Articles are scored 1-10 and categorized; Config tab controls which sections appear, their display style (hero/grid/list), and filtering rules. Falls back to mock data when Sheets credentials aren't configured.

Loop Control Center
Dashboard for managing autonomous Claude Code loops — recurring AI tasks like Gmail morning briefs, promotions digests, and CrateDig playlist generation. Toggle loops on/off, monitor run history, view execution logic, and track success/failure rates across projects.
Built with: Next.js 15, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: Neon PostgreSQL (loop configs + run history), Vercel (hosting + API), Claude Code CronCreate (execution engine)
How it works: Web dashboard stores loop configurations (prompts, schedules, enabled state) in Neon DB. Claude Code acts as the execution engine — a /sync-loops skill reads configs from the API and registers CronCreate tasks. Each loop prompt is self-contained with pre-flight checks (respects dashboard toggle), task logic, error handling, and post-run reporting back to the dashboard.

HOOG
Harjumaa event aggregator — all cultural, sport, and community events across 16 Estonian towns in one place. Aggregates from 4 sources: Facebook Events, Kultuurikava API, Fienta API, and Piletitasku (via Cloudflare Worker proxy). Category filtering, date navigation, city pages, and event detail views — all in Estonian.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, Playwright (scraper)
Services: Neon PostgreSQL (1400+ events), Kultuurikava API (public), Fienta API (public), Piletitasku API (CF Worker proxy), Vercel (frontend + cron), Render (Facebook scraper), Cloudflare Workers (piletitasku-proxy)
How it works: Four data sources sync daily via Vercel cron jobs (06:00–07:00 UTC). Kultuurikava and Fienta have public APIs; Piletitasku requires a Cloudflare Worker proxy to bypass bot protection. Facebook Events are scraped by a Playwright-based Docker service on Render. All events are upserted into Neon PostgreSQL with source-prefixed IDs (kk-, fi-, pt-, fb-), mapped to 5 categories and 16 Harju county towns. Frontend serves grid/list views with category, date, and city filtering.

ApplyKit Admin
Two-tier AI config system for ApplyKit. Global settings (model, Estonian language rules, 20 banned cliches, self-check) shared across all modes. Per-mode configs for Cover Letter, CV Tailoring, and Interview Prep — each with system prompts, 3 style presets, output structure, guardrails, and few-shot examples. Playground for testing any config+preset combo with live AI generation.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4
Services: Supabase (auth + PostgreSQL — global_ai_config + admin_ai_configs tables), Anthropic Claude Sonnet (AI generation + playground), Vercel (hosting)
How it works: Admin-only panel (email whitelist). Two-tier config: Global (model, Estonian instructions with Teie-form rules, banned phrases, self-check) + Per-Mode (3 modes: cover_letter, cv_tailoring, interview_prep). Each mode has a system prompt, 3 presets with token/temperature overrides, output structure, guardrails, and few-shot examples. buildSystemPrompt() assembles: base prompt + Estonian + preset modifier + output structure + guardrails + few-shot. Users pick presets on /my-kit, admin controls everything else. Playground tests any feature+preset with systemPromptPreview.

ApplyKit
Full-stack AI job application platform. Upload your CV, paste a job posting, get a tailored CV, cover letter, and interview prep sheet. Two-phase interview preparation: chat with an AI interview coach, then compile a structured prep sheet with likely questions, talking points, and salary negotiation tips.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4
Services: Supabase (auth + PostgreSQL + storage), Vercel (hosting), Anthropic Claude Sonnet (AI tailoring, cover letters, interview prep, career consult, PDF extraction)
How it works: Three CV templates with visual editor, AI-powered job-to-CV matching, smart cover letter generation, interview prep with AI coach (chat freely then compile structured prep sheet), PDF import, job workspace with parsed requirements, TööRadar job search (Töötukassa + CV Keskus), and career consult chat.

CrateDig
Music discovery app for DJs. Upload your library CSV, roll the dice, and let YouTube Music find tracks you've never heard — seeded by songs you already love. Creates playlists automatically on your YouTube Music account.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM, FastAPI, Python
Services: Google OAuth (YouTube + login), Neon PostgreSQL (library + history), ytmusicapi (YouTube Music search + radio discovery), YouTube Data API v3 (playlist creation), Vercel (frontend), Render (backend)
How it works: Upload DJ library CSV, pick dice mode (random or deep), set output size. Client picks seed tracks, FastAPI backend searches YouTube Music for each seed, fetches related tracks via get_watch_playlist(radio=True), deduplicates and filters out library tracks. Preview results with thumbnails, remove unwanted tracks, then push to YouTube Music as a private playlist.

egert_amp
Personal FLAC music player powered by Google Drive. Stream a 500-track lossless collection with album art, metadata display, queue management, liked tracks, dark/light themes, and full transport controls.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: NextAuth (Google OAuth), Google Drive API (file listing + streaming), Neon PostgreSQL (liked tracks), Vercel (hosting)
How it works: Authenticates via Google OAuth, lists FLAC files from a shared Drive folder, streams audio with range requests, extracts ID3 metadata (title, artist, album, art) client-side via music-metadata-browser. Manual queue system, liked tracks persisted to Neon DB, shuffle/repeat modes, seek bar, and dark/light theme toggle.

HindRadar
Estonian grocery price explorer across 5 stores. Compare ~1,588 light alcohol products (beer, cider, long drinks, cocktails) from Selver, Prisma, Rimi, Barbora, and Cityalko with real-time pricing, unit price comparison, brand/country/volume filters, and discount tracking.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4
Services: Selver VueStorefront API, Prisma SSR pages, Rimi SSR pages, Barbora SSR pages, Cityalko SSR pages (all public, no auth), Vercel (hosting with ISR)
How it works: Fetches live product data from 5 Estonian grocery stores in parallel using store-specific extraction (VueStorefront API, __NEXT_DATA__ Apollo cache, HTML parsing, window.b_productList, DOM parsing). Store toggle switches between catalogs, category tabs filter by drink type, filters narrow by brand, country, volume, and price. EAN/GS1 barcode prefixes and explicit text detect country of origin. Static generation with 5-minute ISR revalidation — no database, no auth needed.

QuoteKit
AI-powered quoting and invoicing PWA for Estonian tradespeople. Build quotes from a smart service catalog, generate invoices, share via PDF/WhatsApp/email, with full Estonian legal compliance (VÕS, KMS).
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: Clerk (auth), Neon PostgreSQL (database), Anthropic Claude Sonnet (AI service suggestions), Cloudflare R2 (logo storage), Äriregister API (business registry), Vercel (hosting), next-intl (ET/EN i18n)
How it works: Service catalog as AI foundation — add services manually or let AI suggest from trade type. Build quotes with labor/material line items, convert to invoices, generate PDFs with Puppeteer, share via WhatsApp/email links.

Lead Radar
AI-powered lead generation tool for consultants. Searches Google Places to find Estonian service businesses with mediocre digital presence, scores them on a 0-100 scale, scrapes contact emails, runs PageSpeed audits, and uses Claude AI to analyze each business and generate personalized cold outreach pitches.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: Clerk (auth), Neon PostgreSQL (database), Anthropic Claude Sonnet (AI analysis + pitch generation), Google Places API (business data), PageSpeed Insights API (website audit), Vercel (hosting), next-intl (ET/EN i18n)
How it works: Search Google Places by industry and city. 5-factor lead scoring engine rates businesses by web presence, profile completeness, review health, contactability, and service fit. Save leads, scrape emails from websites, view PageSpeed scores, and generate AI-powered review summaries and sales pitches with one click.

Prop-Radar
Estonian real estate search and analysis tool. Search City24 listings with advanced filters, save properties, and run AI-powered market analysis with a 5-factor scoring engine that ranks deals by price/m², condition, year, floor, and energy cert.
Built with: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle ORM
Services: Clerk (auth), Neon PostgreSQL (database), Anthropic Claude Sonnet (AI analysis), Vercel (hosting), next-intl (ET/EN i18n)
How it works: Search City24 property API with county/municipality/type/price filters. Save listings to personal collection. Run AI analysis across four modes: score report (client-side 5-factor weighted ranking), market overview, price analysis, and side-by-side comparison.

Skrift-CV
Professional CV and cover letter builder with clean Nordic design. Three elegant templates, matching cover letters, and AI-powered PDF import.
Built with: Next.js, React, TypeScript, Tailwind CSS
Services: Clerk (auth), Vercel (hosting), Anthropic Claude (AI PDF extraction)
How it works: Build CVs with customizable templates, fonts, and colors. Import existing PDFs with AI extraction.
Personal Finance Tracker
Smart bank statement analyzer. Upload CSV, auto-categorize transactions with AI pattern matching, and track spending with interactive dashboards.
Built with: Next.js, React, Tailwind CSS, Recharts
Services: Vercel (hosting), Anthropic Claude (AI categorization)
How it works: Upload bank CSV, AI auto-categorizes transactions, interactive spending dashboards.

CV Tailor
AI-powered CV and cover letter tailoring engine. Match your resume to job descriptions and generate personalized applications.
Built with: Next.js, React, TypeScript, Tailwind CSS
Services: Vercel (hosting), Anthropic Claude (AI generation)
How it works: Paste job description + resume, AI generates tailored CV and cover letter.

Pocket Clone
Save articles for later. Minimal link-saving with auto-fetched titles, thumbnails, and AI-powered categorization.
Built with: Vanilla JS, TypeScript, Drizzle ORM
Services: Clerk (auth), Neon PostgreSQL (database), Anthropic Claude 3.5 (AI categorization), Vercel (hosting + serverless)
How it works: Links saved instantly, metadata fetched in background via CORS proxy. AI auto-categorizes into user buckets.


