os/business-plan-builder/index.html/api/chat (required for API calls)od-bplan-v4?reset query string clears all dataThe Business Launch Plan Builder is an AI-powered conversational tool that guides you through building a complete business plan and a detailed 30-day launch action plan. Instead of filling in a blank template, you have a natural chat conversation with an AI coach that asks focused questions, extracts your answers, and automatically assembles a polished business plan with rich visual output.
When the plan is complete, it renders as a full-screen document with KPI summary cards, tabbed section navigation, collapsible accordions, financial tables, and — if the 30-day dashboard is generated — a live project management view with task status tracking, workload balance, and progress KPIs.
The app sends API calls to an AI provider through a proxy endpoint (/api/chat). The proxy must be running before you start chatting. Without it the app will display a "Could not connect to AI" error on the setup screen.
os/business-plan-builder/index.html from the main platform (the page is loaded in an iframe from the Leadership section in the sidebar, or open directly in a browser tab).sk-ant-; OpenAI keys start with sk-). If using a Custom Endpoint, enter the endpoint URL instead; no key field is shown.localStorage key od-bplan-v4 and skips the setup screen, returning you exactly where you left off.localStorage only. It is never written to disk by the platform and is only transmitted from your browser to the proxy endpoint, which forwards it to the AI provider.The AI guides you through exactly 10 sections in order. Each section corresponds to one phase of the conversation. Sections are grouped into three colour-coded tabs in the plan view.
| # | Section ID | Display Title | What the AI Extracts | Group |
|---|---|---|---|---|
| 1 | overview |
Business Idea | Business name, description, problem, solution, industry, stage | Foundation |
| 2 | market |
Target Customer | Ideal customer profile, pain points (array), current alternative, market size, geographic focus | Foundation |
| 3 | value |
Your Edge | Value proposition, unique selling points (array), competitive advantage | Foundation |
| 4 | products |
Products & Pricing | Products array (name, description, price each), revenue model, pricing strategy | Commercial |
| 5 | revenue |
Revenue Model | Year 1 revenue target, Year 3 target, customers per month, avg transaction value, key assumptions | Commercial |
| 6 | costs |
Costs & Investment | Startup costs array (item + cost), monthly costs array (item + cost), funding source, break-even estimate | Commercial |
| 7 | team |
Team & Resources | Founder role, team members array (name, role, specialization: marketing/systems/product), key hires, tools & software, skills gaps | Execution |
| 8 | marketing |
Marketing & Sales | Channels array, sales process (text), lead generation strategy, marketing budget | Execution |
| 9 | launch |
30-Day Launch Plan | Launch date, week 1–4 summaries, pre-launch checklist, and (when generated) a full weeks array with day-level tasks |
Execution |
| 10 | metrics |
Success Metrics | 30-day milestone, 90-day milestone, 12-month milestone, KPIs array, biggest risk, risk mitigation | Execution |
The left sidebar shows all 10 sections with a status dot. The dot style changes as you progress.
| Dot State | CSS Class | Meaning |
|---|---|---|
| Number only, dimmed | section-item (no modifier) | Not yet started — waiting in queue |
| Number, accent-coloured | section-item active | Currently being discussed with the AI |
| Green tick, clickable | section-item done | Captured and saved — click to open Review Panel |
| Solid green background | section-item reviewing | Currently open in the Review Panel |
After setup, you enter the main app layout with two areas side by side:
[PLANDATA:section_id]{...JSON...}[/PLANDATA].planData.If the conversation grows beyond 50 messages, the app automatically summarises the completed sections and trims the message history to the last 48 messages. This prevents hitting API context limits on long sessions. Your plan data is never lost — only the conversation history is compressed.
revenue, costs, and launch section data.| Section | Key Visual Elements |
|---|---|
| Business Idea | Accent card with business name, elevator pitch highlight, industry/stage KPI mini-cards, problem/solution side-by-side highlights |
| Target Customer | Collapsible accordion steps: Ideal Customer (open by default), Pain Points (amber bullet list), Market Size & Geography (two-column highlights) |
| Your Edge | Value proposition highlight box, USPs in a card grid (2 or 3 columns), Competitive Advantage accordion step |
| Products & Pricing | Products table inside collapsible step (Name / Description / Price columns), Revenue Model and Pricing Strategy side-by-side highlights |
| Revenue Model | 4-cell metric grid: Y1 revenue, Y3 revenue, customers/month, avg transaction; Key Assumptions highlight if present |
| Costs & Investment | Startup costs table, Monthly costs table, Funding Source and Break-Even side-by-side highlights |
| Team & Resources | Founder Role accordion (open), Key Hires as coloured tags, Tools & Software as green tags, Skills Gaps as a warning decision callout box |
| Marketing & Sales | One accordion step per marketing channel, Sales Process as a numbered funnel diagram, Lead Gen and Marketing Budget cards |
| 30-Day Launch Plan | Either a thin summary view (week summaries + Generate button) or a full interactive PM dashboard (see Section 5) |
| Success Metrics | 3-column milestone cards (30d / 90d / 365d), KPIs as accent-coloured tags, Biggest Risk as a warning decision callout |
Clicking a completed section (green tick) in the sidebar opens a Review Panel in place of the chat messages:
Inside the full plan overlay, each section also has Edit Section and View Discussion action buttons directly above the section content. These work identically to the Review Panel edit but stay within the plan view without navigating away.
[PLANDATA:section_id]{...}[/PLANDATA] block. The app extracts the new JSON, updates planData, saves to localStorage, and reloads the view.[PLANDATA:...] block, the edit fails and displays "AI did not return updated data. Try rephrasing your request." Rephrase and try again.The primary AI conversation uses a detailed system prompt built by the buildSystemPrompt(userName) function. Key behaviours the AI is instructed to follow:
[PLANDATA:section_id]{...JSON...}[/PLANDATA] at the very end of that message.launch section, ask for actual team member names and their specialization (marketing / systems / product) so tasks in the 30-day plan can be assigned to real people.[PLAN_COMPLETE] at the very end of the message. The app then shows a star banner and enables the plan view.<plan_data section="id">...JSON...</plan_data> via the extractPlanDataFromText() function, in case the AI uses XML-style tags instead of the bracket format.After the main conversation completes the launch section with week-level summaries, the 30-Day Launch Plan tab shows a Generate detailed 30-day plan button. This triggers a separate AI call via generateLaunchPlan().
planData object as JSON context.[PLANDATA:launch]{...}[/PLANDATA] block with no prose before or after.id (task-1, task-2…), title, detail (how to do it / what success looks like), category (marketing | systems | product), and suggestedOwner (0-based index matching the team member whose specialization matches the task category).On success, the new launch data is merged with the existing plan data (preserving any fields the AI omitted), saved to localStorage, and the plan view re-renders with the full interactive PM dashboard. The app then auto-scrolls to the 30-Day Launch tab.
Every time you submit an edit from the Review Panel or the plan view Edit Section panel, the app makes a separate, isolated AI call. It builds a system prompt with the current section JSON and instructs the AI to apply only the requested changes, return all fields, and end with a [PLANDATA:section_id]{...}[/PLANDATA] block. This call uses the same provider, model, and key as the main session.
| Provider | Setup field shown | Default model options | Proxy route |
|---|---|---|---|
| Claude (Anthropic) | API Key (sk-ant-...) |
Claude Sonnet, Claude Opus, Claude Haiku | /api/chat with provider: "anthropic" |
| ChatGPT (OpenAI) | API Key (sk-...) |
GPT-4o, GPT-4o Mini | /api/chat with provider: "openai" |
| Custom Endpoint | Endpoint URL (no API key field) | Default (single option) | /api/chat with provider: "custom" and endpoint field |
/api/chat or the value of PROXY_ENDPOINT). The proxy differentiates by the provider field in the request body. The Custom Endpoint option is designed for self-hosted proxies or OpenAI-compatible APIs.The app saves all state after every AI response and after every section edit. The saveState() function writes a single JSON object to localStorage under the key od-bplan-v4. The saved object contains:
| Field | What it stores |
|---|---|
config | Provider, model, API key, username, endpoint URL |
messages | Full conversation history (all roles, including raw data blocks before they are stripped) |
planData | All captured section JSON objects, keyed by section ID |
completedSections | Array of section IDs that have been successfully captured |
sectionMessages | Per-section conversation log (role + cleaned text, no data blocks) |
lastSectionMsgIndex | Index pointer used to slice messages for the next section’s discussion log |
saveState() silently fails (try/catch swallows errors), data will not persist. Export to PDF when the plan is complete.bpb-launch-status-{plan-slug} and owner overrides under bpb-launch-owners-{plan-slug}. The plan slug is derived from the business name. These keys are independent of od-bplan-v4.window.print().avoid for tidy pagination.The Start Over button in the sidebar footer opens a confirmation modal. Clicking Delete Everything calls doReset():
od-bplan-v4 key from localStorage.messages, planData, completedSections, sectionMessages).Alternatively, add ?reset to the URL. The app detects this on load, removes od-bplan-v4, and clears the URL parameter before showing the setup screen.
| Button Label | Where It Appears | What It Does |
|---|---|---|
| Start Building Your Plan | Setup screen | Validates the API key / endpoint, saves config, seeds the first user message, calls showApp() and immediately triggers sendToAI() so the AI sends its opening welcome message. |
| Send (arrow icon) | Chat input bar | Calls handleSend() — appends the user’s text to the message array, shows it in the chat, and triggers an AI call. Also triggered by pressing Enter. |
| View Your Plan | Sidebar footer | Calls showPlan(). Disabled until at least one section is complete. Renders the full-screen plan overlay. |
| Start Over | Sidebar footer | Calls showResetModal(). Opens the confirmation modal. Does not delete data yet. |
| Delete Everything | Reset confirmation modal | Calls doReset(). Clears localStorage and resets all state to initial values. |
| Cancel | Reset confirmation modal | Calls hideResetModal(). Closes the modal with no changes. |
| Back to Chat | Plan view toolbar; Review Panel header | Plan toolbar: calls closePlan(), removes active class from overlay. Review Panel: calls closeSectionReview(), restores the chat message view. |
| Export as PDF | Plan view toolbar | Calls window.print(). Opens the browser print dialog with print CSS applied. |
| Section tab (e.g. “📋 Business Idea”) | Plan view sticky tab bar | Calls showPlanTab(id, tabEl). Removes active from all section divs and tabs, then adds it to the clicked tab and the corresponding #sec-{id} div. |
| View Discussion | Section action bar (plan view) | Calls toggleDiscussion(sectionId, btnEl). Closes all open discussion/edit panels, then toggles the #disc-{id} panel. Shows the AI/user conversation for that section. |
| Edit Section | Section action bar (plan view) | Calls toggleEditPanel(sectionId, btnEl). Closes all open panels, then opens the #edit-{id} panel and focuses the textarea. |
| Update | Edit panel (plan view); Review Panel | Plan view: calls sendSectionEdit(sectionId). Review Panel: calls sendRpSectionEdit(sectionId). Both make an isolated AI API call to apply the edit instruction. |
| Accordion step header | Collapsible step blocks in plan sections | Calls toggleStep(el). Toggles the open class on the step wrapper, showing or hiding the step body content. |
| ✨ Generate detailed 30-day plan | 30-Day Launch Plan section (before generation) | Calls generateLaunchPlan(). Makes an AI call with the full plan context and team data to produce a structured weeks array. Replaces the thin summary with the full PM dashboard on success. |
| ↻ Regenerate plan | 30-Day PM Dashboard footer | Same as Generate — calls generateLaunchPlan(). Overwrites existing task data. |
| Task status button (e.g. “To Do”) | 30-Day PM Dashboard, each task row | Calls lpCycleStatus(taskId). Cycles the task through To Do → In Progress → Done → To Do. Saves the new status (with owner name and timestamp) to localStorage key bpb-launch-status-{plan-slug} and updates the KPI row and workload bar. |
| Owner dropdown | 30-Day PM Dashboard, each task row | Calls lpSwitchOwner(sel, taskId). Updates the owner tag colour and name for the task, saves to bpb-launch-owners-{plan-slug}, refreshes the workload bar, and calls lpCheckBalance() to show a toast warning if the task category does not match the owner’s specialization or if another team member has idle days. |
| Filter bar buttons (All Tasks, [name], In Progress) | 30-Day PM Dashboard | Calls lpFilterBy(filter). Dims all task rows that do not match the selected filter. Filter options: all, m0/m1/m2… (by team member index), inprogress. |
| Week nav buttons (e.g. “Week 1 — Foundation”) | 30-Day PM Dashboard | Calls lpScrollToWeek(wid). Smooth-scrolls to the corresponding week section using scrollIntoView. |
/api/chat route is unavailable.python3 serve.py in the os/business-plan-builder/ directory. Confirm the server is listening before trying again. If using GitHub Pages (no proxy), you need a custom endpoint or a deployed API proxy.
?reset to the URL) to return to the setup screen and re-enter your API key. Verify the key is active in your provider’s console. Anthropic keys start with sk-ant-.
[PLANDATA:section_id]{...}[/PLANDATA] block. This occasionally happens if the AI drifts from its instructions.[PLANDATA:section_id] block.[PLANDATA:launch] block. Often caused by the model hitting a token limit on a very large plan context, or a transient API error.localStorage was cleared, the od-bplan-v4 key was deleted, you are using a different browser/profile, or you added ?reset to the URL.localStorage and will reload automatically.
bpb-launch-status-{plan-slug}) derived from the business name. If the business name changed, the key changes and old statuses are not found.completedSections.length > 0./api/chat and what the server returns.od-bplan-v4 exists and contains valid JSON.| Version | Date | Changes |
|---|---|---|
| 1.3 | 17 Apr 2026 | Complete rewrite of SOP to match current code (v4). Documents multi-provider support (Anthropic / OpenAI / Custom), the interactive 30-day PM dashboard (task status cycling, owner switching, workload balance toast, filter bar, week navigation, progress KPIs), section edit flow from both Review Panel and plan view, context window management, per-section discussion logs, separate localStorage keys for task statuses and owner overrides, and ?reset URL parameter. |
| 1.2 | — | Internal draft (not published). |
| 1.1 | — | Internal draft (not published). |
| 1.0 | 13 Apr 2026 | Initial SOP covering setup screen, 10 sections, chat workflow, plan view, review/edit panel, localStorage persistence, and proxy server architecture. |
Business Launch Plan Builder SOP • Version 1.3 • 17 Apr 2026 • Owner: Kevin Brittain