[{"data":1,"prerenderedAt":1026},["ShallowReactive",2],{"project-racecast":3,"siblings-racecast":119},{"id":4,"title":5,"body":6,"date":93,"description":94,"extension":95,"featured":96,"githubUrl":97,"liveUrl":98,"meta":99,"navigation":100,"path":101,"role":102,"screenshots":103,"seo":104,"status":105,"stem":106,"techs":107,"thumbnail":97,"__hash__":118},"projects\u002Fprojects\u002Fracecast.md","RaceCast",{"type":7,"value":8,"toc":86},"minimark",[9,14,18,47,51,54,57,61],[10,11,13],"h2",{"id":12},"overview","Overview",[15,16,17],"p",{},"Four LLMs — Claude, GPT, Gemini, and Grok — compete to predict every Formula 1 race of the season. Pre-race picks are scored against real results and roll into a season-long leaderboard, settling the \"which model is smartest\" debate race by race.",[19,20,21,29,35,41],"ul",{},[22,23,24,28],"li",{},[25,26,27],"strong",{},"Pre-race predictions"," from 4 models with distinct prompts",[22,30,31,34],{},[25,32,33],{},"Side-by-side comparison"," of each model's picks",[22,36,37,40],{},[25,38,39],{},"Accuracy scoring"," — winner, podium, top 10, fastest lap",[22,42,43,46],{},[25,44,45],{},"Live race dashboard"," — weather, tires, pit stops from OpenF1",[10,48,50],{"id":49},"what-it-solves","What it solves",[15,52,53],{},"Every time a new LLM drops, the internet argues over which one is actually the smartest. Benchmarks are abstract and hard to feel. Real-world prediction is the opposite — either the model called the podium right or it didn't.",[15,55,56],{},"RaceCast turns four models loose on every Formula 1 race of the season. Each one commits picks before the lights go out, the results score them automatically, and the leaderboard grows in public. No curated test set, no cherry-picking — just 24 races of being wrong or right.",[10,58,60],{"id":59},"highlights","Highlights",[19,62,63,69,75,80],{},[22,64,65,68],{},[25,66,67],{},"Four models"," with distinct prompting strategies predicting side by side",[22,70,71,74],{},[25,72,73],{},"Consensus indicator"," flags when all four agree (and when they split)",[22,76,77,79],{},[25,78,45],{}," pulling weather, tires, and pit stops from OpenF1",[22,81,82,85],{},[25,83,84],{},"Season + championship leaderboards"," that update themselves",{"title":87,"searchDepth":88,"depth":88,"links":89},"",2,[90,91,92],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-02-10","Four AI models — Claude, GPT, Gemini, and Grok — compete to predict every Formula 1 race of the season. Scores update against real results on a season-long leaderboard.","md",false,null,"https:\u002F\u002Fracecast.app",{},true,"\u002Fprojects\u002Fracecast","Solo full-stack",[],{"title":5,"description":94},"Shipping","projects\u002Fracecast",[108,109,110,111,112,113,114,115,116,117],"TanStack Start","React","TypeScript","oRPC","Drizzle ORM","Postgres","Vercel AI SDK","OpenRouter","Tailwind","Radix UI","jrjZnX6x-S-bZDFAFvynRcRuf4ea08AjUtXD_M_mCBs",[120,239,335,429,515,608,700,788,876,936],{"id":121,"title":122,"body":123,"date":222,"description":223,"extension":95,"featured":96,"githubUrl":97,"liveUrl":224,"meta":225,"navigation":100,"path":226,"role":102,"screenshots":227,"seo":228,"status":105,"stem":229,"techs":230,"thumbnail":97,"__hash__":238},"projects\u002Fprojects\u002Ffootball-inspector.md","Fotbalový Inspektor",{"type":7,"value":124,"toc":217},[125,127,130,167,169,172,175,177],[10,126,13],{"id":12},[15,128,129],{},"A match-day journal for Czech amateur football. Inspectors rate each fixture across three categories — food (klobása & beer), atmoška (crowd, chants, quotes), and the 47th-minute klenot — then write a short post-match note. Every inspection rolls into a public feed, a personal diary, and a team directory that doubles as institutional memory for local football culture.",[19,131,132,138,144,155,161],{},[22,133,134,137],{},[25,135,136],{},"Three-axis rating"," — food, atmosphere, standout moment (0.5–5 stars)",[22,139,140,143],{},[25,141,142],{},"Match metadata"," — home\u002Faway teams, score, league, kraj",[22,145,146,149,150,154],{},[25,147,148],{},"Personal diary"," at ",[151,152,153],"code",{},"\u002Fme"," plus a public chronological feed",[22,156,157,160],{},[25,158,159],{},"Team directory"," scraped from official league sources (regional through fourth division)",[22,162,163,166],{},[25,164,165],{},"Google sign-in"," via better-auth",[10,168,50],{"id":49},[15,170,171],{},"Official match statistics flatten everything that makes amateur football worth showing up for — the queue at the bufet, the one guy with the trumpet, the goal nobody filmed. Fotbalový Inspektor is the opposite of a stats sheet: a subjective, on-the-spot record of what the match actually felt like, written in the ten minutes after the final whistle.",[15,173,174],{},"Each inspection is short by design. Three star ratings, a couple sentences, and a result. The aggregate is a living archive of Czech grassroots football — searchable by team, by kraj, by inspector.",[10,176,60],{"id":59},[19,178,179,185,191,205,211],{},[22,180,181,184],{},[25,182,183],{},"SvelteKit + Svelte 5 runes"," with tRPC mutations replacing form actions for inspection edits and deletes",[22,186,187,190],{},[25,188,189],{},"PostgreSQL + Drizzle ORM"," schema covering leagues, teams, inspections, photos, and better-auth tables",[22,192,193,196,197,200,201,204],{},[25,194,195],{},"Cheerio + Playwright scrapers"," that seed the team directory from official league sites (",[151,198,199],{},"fetch-league",", ",[151,202,203],{},"fetch-kraj",")",[22,206,207,210],{},[25,208,209],{},"Tailwind 4 design system"," built on cream paper, pitch green, and amber tokens — feels like a programme, not an app",[22,212,213,216],{},[25,214,215],{},"sveltekit-superforms + Zod"," for type-safe inspection submission flows",{"title":87,"searchDepth":88,"depth":88,"links":218},[219,220,221],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2026-05-07","Match-day journal for Czech amateur football. Rate the klobása, the atmoška, and the 47th-minute klenot — keep every inspection forever.","https:\u002F\u002Ffootball-inspector.vercel.app",{},"\u002Fprojects\u002Ffootball-inspector",[],{"title":122,"description":223},"projects\u002Ffootball-inspector",[231,232,110,233,234,112,113,235,236,116,237],"SvelteKit","Svelte 5","tRPC","TanStack Query","better-auth","Zod","bits-ui","sID_4MlRLmgNBTO7yhoIfJSlGfTEFuD_GIcxHa55r3k",{"id":240,"title":241,"body":242,"date":314,"description":315,"extension":95,"featured":96,"githubUrl":97,"liveUrl":316,"meta":317,"navigation":100,"path":318,"role":102,"screenshots":319,"seo":320,"status":321,"stem":322,"techs":323,"thumbnail":97,"__hash__":334},"projects\u002Fprojects\u002Fsonuslab.md","Sonuslab",{"type":7,"value":243,"toc":309},[244,246,249,275,277,280,283,285],[10,245,13],{"id":12},[15,247,248],{},"A tighter workflow on top of the ElevenLabs API. Generate voices, inspect waveforms, and organise a personal voice library in a single interface — closer to a DAW than a CRUD app.",[19,250,251,257,263,269],{},[22,252,253,256],{},[25,254,255],{},"Voice generation"," via the ElevenLabs SDK",[22,258,259,262],{},[25,260,261],{},"Waveform inspection"," with wavesurfer.js — regions, playback, crop",[22,264,265,268],{},[25,266,267],{},"Voice library"," — tag, filter, re-run",[22,270,271,274],{},[25,272,273],{},"Project grouping"," for bundled sessions",[10,276,50],{"id":49},[15,278,279],{},"ElevenLabs is great at generating voices; it's less great at living with them. The default dashboard treats every clip like a one-off, so the second you want to compare two takes, build a library across projects, or re-run an old generation with a new voice, the workflow falls apart.",[15,281,282],{},"Sonuslab wraps the API with an interface shaped around the actual job. Clips get tags, projects group related sessions, and waveforms are inspectable instead of hidden behind a play button — the experience feels closer to a DAW than to a dashboard.",[10,284,60],{"id":59},[19,286,287,292,298,303],{},[22,288,289,291],{},[25,290,261],{}," with regions, playback, and crop",[22,293,294,297],{},[25,295,296],{},"Tagged library"," for filtering and re-using past generations",[22,299,300,302],{},[25,301,273],{}," so clips stay organised per session",[22,304,305,308],{},[25,306,307],{},"Instant feedback"," — optimistic UI makes generation feel snappy",{"title":87,"searchDepth":88,"depth":88,"links":310},[311,312,313],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-08-18","ElevenLabs voice studio. Generate clips, inspect waveforms, and curate a personal voice library — all in one workspace.","https:\u002F\u002Fsonuslab.dev",{},"\u002Fprojects\u002Fsonuslab",[],{"title":241,"description":315},"Active","projects\u002Fsonuslab",[324,325,326,110,327,328,233,235,329,330,112,331,116,332,333],"Turborepo","Nuxt 3","Vue 3","Hono","Bun","ElevenLabs SDK","wavesurfer.js","Object Storage","reka-ui","motion-v","Ihw29FbCyYT7dQMxSTSPQWL6Zjs3HoUqPVaky2fgdCg",{"id":336,"title":337,"body":338,"date":415,"description":416,"extension":95,"featured":100,"githubUrl":97,"liveUrl":417,"meta":418,"navigation":100,"path":419,"role":102,"screenshots":420,"seo":421,"status":422,"stem":423,"techs":424,"thumbnail":97,"__hash__":428},"projects\u002Fprojects\u002Fpdfmod.md","PDFmod",{"type":7,"value":339,"toc":410},[340,342,345,374,376,379,382,384],[10,341,13],{"id":12},[15,343,344],{},"A browser-first PDF toolbox that keeps the heavy lifting local. Merge, split, rotate, compress, and extract — without handing sensitive documents to an unknown upload server.",[19,346,347,353,359,365],{},[22,348,349,352],{},[25,350,351],{},"Merge \u002F split"," PDFs with drag-to-reorder",[22,354,355,358],{},[25,356,357],{},"Rotate and delete pages"," visually",[22,360,361,364],{},[25,362,363],{},"Compress"," large PDFs before sending",[22,366,367,370,371],{},[25,368,369],{},"Extract text"," and ",[25,372,373],{},"convert pages to images",[10,375,50],{"id":49},[15,377,378],{},"Every \"free online PDF tool\" is a gamble. The lucky outcome is ads; the unlucky one is your document quietly uploaded to a server nobody can name. For anything with a signature or a contract clause, that's a dealbreaker — and most people still reach for those tools because the alternatives cost money or require a desktop install.",[15,380,381],{},"PDFmod runs as much of the work in the browser as possible. Merging, splitting, rotating, and extracting happen on your machine. Only the operations that genuinely need a server route through one, and even then the flow stays clean and account-gated.",[10,383,60],{"id":59},[19,385,386,392,398,404],{},[22,387,388,391],{},[25,389,390],{},"Browser-first processing"," keeps sensitive docs local",[22,393,394,397],{},[25,395,396],{},"Drag-to-reorder"," pages across merged files",[22,399,400,403],{},[25,401,402],{},"Visual rotate + delete"," — the UI matches what you're picturing",[22,405,406,409],{},[25,407,408],{},"Text extract + image export"," for quick, no-fuss conversions",{"title":87,"searchDepth":88,"depth":88,"links":411},[412,413,414],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-07-01","Browser-based PDF toolbox. Merge, split, reorder, compress, convert, and extract pages locally — your files never leave the tab.","https:\u002F\u002Fpdf-mod.com",{},"\u002Fprojects\u002Fpdfmod",[],{"title":337,"description":416},"Beta","projects\u002Fpdfmod",[325,326,110,111,112,113,235,425,426,427,116,332],"UploadThing","pdf-lib","pdfjs-dist","wZ6_ZzLqxPp9MUEAyQBdJbjsT-ddvREf_oRN2jxjiho",{"id":430,"title":431,"body":432,"date":504,"description":505,"extension":95,"featured":96,"githubUrl":97,"liveUrl":506,"meta":507,"navigation":100,"path":508,"role":102,"screenshots":509,"seo":510,"status":105,"stem":511,"techs":512,"thumbnail":97,"__hash__":514},"projects\u002Fprojects\u002Fshipnit.md","Shipnit",{"type":7,"value":433,"toc":499},[434,436,439,465,467,470,473,475],[10,435,13],{"id":12},[15,437,438],{},"A changelog SaaS that drafts the first version for you. Connects to a GitHub repo, turns merged PRs and releases into entries via AI, and publishes them on a branded page customers can subscribe to.",[19,440,441,447,453,459],{},[22,442,443,446],{},[25,444,445],{},"Public changelog pages"," at your own slug",[22,448,449,452],{},[25,450,451],{},"GitHub webhooks"," auto-draft from PRs, releases, and pushes",[22,454,455,458],{},[25,456,457],{},"AI summaries"," turn raw diffs into user-facing copy",[22,460,461,464],{},[25,462,463],{},"Review + edit UI"," before anything goes live",[10,466,50],{"id":49},[15,468,469],{},"Keeping a changelog current is the easiest thing on a roadmap to drop. By Friday the week's PRs are fuzzy, the context is gone, and writing \"we fixed a few bugs\" feels worse than writing nothing. Most products just… stop, and customers never hear what's new.",[15,471,472],{},"Shipnit does the first pass for you. It reads merged PRs and releases, drafts user-facing summaries, and drops them into a review UI. The work stops being \"write a changelog\" and starts being \"approve one\" — a much smaller ask on a Friday afternoon.",[10,474,60],{"id":59},[19,476,477,483,488,493],{},[22,478,479,482],{},[25,480,481],{},"GitHub webhook auto-drafts"," from PRs, releases, and pushes",[22,484,485,487],{},[25,486,457],{}," tuned for end-user copy, not commit messages",[22,489,490,492],{},[25,491,463],{}," so nothing publishes uninspected",[22,494,495,498],{},[25,496,497],{},"Subscriber notifications"," when a new entry goes live",{"title":87,"searchDepth":88,"depth":88,"links":500},[501,502,503],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-06-15","Changelog autopilot for GitHub. Reads merged PRs and releases, drafts polished entries with AI, and publishes them to a branded page.","https:\u002F\u002Fshipnit.dev",{},"\u002Fprojects\u002Fshipnit",[],{"title":431,"description":505},"projects\u002Fshipnit",[513,232,110,233,112,113,235,115,116,237],"SvelteKit 5","KF0l0gZQi3ujsSx17wKGfT098jgrw0cvQkFzqcjuESE",{"id":516,"title":517,"body":518,"date":592,"description":593,"extension":95,"featured":96,"githubUrl":97,"liveUrl":594,"meta":595,"navigation":100,"path":596,"role":102,"screenshots":597,"seo":598,"status":599,"stem":600,"techs":601,"thumbnail":97,"__hash__":607},"projects\u002Fprojects\u002Fanimal-match.md","Animal Match",{"type":7,"value":519,"toc":587},[520,522,525,551,553,556,559,561],[10,521,13],{"id":12},[15,523,524],{},"A text-first guessing game that feels like chatting with someone who actually wants you to figure it out. The AI picks an animal and paces its hints, turning 20 Questions into a conversation with rhythm.",[19,526,527,533,539,545],{},[22,528,529,532],{},[25,530,531],{},"Pick-an-animal sessions"," — AI selects, you guess through chat",[22,534,535,538],{},[25,536,537],{},"Progressive hints"," that escalate as you stall",[22,540,541,544],{},[25,542,543],{},"Animal facts"," surfaced mid-game to teach while you play",[22,546,547,550],{},[25,548,549],{},"Session stats"," — accuracy, attempts, streaks",[10,552,50],{"id":49},[15,554,555],{},"Classic 20 Questions is a rigid yes\u002Fno format that breaks the second anyone wants to riff on a guess. Most AI-driven versions swing the other way — they either spoil the answer in the first hint or stonewall you until it stops being fun.",[15,557,558],{},"Animal Match sits between the two. The AI plays host instead of opponent: it nudges you forward when you stall, stays quiet when you're close, and drops a fact every so often so you leave knowing something even if you lose.",[10,560,60],{"id":59},[19,562,563,569,575,581],{},[22,564,565,568],{},[25,566,567],{},"Hint pacing"," that escalates with how many guesses have passed",[22,570,571,574],{},[25,572,573],{},"Mid-game facts"," so every round teaches something",[22,576,577,580],{},[25,578,579],{},"Accuracy + streak tracking"," across sessions",[22,582,583,586],{},[25,584,585],{},"Multi-language UI"," with dark and light modes",{"title":87,"searchDepth":88,"depth":88,"links":588},[589,590,591],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-06-05","20 Questions with an LLM dungeon-master. The AI picks an animal; you ask, deduce, and guess your way to it through chat, hints, and facts.","https:\u002F\u002Fanimal-match.com",{},"\u002Fprojects\u002Fanimal-match",[],{"title":517,"description":593},"Live","projects\u002Fanimal-match",[602,603,110,604,115,114,605,606,117,116],"Next.js 15","React 19","Convex","next-intl","Zustand","ZlWo_-e4-yBwNWVn8ELd7k4R1fPbXJGACZbSWYCnO_A",{"id":609,"title":610,"body":611,"date":688,"description":689,"extension":95,"featured":100,"githubUrl":97,"liveUrl":690,"meta":691,"navigation":100,"path":692,"role":102,"screenshots":693,"seo":694,"status":321,"stem":695,"techs":696,"thumbnail":97,"__hash__":699},"projects\u002Fprojects\u002Fdecibel-demon.md","Decibel Demon",{"type":7,"value":612,"toc":683},[613,615,618,647,649,652,655,657],[10,614,13],{"id":12},[15,616,617],{},"A one-command voice clipper for Discord. A slash command grabs the last N seconds from a voice channel, saves per-user tracks, and exposes them on a searchable web gallery — so a legendary quote in chat doesn't disappear the moment it lands.",[19,619,620,626,635,641],{},[22,621,622,625],{},[25,623,624],{},"Record on demand"," via slash command",[22,627,628,631,632],{},[25,629,630],{},"Per-user tracks"," isolated with ",[151,633,634],{},"@discordjs\u002Fvoice",[22,636,637,640],{},[25,638,639],{},"Web gallery"," — browse, play in-page, share by link",[22,642,643,646],{},[25,644,645],{},"Per-guild archive"," with quick rename \u002F delete \u002F share",[10,648,50],{"id":49},[15,650,651],{},"On a voice call, someone delivers the line of the year and it's gone before anyone thinks to hit record. Recording the whole session just to catch one moment is overkill, and nobody ever remembers to press record in time anyway.",[15,653,654],{},"Decibel Demon flips the model: record nothing, then rewind. A slash command tells the bot to save the last N seconds, and a web gallery makes those clips easy to find, share, and replay weeks later — outside Discord, without dragging friends into a new app.",[10,656,60],{"id":59},[19,658,659,665,671,677],{},[22,660,661,664],{},[25,662,663],{},"After-the-fact capture"," — no anticipation required",[22,666,667,670],{},[25,668,669],{},"Per-user track isolation"," so one speaker can be extracted from the mix",[22,672,673,676],{},[25,674,675],{},"Per-server archives"," with share-by-link on every clip",[22,678,679,682],{},[25,680,681],{},"Web playback"," — no Discord client needed to listen back",{"title":87,"searchDepth":88,"depth":88,"links":684},[685,686,687],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-05-01","Discord voice-clip recorder. Captures the last few minutes of a voice channel on command, then publishes the clip to a shareable web gallery.","https:\u002F\u002Fdecibel-demon.com",{},"\u002Fprojects\u002Fdecibel-demon",[],{"title":610,"description":689},"projects\u002Fdecibel-demon",[324,697,110,698,634,112,113,331,116],"Next.js","discord.js","Fisy0-D07MmjAo_MIt2aZRr4emZLApBvVZ4JEd5YTBc",{"id":701,"title":702,"body":703,"date":775,"description":776,"extension":95,"featured":96,"githubUrl":97,"liveUrl":777,"meta":778,"navigation":100,"path":779,"role":102,"screenshots":780,"seo":781,"status":105,"stem":782,"techs":783,"thumbnail":97,"__hash__":787},"projects\u002Fprojects\u002Fquikpic.md","QuikPic",{"type":7,"value":704,"toc":770},[705,707,710,736,738,741,744,746],[10,706,13],{"id":12},[15,708,709],{},"Screenshot capture, polish, and share in a single keystroke. A browser extension grabs the shot, a canvas editor styles it, and a cloud gallery keeps it — no Paint detour, no sketchy upload host.",[19,711,712,718,724,730],{},[22,713,714,717],{},[25,715,716],{},"Area \u002F full-page capture"," via extension hotkey",[22,719,720,723],{},[25,721,722],{},"Canvas editor"," — gradient backgrounds, rounded corners, shadows, window chrome",[22,725,726,729],{},[25,727,728],{},"Blur brush"," for redacting sensitive content",[22,731,732,735],{},[25,733,734],{},"Day-grouped gallery"," with clipboard copy and batch delete",[10,737,50],{"id":49},[15,739,740],{},"Taking a presentable screenshot is a five-tool workflow for something that should be one keystroke. Capture in one app, crop in another, add a background in a third, upload to a host, copy the link, hope nobody notices the timestamp watermark. Most people skip the styling step entirely and ship the raw PNG, which looks rough.",[15,742,743],{},"QuikPic collapses the whole loop into a single extension. A hotkey takes the shot, the editor opens already knowing how to make it look good, and share happens from the same page — clipboard or public link, your choice.",[10,745,60],{"id":59},[19,747,748,754,760,765],{},[22,749,750,753],{},[25,751,752],{},"Hotkey capture"," straight from the browser, no separate app",[22,755,756,759],{},[25,757,758],{},"Auto-gradient backgrounds"," picked from the screenshot's own colors",[22,761,762,764],{},[25,763,728],{}," for redacting tokens and personal data",[22,766,767,769],{},[25,768,734],{}," with batch delete for cleanup",{"title":87,"searchDepth":88,"depth":88,"links":771},[772,773,774],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-04-12","Screenshot pipeline in three parts: browser extension to capture, canvas editor to style, cloud gallery to share.","https:\u002F\u002Fquikpic.dev",{},"\u002Fprojects\u002Fquikpic",[],{"title":702,"description":776},"projects\u002Fquikpic",[324,109,784,110,327,328,785,116,786],"TanStack Router","Cloudflare R2","Chrome Extension API","bqEhAhDKfZcbdw5owyv1Ihk6r7wz86TsbejKx25DiNE",{"id":789,"title":790,"body":791,"date":864,"description":865,"extension":95,"featured":100,"githubUrl":97,"liveUrl":866,"meta":867,"navigation":100,"path":868,"role":102,"screenshots":869,"seo":870,"status":105,"stem":871,"techs":872,"thumbnail":97,"__hash__":875},"projects\u002Fprojects\u002Ftipovacka.md","Tipovacka",{"type":7,"value":792,"toc":859},[793,795,798,824,826,829,832,834],[10,794,13],{"id":12},[15,796,797],{},"A tournament prediction pool for groups of friends. Create a tournament from a CSV or by hand, invite players, collect predictions before kickoff, and let a real-time leaderboard settle scores — no more arguments over spreadsheets.",[19,799,800,806,812,818],{},[22,801,802,805],{},[25,803,804],{},"Create tournaments"," by CSV or manual entry",[22,807,808,811],{},[25,809,810],{},"Invite players"," via share link, predictions locked before kickoff",[22,813,814,817],{},[25,815,816],{},"Drag-to-rank"," finals and knockouts",[22,819,820,823],{},[25,821,822],{},"Live leaderboard"," across multiple tournaments",[10,825,50],{"id":49},[15,827,828],{},"Every friend group's World Cup pool ends the same way: a messy spreadsheet nobody trusts, a group chat full of conflicting score rules, and one person insisting their prediction for the final absolutely counted. By the knockouts half the players have stopped submitting anyway.",[15,830,831],{},"Tipovacka makes the whole thing a website. Everyone submits picks before kickoff, the leaderboard updates itself as real results come in, and nobody has to remember what the fastest-lap rule was supposed to be. The group argues less and watches more.",[10,833,60],{"id":59},[19,835,836,842,848,853],{},[22,837,838,841],{},[25,839,840],{},"CSV ingest"," — paste a fixture list and you've got a tournament",[22,843,844,847],{},[25,845,846],{},"Invite by link"," with predictions locked the moment a match starts",[22,849,850,852],{},[25,851,816],{}," for knockouts and finals",[22,854,855,858],{},[25,856,857],{},"Multi-tournament support"," so several pools can run side by side",{"title":87,"searchDepth":88,"depth":88,"links":860},[861,862,863],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2025-03-01","Prediction pool for sports tournaments. Players forecast match outcomes, drag their picks into order, and battle live on the leaderboard.","https:\u002F\u002Fmoje-tipovacka.cz",{},"\u002Fprojects\u002Ftipovacka",[],{"title":790,"description":865},"projects\u002Ftipovacka",[873,326,110,233,112,113,116,874,236],"Nuxt 4","shadcn-nuxt","IVz_vcZN2qO-DWuYegl53DAXv-HpHFP94lvr_Ky7T5s",{"id":4,"title":5,"body":877,"date":93,"description":94,"extension":95,"featured":96,"githubUrl":97,"liveUrl":98,"meta":932,"navigation":100,"path":101,"role":102,"screenshots":933,"seo":934,"status":105,"stem":106,"techs":935,"thumbnail":97,"__hash__":118},{"type":7,"value":878,"toc":927},[879,881,883,901,903,905,907,909],[10,880,13],{"id":12},[15,882,17],{},[19,884,885,889,893,897],{},[22,886,887,28],{},[25,888,27],{},[22,890,891,34],{},[25,892,33],{},[22,894,895,40],{},[25,896,39],{},[22,898,899,46],{},[25,900,45],{},[10,902,50],{"id":49},[15,904,53],{},[15,906,56],{},[10,908,60],{"id":59},[19,910,911,915,919,923],{},[22,912,913,68],{},[25,914,67],{},[22,916,917,74],{},[25,918,73],{},[22,920,921,79],{},[25,922,45],{},[22,924,925,85],{},[25,926,84],{},{"title":87,"searchDepth":88,"depth":88,"links":928},[929,930,931],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},{},[],{"title":5,"description":94},[108,109,110,111,112,113,114,115,116,117],{"id":937,"title":938,"body":939,"date":1013,"description":1014,"extension":95,"featured":96,"githubUrl":97,"liveUrl":1015,"meta":1016,"navigation":100,"path":1017,"role":102,"screenshots":1018,"seo":1019,"status":105,"stem":1020,"techs":1021,"thumbnail":97,"__hash__":1025},"projects\u002Fprojects\u002Fsmartzquiz.md","SmartzQuiz",{"type":7,"value":940,"toc":1008},[941,943,946,972,974,977,980,982],[10,942,13],{"id":12},[15,944,945],{},"AI-generated flashcards with real spaced repetition. Upload a PDF or paste text, drill the generated cards in three study modes, and retain them through a Leitner 5-box system that actually schedules reviews.",[19,947,948,954,960,966],{},[22,949,950,953],{},[25,951,952],{},"AI card generation"," from PDFs or pasted text",[22,955,956,959],{},[25,957,958],{},"3 study modes"," — multiple choice, reveal, free-form",[22,961,962,965],{},[25,963,964],{},"Leitner 5-box spaced repetition"," with daily scheduling",[22,967,968,971],{},[25,969,970],{},"Analytics"," — forgetting curve, activity calendar, projected scores",[10,973,50],{"id":49},[15,975,976],{},"Most flashcard apps make you hand-type every card, which burns all your momentum before studying even begins. Most AI learning apps solve the opposite half — they generate cards and hope retention happens on its own, which it doesn't.",[15,978,979],{},"SmartzQuiz combines both. Drop in a PDF, get cards back, and drill them on a Leitner schedule that decides what to re-test and when. You never write a single card by hand, and the system still makes the material stick.",[10,981,60],{"id":59},[19,983,984,990,996,1002],{},[22,985,986,989],{},[25,987,988],{},"Generate cards from PDFs or pasted text"," in one step",[22,991,992,995],{},[25,993,994],{},"Three study modes"," — multiple choice, reveal, and type-your-answer",[22,997,998,1001],{},[25,999,1000],{},"Leitner 5-box scheduling"," with skipped-day handling",[22,1003,1004,1007],{},[25,1005,1006],{},"Activity and forgetting-curve analytics"," to track progress over time",{"title":87,"searchDepth":88,"depth":88,"links":1009},[1010,1011,1012],{"id":12,"depth":88,"text":13},{"id":49,"depth":88,"text":50},{"id":59,"depth":88,"text":60},"2024-12-01","AI flashcards with spaced repetition. Drop in a PDF, get a deck, drill it across MCQ \u002F reveal \u002F free-form modes — Leitner 5-box keeps what you forget.","https:\u002F\u002Fsmartzquiz.com",{},"\u002Fprojects\u002Fsmartzquiz",[],{"title":938,"description":1014},"projects\u002Fsmartzquiz",[325,326,110,233,112,113,235,1022,1023,425,116,874,1024],"OpenAI","Polar","i18n","lUSSK7LwQ-Mz2vqJ0tOvNb8ctxatF2He6b_1868JoT0",1782306952740]