[{"data":1,"prerenderedAt":656},["ShallowReactive",2],{"repo-tree":3,"repo-\u002Fpackages\u002Fcommon\u002Fscripts\u002Freadme":283},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,69,72,75,78,81,84,86,88,90,93,96,99,102,105,108,111,114,117,120,123,125,127,129,131,133,135,138,141,143,146,149,152,155,158,161,164,167,169,172,175,178,180,183,186,189,192,195,198,201,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281],{"path":5,"title":6},"\u002Fagents\u002Fbackend-code-style","Backend Conventions",{"path":8,"title":9},"\u002Fagents\u002Fdatabase","Database",{"path":11,"title":12},"\u002Fagents\u002Fportal-code-style","Portal Conventions",{"path":14,"title":15},"\u002Fagents\u002Ftranslation","Translation",{"path":17,"title":18},"\u002Fconventions\u002Fbackend-coding","Backend coding conventions",{"path":20,"title":21},"\u002Fconventions\u002Ffrontend-coding","Frontend coding conventions",{"path":23,"title":24},"\u002Fdevelopment-process","Development process",{"path":26,"title":27},"\u002Flearning-api-preview-hetzner-setup","Learning API Preview on Hetzner + Cloudflare",{"path":29,"title":30},"\u002Flearning-api-preview-vm-plan","Learning API Preview VM Plan",{"path":32,"title":33},"\u002Fmonorepo-structure","Monorepo structure",{"path":35,"title":36},"\u002Foperations","Operations — bugs and support",{"path":38,"title":39},"\u002Fpostmortems\u002F2026-03-16_onboarding-currency-regression","Onboarding Zod transform silently broken — web signups assigned wrong checkout currency",{"path":41,"title":42},"\u002Fpostmortems\u002Freadme","Postmortems",{"path":44,"title":45},"\u002Fpostmortems\u002F_template","TEMPLATE",{"path":47,"title":48},"\u002Fpostmortems\u002Fposthog-comparison","Postmortem practice — comparison with PostHog",{"path":50,"title":51},"\u002Fpreview-environment-plan","Preview Environment Plan",{"path":53,"title":54},"\u002Fprinciples","Engineering principles",{"path":56,"title":57},"\u002Fworking-with-ai","Working with AI",{"path":59,"title":60},"\u002F.claude\u002Fskills\u002Feval-playground\u002Fskill","Eval Playground — Co-development Skill",{"path":62,"title":63},"\u002F.claude\u002Fskills\u002Ffigma-diff-section\u002Fskill","Figma Diff Section Pipeline",{"path":65,"title":66},"\u002Fagents","AGENTS.md",{"path":68,"title":66},"\u002Fclaude",{"path":70,"title":71},"\u002Freadme","Studyflash",{"path":73,"title":74},"\u002Fapps\u002Fcore-api\u002Fagents","Core API (apps\u002Fcore-api)",{"path":76,"title":77},"\u002Fapps\u002Fcore-api\u002Freadme","README",{"path":79,"title":80},"\u002Fapps\u002Femail-previews\u002Fagents","Email Previews (apps\u002Femail-previews)",{"path":82,"title":83},"\u002Fapps\u002Flanding-page\u002Fagents","Landing Page (apps\u002Flanding-page)",{"path":85,"title":83},"\u002Fapps\u002Flanding-page\u002Fclaude",{"path":87,"title":66},"\u002Fapps\u002Flearning-api\u002Fagents",{"path":89,"title":77},"\u002Fapps\u002Flearning-api\u002Freadme",{"path":91,"title":92},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Feval_metrics_design","Surface-Specific Eval Metrics Design",{"path":94,"title":95},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ftest_set","Quiz Eval Test Set",{"path":97,"title":98},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ffrontend\u002Freadme","React + TypeScript + Vite",{"path":100,"title":101},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fcontent-pillar-shallow-coverage\u002Freadme","Content pillar misses subtopics in dense documents",{"path":103,"title":104},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-empty-section-headers\u002Freadme","Empty section headers dropped by docling chunker",{"path":106,"title":107},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-table-reading-order\u002Freadme","Table\u002Fbox layout causes wrong reading order",{"path":109,"title":110},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fmetrics\u002Freadme","Quiz eval metrics — canonical rubrics",{"path":112,"title":113},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-12-quiz-summary-feedback-current-state","Quiz and Summary Feedback Current State",{"path":115,"title":116},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-24-quiz-eval-metrics","Quiz Evaluation Metrics",{"path":118,"title":119},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-05-01-quiz-eval-current-state","Quiz Eval Current State",{"path":121,"title":122},"\u002Fapps\u002Flearning-api\u002Fmonitoring\u002Freadme","Monitoring Stack",{"path":124,"title":77},"\u002Fapps\u002Flearning-api\u002Fshared\u002Freadme",{"path":126,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fflashcard_agent\u002Freadme",{"path":128,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fingestion_agent\u002Freadme",{"path":130,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fquiz_agent\u002Freadme",{"path":132,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fsummary_agent\u002Freadme",{"path":134,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Fparser\u002Freadme",{"path":136,"title":137},"\u002Fapps\u002Fmarketing-emails-preview\u002Fagents","Marketing Emails Preview (apps\u002Fmarketing-emails-preview)",{"path":139,"title":140},"\u002Fapps\u002Fmobile-app\u002Fagents","StudyFlash Mobile App - Claude Code Configuration",{"path":142,"title":140},"\u002Fapps\u002Fmobile-app\u002Fclaude",{"path":144,"title":145},"\u002Fapps\u002Fmountain-max\u002Fagents","Mountain Max (apps\u002Fmountain-max)",{"path":147,"title":148},"\u002Fapps\u002Fmountain-max\u002Fgame\u002Freadme","Mountain Max Game",{"path":150,"title":151},"\u002Fapps\u002Fportal\u002Fagents","Portal (apps\u002Fportal)",{"path":153,"title":154},"\u002Fapps\u002Fportal\u002Freadme","Nuxt Minimal Starter",{"path":156,"title":157},"\u002Fapps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002Freadme","File Upload Composables",{"path":159,"title":160},"\u002Fapps\u002Fportal\u002Fdocs\u002Flibrary-routing","Library Routing Documentation",{"path":162,"title":163},"\u002Fapps\u002Fsupabase\u002Fagents","Supabase (apps\u002Fsupabase)",{"path":165,"title":166},"\u002Fapps\u002Fwrapped\u002Fagents","Wrapped (apps\u002Fwrapped)",{"path":168,"title":98},"\u002Fapps\u002Fwrapped\u002Freadme",{"path":170,"title":171},"\u002Finfra\u002Freadme","infra\u002F",{"path":173,"title":174},"\u002Finfra\u002Fdns\u002Freadme","DNS Infrastructure",{"path":176,"title":177},"\u002Finfra\u002Fdokploy\u002Freadme","studyflash-dokploy",{"path":179,"title":77},"\u002Finfra\u002Fdokploy\u002Fsdk\u002Fnodejs\u002Freadme",{"path":181,"title":182},"\u002Finfra\u002Finfisical\u002Freadme","Infisical Infrastructure",{"path":184,"title":185},"\u002Finfra\u002Flearning-api\u002Freadme","Pulumi GCP TypeScript Template",{"path":187,"title":188},"\u002Finfra\u002Fopenreplay\u002Freadme","OpenReplay on Hetzner",{"path":190,"title":191},"\u002Finfra\u002Fscripts\u002Freadme","infra\u002Fscripts\u002F",{"path":193,"title":194},"\u002Finfra\u002Fturborepo-cache\u002Freadme","Turborepo Remote Cache Infrastructure",{"path":196,"title":197},"\u002Finternal\u002Fchatwoot\u002Freadme","Chatwoot Infrastructure",{"path":199,"title":200},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Freadme","studyflash-chatwoot-provider",{"path":202,"title":77},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Fsdk\u002Fnodejs\u002Freadme",{"path":204,"title":205},"\u002Finternal\u002Fdocs\u002Freadme","internal\u002Fdocs",{"path":207,"title":208},"\u002Finternal\u002Fsupport-bot\u002Fclaude","Support Bot (Maximilian)",{"path":210,"title":211},"\u002Finternal\u002Fsupport-bot\u002Freadme","Studyflash Customer Support Bot (Maximilian)",{"path":213,"title":214},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Faccount_issues","Account Issues",{"path":216,"title":217},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fbilling_invoice","Billing Invoice",{"path":219,"title":220},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fcontent_upload","Content Upload",{"path":222,"title":223},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fdata_loss","Data Loss",{"path":225,"title":226},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fflashcard_issues","Flashcard Issues",{"path":228,"title":229},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgarbage","Garbage",{"path":231,"title":232},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgeneral_how_to","General How To",{"path":234,"title":235},"\u002Finternal\u002Fsupport-bot\u002Fkb","Knowledge Base Index",{"path":237,"title":238},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Flanguage_issues","Language Issues",{"path":240,"title":241},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmindmap_issues","Mindmap Issues",{"path":243,"title":244},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmisunderstanding","Misunderstanding",{"path":246,"title":247},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmock_exam_issues","Mock Exam Issues",{"path":249,"title":250},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fpodcast_issues","Podcast Issues",{"path":252,"title":253},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fquiz_issues","Quiz Issues",{"path":255,"title":256},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Frefund_request","Refund Request",{"path":258,"title":259},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_cancellation","Subscription Cancellation",{"path":261,"title":262},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_info","Subscription Info",{"path":264,"title":265},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsummary_issues","Summary Issues",{"path":267,"title":268},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Ftechnical_errors","Technical Errors",{"path":270,"title":271},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fvideo_issues","Video Issues",{"path":273,"title":274},"\u002Fpackages\u002Fcommon\u002Fdocs\u002Fearly-access-features","Declarative Early Access Features",{"path":276,"title":277},"\u002Fpackages\u002Fcommon\u002Fscripts\u002Freadme","Common Package Scripts",{"path":279,"title":280},"\u002Fpackages\u002Fdevtools\u002Ffigma-plugins\u002Freadme","Figma plugins",{"path":282,"title":77},"\u002Fpackages\u002Fpulumi-infisical\u002Freadme",{"id":284,"title":277,"body":285,"description":295,"extension":650,"lastReviewed":651,"meta":652,"navigation":436,"owner":651,"path":276,"seo":653,"status":651,"stem":654,"tags":651,"__hash__":655},"repo\u002Fpackages\u002Fcommon\u002Fscripts\u002FREADME.md",{"type":286,"value":287,"toc":642},"minimark",[288,292,296,301,309,319,333,338,345,404,409,494,498,525,529,554,558,561,632,638],[289,290,277],"h1",{"id":291},"common-package-scripts",[293,294,295],"p",{},"This directory contains build pipeline scripts for the common package.",[297,298,300],"h2",{"id":299},"early-access-features-sync","Early Access Features Sync",[293,302,303,304,308],{},"The ",[305,306,307],"code",{},"sync-early-access-features.ts"," script is a self-contained tool that synchronizes declared early access features with PostHog's API.",[310,311,312],"blockquote",{},[293,313,314,318],{},[315,316,317],"strong",{},"💡 Note",": This script is primarily used by CI\u002FCD pipelines. You typically don't need to run it manually!",[293,320,321,322,325,326],{},"📖 ",[315,323,324],{},"For comprehensive documentation",", see ",[327,328,330],"a",{"href":329},"..\u002Fdocs\u002Fearly-access-features",[305,331,332],{},"docs\u002Fearly-access-features.md",[334,335,337],"h3",{"id":336},"usage","Usage",[339,340,341],"ol",{},[342,343,344],"li",{},"Set the required environment variables:",[346,347,352],"pre",{"className":348,"code":349,"language":350,"meta":351,"style":351},"language-bash shiki shiki-themes github-light github-dark","export POSTHOG_PROJECT_ID=\"your-posthog-project-id\"\nexport POSTHOG_API_KEY=\"your-posthog-api-key\"\nexport POSTHOG_API_HOST=\"https:\u002F\u002Feu.posthog.com\"  # Optional, defaults to EU instance\n","bash","",[305,353,354,374,387],{"__ignoreMap":351},[355,356,359,363,367,370],"span",{"class":357,"line":358},"line",1,[355,360,362],{"class":361},"szBVR","export",[355,364,366],{"class":365},"sVt8B"," POSTHOG_PROJECT_ID",[355,368,369],{"class":361},"=",[355,371,373],{"class":372},"sZZnC","\"your-posthog-project-id\"\n",[355,375,377,379,382,384],{"class":357,"line":376},2,[355,378,362],{"class":361},[355,380,381],{"class":365}," POSTHOG_API_KEY",[355,383,369],{"class":361},[355,385,386],{"class":372},"\"your-posthog-api-key\"\n",[355,388,390,392,395,397,400],{"class":357,"line":389},3,[355,391,362],{"class":361},[355,393,394],{"class":365}," POSTHOG_API_HOST",[355,396,369],{"class":361},[355,398,399],{"class":372},"\"https:\u002F\u002Feu.posthog.com\"",[355,401,403],{"class":402},"sJ8bj","  # Optional, defaults to EU instance\n",[339,405,406],{"start":376},[342,407,408],{},"Run the sync script:",[346,410,412],{"className":348,"code":411,"language":350,"meta":351,"style":351},"# Check if features are in sync\npnpm sync-early-access-features --check\n\n# Dry run (show what would change)\npnpm sync-early-access-features --dry-run\n\n# Sync features\npnpm sync-early-access-features\n\n# Sync and delete untracked features\npnpm sync-early-access-features --delete-untracked\n",[305,413,414,419,432,438,444,454,459,465,473,478,484],{"__ignoreMap":351},[355,415,416],{"class":357,"line":358},[355,417,418],{"class":402},"# Check if features are in sync\n",[355,420,421,425,428],{"class":357,"line":376},[355,422,424],{"class":423},"sScJk","pnpm",[355,426,427],{"class":372}," sync-early-access-features",[355,429,431],{"class":430},"sj4cs"," --check\n",[355,433,434],{"class":357,"line":389},[355,435,437],{"emptyLinePlaceholder":436},true,"\n",[355,439,441],{"class":357,"line":440},4,[355,442,443],{"class":402},"# Dry run (show what would change)\n",[355,445,447,449,451],{"class":357,"line":446},5,[355,448,424],{"class":423},[355,450,427],{"class":372},[355,452,453],{"class":430}," --dry-run\n",[355,455,457],{"class":357,"line":456},6,[355,458,437],{"emptyLinePlaceholder":436},[355,460,462],{"class":357,"line":461},7,[355,463,464],{"class":402},"# Sync features\n",[355,466,468,470],{"class":357,"line":467},8,[355,469,424],{"class":423},[355,471,472],{"class":372}," sync-early-access-features\n",[355,474,476],{"class":357,"line":475},9,[355,477,437],{"emptyLinePlaceholder":436},[355,479,481],{"class":357,"line":480},10,[355,482,483],{"class":402},"# Sync and delete untracked features\n",[355,485,487,489,491],{"class":357,"line":486},11,[355,488,424],{"class":423},[355,490,427],{"class":372},[355,492,493],{"class":430}," --delete-untracked\n",[334,495,497],{"id":496},"options","Options",[499,500,501,507,513,519],"ul",{},[342,502,503,506],{},[305,504,505],{},"--dry-run",": Show what would be changed without making changes",[342,508,509,512],{},[305,510,511],{},"--delete-untracked",": Delete features in PostHog that aren't declared",[342,514,515,518],{},[305,516,517],{},"--check",": Only check if features are in sync (exit code 0 if in sync, 1 if not)",[342,520,521,524],{},[305,522,523],{},"--help",": Show help message",[334,526,528],{"id":527},"how-it-works","How it works",[339,530,531,537,540],{},[342,532,533,534],{},"The script reads the declared features from ",[305,535,536],{},"src\u002Fearly_access_features.ts",[342,538,539],{},"Fetches current early access features from PostHog via API",[342,541,542,543],{},"Compares and syncs differences:\n",[499,544,545,548,551],{},[342,546,547],{},"Creates new features declared but missing in PostHog",[342,549,550],{},"Updates existing features with different metadata",[342,552,553],{},"Optionally deletes features in PostHog not declared locally",[334,555,557],{"id":556},"cicd-integration-primary-use-case","CI\u002FCD Integration (Primary Use Case)",[293,559,560],{},"This script is primarily designed for CI\u002FCD automation. Environment variables should be configured in your CI system:",[346,562,564],{"className":348,"code":563,"language":350,"meta":351,"style":351},"# CI\u002FCD Environment Variables\nPOSTHOG_PROJECT_ID=\"your-project-id\"\nPOSTHOG_API_KEY=\"your-api-key\"\nPOSTHOG_API_HOST=\"https:\u002F\u002Feu.posthog.com\"  # Optional, defaults to EU instance\n\n# Typical CI\u002FCD pipeline usage:\npnpm sync-early-access-features --check    # Validate in PRs\npnpm sync-early-access-features             # Auto-sync on merge to main\n",[305,565,566,571,581,591,602,606,611,623],{"__ignoreMap":351},[355,567,568],{"class":357,"line":358},[355,569,570],{"class":402},"# CI\u002FCD Environment Variables\n",[355,572,573,576,578],{"class":357,"line":376},[355,574,575],{"class":365},"POSTHOG_PROJECT_ID",[355,577,369],{"class":361},[355,579,580],{"class":372},"\"your-project-id\"\n",[355,582,583,586,588],{"class":357,"line":389},[355,584,585],{"class":365},"POSTHOG_API_KEY",[355,587,369],{"class":361},[355,589,590],{"class":372},"\"your-api-key\"\n",[355,592,593,596,598,600],{"class":357,"line":440},[355,594,595],{"class":365},"POSTHOG_API_HOST",[355,597,369],{"class":361},[355,599,399],{"class":372},[355,601,403],{"class":402},[355,603,604],{"class":357,"line":446},[355,605,437],{"emptyLinePlaceholder":436},[355,607,608],{"class":357,"line":456},[355,609,610],{"class":402},"# Typical CI\u002FCD pipeline usage:\n",[355,612,613,615,617,620],{"class":357,"line":461},[355,614,424],{"class":423},[355,616,427],{"class":372},[355,618,619],{"class":430}," --check",[355,621,622],{"class":402},"    # Validate in PRs\n",[355,624,625,627,629],{"class":357,"line":467},[355,626,424],{"class":423},[355,628,427],{"class":372},[355,630,631],{"class":402},"             # Auto-sync on merge to main\n",[293,633,634,637],{},[315,635,636],{},"Developers typically don't run these commands manually"," - CI handles everything automatically when you merge changes.",[639,640,641],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":351,"searchDepth":376,"depth":376,"links":643},[644],{"id":299,"depth":376,"text":300,"children":645},[646,647,648,649],{"id":336,"depth":389,"text":337},{"id":496,"depth":389,"text":497},{"id":527,"depth":389,"text":528},{"id":556,"depth":389,"text":557},"md",null,{},{"title":277,"description":295},"packages\u002Fcommon\u002Fscripts\u002FREADME","-JfK2VRueLqwGrahCtJKDQrb9lgmlH5PwZuRuN6tLZQ",1779007964800]