[{"data":1,"prerenderedAt":1574},["ShallowReactive",2],{"repo-tree":3,"repo-\u002Fpackages\u002Fcommon\u002Fdocs\u002Fearly-access-features":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":274,"body":285,"description":295,"extension":1568,"lastReviewed":1569,"meta":1570,"navigation":870,"owner":1569,"path":273,"seo":1571,"status":1569,"stem":1572,"tags":1569,"__hash__":1573},"repo\u002Fpackages\u002Fcommon\u002Fdocs\u002Fearly-access-features.md",{"type":286,"value":287,"toc":1533},"minimark",[288,292,296,301,309,318,323,363,367,370,399,403,408,438,444,448,452,462,650,654,657,732,743,747,762,766,777,781,792,832,836,842,926,930,936,973,977,981,1008,1012,1015,1047,1051,1054,1249,1253,1293,1301,1305,1309,1341,1345,1356,1360,1371,1374,1385,1389,1393,1398,1406,1411,1422,1427,1435,1439,1475,1479,1501,1505,1529],[289,290,274],"h1",{"id":291},"declarative-early-access-features",[293,294,295],"p",{},"This document explains how to declaratively create and manage early access features in Studyflash using our PostHog integration.",[297,298,300],"h2",{"id":299},"overview","Overview",[293,302,303,304,308],{},"Our early access features system provides a declarative, version-controlled approach to managing beta features and product experiments. Instead of manually creating features in PostHog's UI, you define features in code and ",[305,306,307],"strong",{},"CI automatically syncs them"," for you.",[310,311,312],"blockquote",{},[293,313,314,317],{},[305,315,316],{},"💡 Key Point",": You typically don't need to run sync commands manually! Our CI pipeline automatically syncs feature changes when you merge to main branches.",[319,320,322],"h3",{"id":321},"key-benefits","Key Benefits",[324,325,326,333,339,345,351,357],"ul",{},[327,328,329,332],"li",{},[305,330,331],{},"Fully Automated",": CI handles PostHog synchronization automatically",[327,334,335,338],{},[305,336,337],{},"Version Control",": All feature definitions are stored in Git",[327,340,341,344],{},[305,342,343],{},"Multi-language Support",": Define features in all supported languages",[327,346,347,350],{},[305,348,349],{},"Type Safety",": Full TypeScript support with validation",[327,352,353,356],{},[305,354,355],{},"Consistency",": Single source of truth for feature definitions",[327,358,359,362],{},[305,360,361],{},"Zero Manual Work",": Just define features and merge - CI does the rest",[297,364,366],{"id":365},"architecture","Architecture",[293,368,369],{},"The system consists of three main components:",[371,372,373,384,390],"ol",{},[327,374,375,378,379,383],{},[305,376,377],{},"Declarative Configuration"," (",[380,381,382],"code",{},"src\u002Fearly_access_features.ts",") - The source of truth",[327,385,386,389],{},[305,387,388],{},"CI\u002FCD Pipeline"," - Automatically syncs changes when you merge",[327,391,392,378,395,398],{},[305,393,394],{},"Sync Script",[380,396,397],{},"scripts\u002Fsync-early-access-features.ts",") - Used by CI and for debugging",[297,400,402],{"id":401},"cicd-integration","CI\u002FCD Integration",[293,404,405],{},[305,406,407],{},"The system is designed to be fully automated:",[324,409,410,417,424,431],{},[327,411,412,413,416],{},"🔄 ",[305,414,415],{},"Auto-sync on merge",": When you merge changes to main branches, CI automatically syncs features to PostHog",[327,418,419,420,423],{},"🔍 ",[305,421,422],{},"Validation in PRs",": CI checks that your feature declarations are valid",[327,425,426,427,430],{},"🚫 ",[305,428,429],{},"No manual steps",": You never need to run sync commands manually in normal workflows",[327,432,433,434,437],{},"🛡️ ",[305,435,436],{},"Safe operations",": CI uses dry-run checks before applying changes",[293,439,440,441],{},"This means your typical workflow is simply: ",[305,442,443],{},"Code → PR → Merge → Done!",[297,445,447],{"id":446},"adding-new-features","Adding New Features",[319,449,451],{"id":450},"_1-define-your-feature","1. Define Your Feature",[293,453,454,455,458,459,461],{},"Add your feature to the ",[380,456,457],{},"EARLY_ACCESS_FEATURES"," configuration in ",[380,460,382],{},":",[463,464,469],"pre",{"className":465,"code":466,"language":467,"meta":468,"style":468},"language-typescript shiki shiki-themes github-light github-dark","export const EARLY_ACCESS_FEATURES: Record\u003Cstring, EarlyAccessFeatureDeclaration> = {\n  'my-new-feature': {\n    name: {\n      en: 'My New Feature',\n      de: 'Meine neue Funktion',\n      fr: 'Ma nouvelle fonctionnalité',\n      \u002F\u002F ... other languages\n    },\n    description: {\n      en: 'An exciting new feature that improves user experience',\n      de: 'Eine aufregende neue Funktion, die die Benutzererfahrung verbessert',\n      fr: \"Une nouvelle fonctionnalité passionnante qui améliore l'expérience utilisateur\",\n      \u002F\u002F ... other languages\n    },\n    stage: 'beta', \u002F\u002F 'concept' | 'alpha' | 'beta' | 'general-availability'\n  },\n};\n","typescript","",[380,470,471,515,525,531,543,554,565,572,578,584,594,604,614,619,624,638,644],{"__ignoreMap":468},[472,473,476,480,483,487,489,493,497,500,503,506,509,512],"span",{"class":474,"line":475},"line",1,[472,477,479],{"class":478},"szBVR","export",[472,481,482],{"class":478}," const",[472,484,486],{"class":485},"sj4cs"," EARLY_ACCESS_FEATURES",[472,488,461],{"class":478},[472,490,492],{"class":491},"sScJk"," Record",[472,494,496],{"class":495},"sVt8B","\u003C",[472,498,499],{"class":485},"string",[472,501,502],{"class":495},", ",[472,504,505],{"class":491},"EarlyAccessFeatureDeclaration",[472,507,508],{"class":495},"> ",[472,510,511],{"class":478},"=",[472,513,514],{"class":495}," {\n",[472,516,518,522],{"class":474,"line":517},2,[472,519,521],{"class":520},"sZZnC","  'my-new-feature'",[472,523,524],{"class":495},": {\n",[472,526,528],{"class":474,"line":527},3,[472,529,530],{"class":495},"    name: {\n",[472,532,534,537,540],{"class":474,"line":533},4,[472,535,536],{"class":495},"      en: ",[472,538,539],{"class":520},"'My New Feature'",[472,541,542],{"class":495},",\n",[472,544,546,549,552],{"class":474,"line":545},5,[472,547,548],{"class":495},"      de: ",[472,550,551],{"class":520},"'Meine neue Funktion'",[472,553,542],{"class":495},[472,555,557,560,563],{"class":474,"line":556},6,[472,558,559],{"class":495},"      fr: ",[472,561,562],{"class":520},"'Ma nouvelle fonctionnalité'",[472,564,542],{"class":495},[472,566,568],{"class":474,"line":567},7,[472,569,571],{"class":570},"sJ8bj","      \u002F\u002F ... other languages\n",[472,573,575],{"class":474,"line":574},8,[472,576,577],{"class":495},"    },\n",[472,579,581],{"class":474,"line":580},9,[472,582,583],{"class":495},"    description: {\n",[472,585,587,589,592],{"class":474,"line":586},10,[472,588,536],{"class":495},[472,590,591],{"class":520},"'An exciting new feature that improves user experience'",[472,593,542],{"class":495},[472,595,597,599,602],{"class":474,"line":596},11,[472,598,548],{"class":495},[472,600,601],{"class":520},"'Eine aufregende neue Funktion, die die Benutzererfahrung verbessert'",[472,603,542],{"class":495},[472,605,607,609,612],{"class":474,"line":606},12,[472,608,559],{"class":495},[472,610,611],{"class":520},"\"Une nouvelle fonctionnalité passionnante qui améliore l'expérience utilisateur\"",[472,613,542],{"class":495},[472,615,617],{"class":474,"line":616},13,[472,618,571],{"class":570},[472,620,622],{"class":474,"line":621},14,[472,623,577],{"class":495},[472,625,627,630,633,635],{"class":474,"line":626},15,[472,628,629],{"class":495},"    stage: ",[472,631,632],{"class":520},"'beta'",[472,634,502],{"class":495},[472,636,637],{"class":570},"\u002F\u002F 'concept' | 'alpha' | 'beta' | 'general-availability'\n",[472,639,641],{"class":474,"line":640},16,[472,642,643],{"class":495},"  },\n",[472,645,647],{"class":474,"line":646},17,[472,648,649],{"class":495},"};\n",[319,651,653],{"id":652},"_2-feature-stages","2. Feature Stages",[293,655,656],{},"Choose the appropriate stage for your feature:",[658,659,660,676],"table",{},[661,662,663],"thead",{},[664,665,666,670,673],"tr",{},[667,668,669],"th",{},"Stage",[667,671,672],{},"Description",[667,674,675],{},"User Experience",[677,678,679,693,706,719],"tbody",{},[664,680,681,687,690],{},[682,683,684],"td",{},[380,685,686],{},"concept",[682,688,689],{},"Features in planning\u002Fdevelopment",[682,691,692],{},"Appears in \"Coming Soon\" - users can register interest",[664,694,695,700,703],{},[682,696,697],{},[380,698,699],{},"alpha",[682,701,702],{},"Internal testing phase",[682,704,705],{},"Limited availability",[664,707,708,713,716],{},[682,709,710],{},[380,711,712],{},"beta",[682,714,715],{},"Public testing phase",[682,717,718],{},"Users can opt-in to test",[664,720,721,726,729],{},[682,722,723],{},[380,724,725],{},"general-availability",[682,727,728],{},"Production-ready",[682,730,731],{},"Available to all users",[293,733,734,735,742],{},"Refer to ",[736,737,741],"a",{"href":738,"rel":739},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Ffeature-flags\u002Fearly-access-feature-management",[740],"nofollow","PostHog's Early Access Feature Management documentation"," for detailed information about feature stages.",[319,744,746],{"id":745},"_3-naming-convention","3. Naming Convention",[324,748,749,756,759],{},[327,750,751,752,755],{},"Use kebab-case for feature keys (",[380,753,754],{},"my-new-feature",")",[327,757,758],{},"Keys should be descriptive and unique",[327,760,761],{},"Keys become PostHog feature flag names",[297,763,765],{"id":764},"manual-syncing-developmentdebugging-only","Manual Syncing (Development\u002FDebugging Only)",[310,767,768],{},[293,769,770,773,774],{},[305,771,772],{},"⚠️ Important",": These manual sync commands are primarily for development, debugging, or emergency situations. ",[305,775,776],{},"In normal workflows, CI automatically handles syncing when you merge changes.",[319,778,780],{"id":779},"environment-setup","Environment Setup",[293,782,783,784,787,788,791],{},"For local development\u002Fdebugging, create a ",[380,785,786],{},".env"," file in the ",[380,789,790],{},"packages\u002Fcommon"," directory:",[463,793,797],{"className":794,"code":795,"language":796,"meta":468,"style":468},"language-bash shiki shiki-themes github-light github-dark","POSTHOG_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","bash",[380,798,799,809,819],{"__ignoreMap":468},[472,800,801,804,806],{"class":474,"line":475},[472,802,803],{"class":495},"POSTHOG_PROJECT_ID",[472,805,511],{"class":478},[472,807,808],{"class":520},"your-project-id\n",[472,810,811,814,816],{"class":474,"line":517},[472,812,813],{"class":495},"POSTHOG_API_KEY",[472,815,511],{"class":478},[472,817,818],{"class":520},"your-api-key\n",[472,820,821,824,826,829],{"class":474,"line":527},[472,822,823],{"class":495},"POSTHOG_API_HOST",[472,825,511],{"class":478},[472,827,828],{"class":520},"https:\u002F\u002Feu.posthog.com",[472,830,831],{"class":570},"  # Optional, defaults to EU instance\n",[319,833,835],{"id":834},"manual-sync-commands","Manual Sync Commands",[293,837,838,839,841],{},"Run these commands from ",[380,840,790],{}," (typically only needed for debugging):",[463,843,845],{"className":794,"code":844,"language":796,"meta":468,"style":468},"# Check sync status (read-only)\nnpx tsx scripts\u002Fsync-early-access-features.ts --check\n\n# Preview changes without applying them\nnpx tsx scripts\u002Fsync-early-access-features.ts --dry-run\n\n# Sync changes to PostHog\nnpx tsx scripts\u002Fsync-early-access-features.ts\n\n# Sync and delete untracked features in PostHog\nnpx tsx scripts\u002Fsync-early-access-features.ts --delete-untracked\n",[380,846,847,852,866,872,877,888,892,897,906,910,915],{"__ignoreMap":468},[472,848,849],{"class":474,"line":475},[472,850,851],{"class":570},"# Check sync status (read-only)\n",[472,853,854,857,860,863],{"class":474,"line":517},[472,855,856],{"class":491},"npx",[472,858,859],{"class":520}," tsx",[472,861,862],{"class":520}," scripts\u002Fsync-early-access-features.ts",[472,864,865],{"class":485}," --check\n",[472,867,868],{"class":474,"line":527},[472,869,871],{"emptyLinePlaceholder":870},true,"\n",[472,873,874],{"class":474,"line":533},[472,875,876],{"class":570},"# Preview changes without applying them\n",[472,878,879,881,883,885],{"class":474,"line":545},[472,880,856],{"class":491},[472,882,859],{"class":520},[472,884,862],{"class":520},[472,886,887],{"class":485}," --dry-run\n",[472,889,890],{"class":474,"line":556},[472,891,871],{"emptyLinePlaceholder":870},[472,893,894],{"class":474,"line":567},[472,895,896],{"class":570},"# Sync changes to PostHog\n",[472,898,899,901,903],{"class":474,"line":574},[472,900,856],{"class":491},[472,902,859],{"class":520},[472,904,905],{"class":520}," scripts\u002Fsync-early-access-features.ts\n",[472,907,908],{"class":474,"line":580},[472,909,871],{"emptyLinePlaceholder":870},[472,911,912],{"class":474,"line":586},[472,913,914],{"class":570},"# Sync and delete untracked features in PostHog\n",[472,916,917,919,921,923],{"class":474,"line":596},[472,918,856],{"class":491},[472,920,859],{"class":520},[472,922,862],{"class":520},[472,924,925],{"class":485}," --delete-untracked\n",[319,927,929],{"id":928},"package-scripts","Package Scripts",[293,931,932,933,461],{},"If configured in ",[380,934,935],{},"package.json",[463,937,939],{"className":794,"code":938,"language":796,"meta":468,"style":468},"pnpm run sync-early-access-features --check\npnpm run sync-early-access-features --dry-run\npnpm run sync-early-access-features\n",[380,940,941,954,964],{"__ignoreMap":468},[472,942,943,946,949,952],{"class":474,"line":475},[472,944,945],{"class":491},"pnpm",[472,947,948],{"class":520}," run",[472,950,951],{"class":520}," sync-early-access-features",[472,953,865],{"class":485},[472,955,956,958,960,962],{"class":474,"line":517},[472,957,945],{"class":491},[472,959,948],{"class":520},[472,961,951],{"class":520},[472,963,887],{"class":485},[472,965,966,968,970],{"class":474,"line":527},[472,967,945],{"class":491},[472,969,948],{"class":520},[472,971,972],{"class":520}," sync-early-access-features\n",[297,974,976],{"id":975},"how-it-works","How It Works",[319,978,980],{"id":979},"language-handling","Language Handling",[324,982,983,989,1002],{},[327,984,985,988],{},[305,986,987],{},"Declaration",": Features are defined with names\u002Fdescriptions in all supported languages",[327,990,991,994,995,502,998,1001],{},[305,992,993],{},"PostHog Sync",": Only English variants (",[380,996,997],{},"name.en",[380,999,1000],{},"description.en",") are sent to PostHog",[327,1003,1004,1007],{},[305,1005,1006],{},"Frontend Usage",": Your app can use any language variant from the declaration",[319,1009,1011],{"id":1010},"posthog-integration","PostHog Integration",[293,1013,1014],{},"When you sync features to PostHog:",[371,1016,1017,1023,1029,1035],{},[327,1018,1019,1022],{},[305,1020,1021],{},"Feature Creation",": New features are created with English name\u002Fdescription",[327,1024,1025,1028],{},[305,1026,1027],{},"Feature Flag Association",": PostHog automatically creates feature flags based on the feature name",[327,1030,1031,1034],{},[305,1032,1033],{},"User Opt-in",": Users can opt in\u002Fout through PostHog's early access management UI",[327,1036,1037,1040,1041,1046],{},[305,1038,1039],{},"Override Behavior",": User opt-in\u002Fout ",[736,1042,1045],{"href":1043,"rel":1044},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Ffeature-flags\u002Fearly-access-feature-management#how-it-works",[740],"overrides any existing release conditions"," on the feature flag",[319,1048,1050],{"id":1049},"frontend-integration","Frontend Integration",[293,1052,1053],{},"Use PostHog's JavaScript SDK to implement early access features:",[463,1055,1057],{"className":465,"code":1056,"language":467,"meta":468,"style":468},"\u002F\u002F Get all early access features\nposthog.getEarlyAccessFeatures((features) => {\n  const betaFeatures = features.filter((feature) => feature.stage === 'beta');\n  const comingSoonFeatures = features.filter((feature) => feature.stage === 'concept');\n  \u002F\u002F Update your UI\n});\n\n\u002F\u002F Handle user opt-in\u002Fout\nposthog.updateEarlyAccessFeatureEnrollment('my-new-feature', true); \u002F\u002F opt in\nposthog.updateEarlyAccessFeatureEnrollment('my-new-feature', false); \u002F\u002F opt out\n\n\u002F\u002F Check if feature is enabled for current user\nconst isEnabled = posthog.isFeatureEnabled('my-new-feature');\n",[380,1058,1059,1064,1087,1125,1155,1160,1165,1169,1174,1198,1218,1222,1227],{"__ignoreMap":468},[472,1060,1061],{"class":474,"line":475},[472,1062,1063],{"class":570},"\u002F\u002F Get all early access features\n",[472,1065,1066,1069,1072,1075,1079,1082,1085],{"class":474,"line":517},[472,1067,1068],{"class":495},"posthog.",[472,1070,1071],{"class":491},"getEarlyAccessFeatures",[472,1073,1074],{"class":495},"((",[472,1076,1078],{"class":1077},"s4XuR","features",[472,1080,1081],{"class":495},") ",[472,1083,1084],{"class":478},"=>",[472,1086,514],{"class":495},[472,1088,1089,1092,1095,1098,1101,1104,1106,1109,1111,1113,1116,1119,1122],{"class":474,"line":527},[472,1090,1091],{"class":478},"  const",[472,1093,1094],{"class":485}," betaFeatures",[472,1096,1097],{"class":478}," =",[472,1099,1100],{"class":495}," features.",[472,1102,1103],{"class":491},"filter",[472,1105,1074],{"class":495},[472,1107,1108],{"class":1077},"feature",[472,1110,1081],{"class":495},[472,1112,1084],{"class":478},[472,1114,1115],{"class":495}," feature.stage ",[472,1117,1118],{"class":478},"===",[472,1120,1121],{"class":520}," 'beta'",[472,1123,1124],{"class":495},");\n",[472,1126,1127,1129,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1153],{"class":474,"line":533},[472,1128,1091],{"class":478},[472,1130,1131],{"class":485}," comingSoonFeatures",[472,1133,1097],{"class":478},[472,1135,1100],{"class":495},[472,1137,1103],{"class":491},[472,1139,1074],{"class":495},[472,1141,1108],{"class":1077},[472,1143,1081],{"class":495},[472,1145,1084],{"class":478},[472,1147,1115],{"class":495},[472,1149,1118],{"class":478},[472,1151,1152],{"class":520}," 'concept'",[472,1154,1124],{"class":495},[472,1156,1157],{"class":474,"line":545},[472,1158,1159],{"class":570},"  \u002F\u002F Update your UI\n",[472,1161,1162],{"class":474,"line":556},[472,1163,1164],{"class":495},"});\n",[472,1166,1167],{"class":474,"line":567},[472,1168,871],{"emptyLinePlaceholder":870},[472,1170,1171],{"class":474,"line":574},[472,1172,1173],{"class":570},"\u002F\u002F Handle user opt-in\u002Fout\n",[472,1175,1176,1178,1181,1184,1187,1189,1192,1195],{"class":474,"line":580},[472,1177,1068],{"class":495},[472,1179,1180],{"class":491},"updateEarlyAccessFeatureEnrollment",[472,1182,1183],{"class":495},"(",[472,1185,1186],{"class":520},"'my-new-feature'",[472,1188,502],{"class":495},[472,1190,1191],{"class":485},"true",[472,1193,1194],{"class":495},"); ",[472,1196,1197],{"class":570},"\u002F\u002F opt in\n",[472,1199,1200,1202,1204,1206,1208,1210,1213,1215],{"class":474,"line":586},[472,1201,1068],{"class":495},[472,1203,1180],{"class":491},[472,1205,1183],{"class":495},[472,1207,1186],{"class":520},[472,1209,502],{"class":495},[472,1211,1212],{"class":485},"false",[472,1214,1194],{"class":495},[472,1216,1217],{"class":570},"\u002F\u002F opt out\n",[472,1219,1220],{"class":474,"line":596},[472,1221,871],{"emptyLinePlaceholder":870},[472,1223,1224],{"class":474,"line":606},[472,1225,1226],{"class":570},"\u002F\u002F Check if feature is enabled for current user\n",[472,1228,1229,1232,1235,1237,1240,1243,1245,1247],{"class":474,"line":616},[472,1230,1231],{"class":478},"const",[472,1233,1234],{"class":485}," isEnabled",[472,1236,1097],{"class":478},[472,1238,1239],{"class":495}," posthog.",[472,1241,1242],{"class":491},"isFeatureEnabled",[472,1244,1183],{"class":495},[472,1246,1186],{"class":520},[472,1248,1124],{"class":495},[297,1250,1252],{"id":1251},"example-workflow","Example Workflow",[371,1254,1255,1261,1269,1275,1281,1287],{},[327,1256,1257,1260],{},[305,1258,1259],{},"Plan Feature",": Decide on feature name, description, and initial stage",[327,1262,1263,1266,1267],{},[305,1264,1265],{},"Add Declaration",": Define feature in ",[380,1268,457],{},[327,1270,1271,1274],{},[305,1272,1273],{},"Create Pull Request",": Submit your changes for review",[327,1276,1277,1280],{},[305,1278,1279],{},"Merge to Main",": CI automatically syncs the feature to PostHog when merged",[327,1282,1283,1286],{},[305,1284,1285],{},"Implement Frontend",": Add PostHog integration to your app",[327,1288,1289,1292],{},[305,1290,1291],{},"Iterate",": Update stage and descriptions - CI keeps PostHog in sync automatically",[310,1294,1295],{},[293,1296,1297,1300],{},[305,1298,1299],{},"🚀 That's it!"," No manual sync commands needed. CI handles everything when you merge.",[297,1302,1304],{"id":1303},"best-practices","Best Practices",[319,1306,1308],{"id":1307},"feature-lifecycle","Feature Lifecycle",[371,1310,1311,1319,1327,1335],{},[327,1312,1313,1318],{},[305,1314,1315,1316],{},"Start with ",[380,1317,686],{}," for features in development",[327,1320,1321,1326],{},[305,1322,1323,1324],{},"Move to ",[380,1325,712],{}," when ready for user testing",[327,1328,1329,1334],{},[305,1330,1331,1332],{},"Graduate to ",[380,1333,725],{}," when stable",[327,1336,1337,1340],{},[305,1338,1339],{},"Remove declaration"," when feature becomes permanent",[319,1342,1344],{"id":1343},"naming","Naming",[324,1346,1347,1350,1353],{},[327,1348,1349],{},"Use descriptive, action-oriented names",[327,1351,1352],{},"Keep names concise but clear",[327,1354,1355],{},"Avoid technical jargon in user-facing names",[319,1357,1359],{"id":1358},"descriptions","Descriptions",[324,1361,1362,1365,1368],{},[327,1363,1364],{},"Write clear, benefit-focused descriptions",[327,1366,1367],{},"Explain what users can expect",[327,1369,1370],{},"Keep descriptions consistent across languages",[319,1372,337],{"id":1373},"version-control",[324,1375,1376,1379,1382],{},[327,1377,1378],{},"Include feature additions in pull requests",[327,1380,1381],{},"Document feature decisions in commit messages",[327,1383,1384],{},"Use feature branches for major feature work",[297,1386,1388],{"id":1387},"troubleshooting","Troubleshooting",[319,1390,1392],{"id":1391},"common-issues","Common Issues",[293,1394,1395],{},[305,1396,1397],{},"\"Missing feature in PostHog\"",[324,1399,1400,1403],{},[327,1401,1402],{},"Feature was declared but not synced",[327,1404,1405],{},"Run sync script to create feature",[293,1407,1408],{},[305,1409,1410],{},"\"Extra feature in PostHog not declared\"",[324,1412,1413,1416],{},[327,1414,1415],{},"Feature exists in PostHog but not in code",[327,1417,1418,1419],{},"Either add declaration or use ",[380,1420,1421],{},"--delete-untracked",[293,1423,1424],{},[305,1425,1426],{},"\"Name\u002FDescription mismatch\"",[324,1428,1429,1432],{},[327,1430,1431],{},"PostHog has different values than declared",[327,1433,1434],{},"Run sync to update PostHog with current values",[319,1436,1438],{"id":1437},"sync-script-options","Sync Script Options",[463,1440,1442],{"className":794,"code":1441,"language":796,"meta":468,"style":468},"--dry-run          # Preview changes without applying\n--delete-untracked # Remove PostHog features not declared\n--check           # Only check sync status (read-only)\n--help            # Show usage information\n",[380,1443,1444,1452,1459,1467],{"__ignoreMap":468},[472,1445,1446,1449],{"class":474,"line":475},[472,1447,1448],{"class":491},"--dry-run",[472,1450,1451],{"class":570},"          # Preview changes without applying\n",[472,1453,1454,1456],{"class":474,"line":517},[472,1455,1421],{"class":491},[472,1457,1458],{"class":570}," # Remove PostHog features not declared\n",[472,1460,1461,1464],{"class":474,"line":527},[472,1462,1463],{"class":491},"--check",[472,1465,1466],{"class":570},"           # Only check sync status (read-only)\n",[472,1468,1469,1472],{"class":474,"line":533},[472,1470,1471],{"class":491},"--help",[472,1473,1474],{"class":570},"            # Show usage information\n",[297,1476,1478],{"id":1477},"references","References",[324,1480,1481,1487,1494],{},[327,1482,1483],{},[736,1484,1486],{"href":738,"rel":1485},[740],"PostHog Early Access Feature Management",[327,1488,1489],{},[736,1490,1493],{"href":1491,"rel":1492},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Ffeature-flags",[740],"PostHog Feature Flags Documentation",[327,1495,1496],{},[736,1497,1500],{"href":1498,"rel":1499},"https:\u002F\u002Fposthog.com\u002Fdocs\u002Flibraries\u002Fjs",[740],"PostHog JavaScript SDK",[297,1502,1504],{"id":1503},"related-files","Related Files",[324,1506,1507,1512,1517,1523],{},[327,1508,1509,1511],{},[380,1510,382],{}," - Feature declarations",[327,1513,1514,1516],{},[380,1515,397],{}," - Sync script",[327,1518,1519,1522],{},[380,1520,1521],{},"scripts\u002Ftsconfig.json"," - TypeScript configuration for scripts",[327,1524,1525,1528],{},[380,1526,1527],{},"scripts\u002FREADME.md"," - Script-specific documentation",[1530,1531,1532],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":468,"searchDepth":517,"depth":517,"links":1534},[1535,1538,1539,1540,1545,1550,1555,1556,1562,1566,1567],{"id":299,"depth":517,"text":300,"children":1536},[1537],{"id":321,"depth":527,"text":322},{"id":365,"depth":517,"text":366},{"id":401,"depth":517,"text":402},{"id":446,"depth":517,"text":447,"children":1541},[1542,1543,1544],{"id":450,"depth":527,"text":451},{"id":652,"depth":527,"text":653},{"id":745,"depth":527,"text":746},{"id":764,"depth":517,"text":765,"children":1546},[1547,1548,1549],{"id":779,"depth":527,"text":780},{"id":834,"depth":527,"text":835},{"id":928,"depth":527,"text":929},{"id":975,"depth":517,"text":976,"children":1551},[1552,1553,1554],{"id":979,"depth":527,"text":980},{"id":1010,"depth":527,"text":1011},{"id":1049,"depth":527,"text":1050},{"id":1251,"depth":517,"text":1252},{"id":1303,"depth":517,"text":1304,"children":1557},[1558,1559,1560,1561],{"id":1307,"depth":527,"text":1308},{"id":1343,"depth":527,"text":1344},{"id":1358,"depth":527,"text":1359},{"id":1373,"depth":527,"text":337},{"id":1387,"depth":517,"text":1388,"children":1563},[1564,1565],{"id":1391,"depth":527,"text":1392},{"id":1437,"depth":527,"text":1438},{"id":1477,"depth":517,"text":1478},{"id":1503,"depth":517,"text":1504},"md",null,{},{"title":274,"description":295},"packages\u002Fcommon\u002Fdocs\u002Fearly-access-features","ctQHvoYBpp7Hl_WhakjKrnJsGeTSysPrPUc_25ovRz4",1779007964795]