{"id":47883258,"url":"https://github.com/managedcode/prompterone","last_synced_at":"2026-04-26T01:01:49.768Z","repository":{"id":348334164,"uuid":"1194024773","full_name":"managedcode/PrompterOne","owner":"managedcode","description":"Browser-first teleprompter, rehearsal, and live presentation studio built with .NET 10 and Blazor WebAssembly.","archived":false,"fork":false,"pushed_at":"2026-04-13T11:50:05.000Z","size":19010,"stargazers_count":35,"open_issues_count":0,"forks_count":8,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T13:34:45.697Z","etag":null,"topics":["blazor","blazor-webassembly","csharp","dotnet","livestreaming","presentation","teleprompter","tps","webassembly"],"latest_commit_sha":null,"homepage":"https://prompter.managed-code.com","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/managedcode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-27T20:48:33.000Z","updated_at":"2026-04-13T11:50:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"6d3d5ed5-d529-406b-9774-a22dad212cbe","html_url":"https://github.com/managedcode/PrompterOne","commit_stats":null,"previous_names":["managedcode/prompterlive","managedcode/prompterone"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/managedcode/PrompterOne","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/managedcode%2FPrompterOne","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/managedcode%2FPrompterOne/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/managedcode%2FPrompterOne/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/managedcode%2FPrompterOne/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/managedcode","download_url":"https://codeload.github.com/managedcode/PrompterOne/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/managedcode%2FPrompterOne/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31818840,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"ssl_error","status_checked_at":"2026-04-14T18:05:01.765Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blazor","blazor-webassembly","csharp","dotnet","livestreaming","presentation","teleprompter","tps","webassembly"],"created_at":"2026-04-04T02:02:08.570Z","updated_at":"2026-04-26T01:01:49.742Z","avatar_url":"https://github.com/managedcode.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003ePrompterOne\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eWrite. Rehearse. Read. Go live. All from the browser.\u003c/strong\u003e\u003cbr/\u003e\n  An open-source, browser-first teleprompter studio built around \u003ca href=\"https://github.com/managedcode/TPS\"\u003eTPS\u003c/a\u003e so the same script can move from first draft to rehearsal, reader mode, recording, and live delivery without a backend.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://app.prompter.one/\"\u003eTry it now\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://github.com/managedcode/PrompterOne\"\u003eGitHub\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://github.com/managedcode/TPS\"\u003eTPS\u003c/a\u003e \u0026middot;\n  \u003ca href=\"docs/Architecture.md\"\u003eArchitecture\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#quick-start\"\u003eRun locally\u003c/a\u003e \u0026middot;\n  \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/.NET-10-512BD4?logo=dotnet\" alt=\".NET 10\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Blazor-WebAssembly-512BD4?logo=blazor\" alt=\"Blazor WASM\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-blue\" alt=\"MIT License\" /\u003e\n\u003c/p\u003e\n\n\u003ch2 align=\"center\"\u003e🚀 Build In Public\u003c/h2\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.youtube.com/watch?v=SBcsYblO1AI\u0026list=PLIyi2UvDCig2IgzRQLJXcS5MYdZVDu2EM\"\u003e\n    \u003cimg src=\"https://img.youtube.com/vi/SBcsYblO1AI/maxresdefault.jpg\" width=\"600\" alt=\"Watch on YouTube\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.youtube.com/@managed-code\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/YouTube-Subscribe-red?style=for-the-badge\u0026logo=youtube\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\n\n---\n\n## The Problem\n\nIf you speak on camera, stream, or present live, the workflow usually fragments immediately. Drafts live in one app. Rehearsal happens somewhere else. The teleprompter is a separate tool. Recording and streaming need another stack entirely. Every switch breaks context, strips timing cues, and turns delivery into a copy-paste problem.\n\n**PrompterOne** keeps that flow in one browser tab. You write once in TPS, rehearse the same script in Learn, read it in the teleprompter, and send the same composed program feed into local recording or transport-aware live output. Pacing, emphasis, structure, metadata, and reader settings stay attached to the script instead of getting rebuilt at every stage.\n\nNo PrompterOne backend. No desktop install. No account wall. Open the app, start writing, and keep the runtime in the browser.\n\n## What Works Today\n\n- **Library**: browse scripts, create folders, move documents, search by title, file name, and script content, then jump straight into edit, Learn, or Teleprompter flows from the same card.\n- **Editor**: author real TPS with Monaco-native syntax support, metadata hydration, structure-aware navigation, floating formatting controls, in-document find, syntax-aware rendering, browser-local autosave/history, a script knowledge-graph view, and responsive large-draft typing.\n- **Learn**: rehearse with ORP-aligned RSVP, context rails, phrase-aware timing, WPM controls, stepping, looping, and punctuation-safe word progression.\n- **Teleprompter**: read with persisted font and width controls, focal-line positioning, horizontal and vertical mirror toggles, orientation switching, browser fullscreen, segmented progress, and optional camera background.\n- **Onboarding**: walk the first-run flow with a localized tour that explains TPS, RSVP, the editor, Learn, Teleprompter, and Go Live, then reopen that tour later from Settings.\n- **Settings**: manage appearance, browser language, media permissions, camera and microphone setup, sync offsets, recording defaults, minimal active AI provider setup, cloud snapshot targets, transport credentials, and onboarding restart from one routed screen.\n- **AI Spotlight**: when an AI provider is configured, run the global assistant as a real Microsoft Agent Framework agent with route context, editor text, selected ranges, graph summary, PrompterOne MCP-style tools, and structured output that separates chat replies from exact document edits.\n- **Go Live**: run the browser-owned studio shell and save the composed program feed locally with decodable video and audio while remote transport and destination routing continue to expand.\n\n## What You Get\n\n### Script Library\n\nThe operating desk for the rest of the app. The library keeps starter scripts and your own documents in browser storage, supports nested folders, lets you search by title, file name, or body text, and branches straight into editing, rehearsal, or reading from the same card. It is built for quick route switching instead of export-import churn.\n\n![Library](docs/screenshots/readme/library.png)\n\n---\n\n### Smart Script Editor\n\nThis is not a plain textarea. The editor understands **TPS** (Teleprompter Script), so you can write in segments, blocks, pacing markers, emphasis, emotion tags, pronunciation guides, pause cues, and speed modifiers directly in the source. Front matter is parsed into the metadata rail and kept out of the visible body instead of lingering inline.\n\nThe authoring surface includes structure navigation on the left, a full formatting and insert toolbar, floating selection controls, a metadata rail for front matter and speed offsets, in-document find, import and export actions, browser-local autosave with revision history, syntax-aware highlighting over the live source, and a first-class script graph tab. The graph view can run beside or over the source, lets writers inspect the script's high-level knowledge map, and keeps jump-back-to-source context attached to graph nodes. Its **Build AI graph** action uses the configured LLM extractor; tokenizer similarity stays an explicit lower-fidelity fallback instead of silently pretending to be semantic analysis. Recent UI work moved TPS authoring fully onto the Monaco editor surface, tightened dropdown and tooltip behavior, cleaned up gutter spacing, and kept large-draft responsiveness intact on both polished demo scripts and very large seeded drafts.\n\n![Editor](docs/screenshots/readme/editor.png)\n\n---\n\n### TPS Cue Language\n\nPrompterOne treats TPS cues as reading instructions, not markup noise. The editor and reader now carry the same cue intent forward for voice, delivery, pace, emphasis, highlight, pronunciation, phonetics, stress, breath marks, staccato, legato, energy, melody, edit points, speaker/archetype metadata, aside, rhetorical turns, building delivery, sarcasm, loud, soft, whisper, warm, urgent, and related emotion cues.\n\nIn the editor, TPS authoring stays readable while Monaco colors cue tags, underlines articulation, and keeps pronunciation and delivery hints visible beside the clean script text.\n\n![TPS cue styling in the editor](docs/screenshots/readme/tps-editor-cues.png)\n\nIn the teleprompter, the clean reading line keeps those cues visible through music-inspired reading marks: pace changes affect timing and word shape, slower cues widen the word, faster cues keep bounded non-overlapping tracking, loud cues get larger and weightier, building delivery adds a crescendo-style hairpin, breath and pause cues read like rests, legato uses a music-like slur, staccato uses dots, and energy or melody adds stronger visual rhythm without exposing raw TPS tags. The notation model follows common score-reading conventions for slurs, staccato, and crescendo hairpins from music notation references such as [List of musical symbols](https://en.wikipedia.org/wiki/List_of_musical_symbols) and [Music Theory Academy's dynamics guide](https://www.musictheoryacademy.com/how-to-read-sheet-music/dynamics/).\n\n![TPS cue styling in the teleprompter](docs/screenshots/readme/tps-teleprompter-cues.png)\n\nThe screenshot matrix below is generated from `starter-tps-cue-matrix.tps`. Each row uses one plain reader card, one normal sentence, and one isolated cue scope. The central focus word names the cue whenever possible, for example `[sad]sad[/sad]`, plus phrase-span examples where TPS tags intentionally wrap a short cue phrase.\n\n| TPS cue | Reader meaning | Visible reader treatment | Reader screenshot |\n| --- | --- | --- | --- |\n| Structure baseline | Plain block text with no inline cue | Shows the clean reading sentence and segmented card shape without raw TPS headers | \u003cimg src=\"docs/screenshots/readme/tps-cues/01-structure-baseline.png\" alt=\"Structure baseline reader screenshot\" width=\"360\"\u003e |\n| `/` | Short pause before the next word | Adds one compact rest marker before the central word while keeping the spoken word clean | \u003cimg src=\"docs/screenshots/readme/tps-cues/02-pause-slash.png\" alt=\"Slash pause reader screenshot\" width=\"360\"\u003e |\n| `//` | Stronger short pause before the next word | Adds one visible rest marker before the central word without exposing the slash text | \u003cimg src=\"docs/screenshots/readme/tps-cues/03-pause-double-slash.png\" alt=\"Double slash pause reader screenshot\" width=\"360\"\u003e |\n| `[pause:500ms]` | Explicit half-second rest | Renders a pause cue before the central word and preserves phrase spacing | \u003cimg src=\"docs/screenshots/readme/tps-cues/04-pause-500ms.png\" alt=\"500 millisecond pause reader screenshot\" width=\"360\"\u003e |\n| `[pause:1s]` | Explicit one-second rest | Renders a pause cue before the central word and keeps the next word readable | \u003cimg src=\"docs/screenshots/readme/tps-cues/05-pause-1s.png\" alt=\"One second pause reader screenshot\" width=\"360\"\u003e |\n| `[breath]` | Breath cue | Renders a breath rest before the central word without turning the cue into spoken text | \u003cimg src=\"docs/screenshots/readme/tps-cues/06-breath.png\" alt=\"Breath cue reader screenshot\" width=\"360\"\u003e |\n| `[xslow]` | Extra-slow pace | Broadens the central word with restrained open tracking and slower timing | \u003cimg src=\"docs/screenshots/readme/tps-cues/07-speed-xslow.png\" alt=\"Xslow cue reader screenshot\" width=\"360\"\u003e |\n| `[slow]` | Slow pace | Opens the central word with subtle tracking while preserving normal readable gaps | \u003cimg src=\"docs/screenshots/readme/tps-cues/08-speed-slow.png\" alt=\"Slow cue reader screenshot\" width=\"360\"\u003e |\n| `[normal]` | Reset to normal pace | Returns the central word to the base pace treatment | \u003cimg src=\"docs/screenshots/readme/tps-cues/09-speed-normal.png\" alt=\"Normal pace cue reader screenshot\" width=\"360\"\u003e |\n| `[fast]` | Fast pace | Tightens the central word with compact tracking and faster timing | \u003cimg src=\"docs/screenshots/readme/tps-cues/10-speed-fast.png\" alt=\"Fast cue reader screenshot\" width=\"360\"\u003e |\n| `[xfast]` | Extra-fast pace | Makes the central word visibly narrower without colliding with neighbors | \u003cimg src=\"docs/screenshots/readme/tps-cues/11-speed-xfast.png\" alt=\"Xfast cue reader screenshot\" width=\"360\"\u003e |\n| `[180WPM]` | Explicit WPM pace | Maps the central word to a measured fast timing and compact spacing contract | \u003cimg src=\"docs/screenshots/readme/tps-cues/12-speed-180wpm.png\" alt=\"180 WPM cue reader screenshot\" width=\"360\"\u003e |\n| `[loud]` | Strong vocal intensity | Makes the central word visibly larger and weightier with a warmer projected tone | \u003cimg src=\"docs/screenshots/readme/tps-cues/13-volume-loud.png\" alt=\"Loud cue reader screenshot\" width=\"360\"\u003e |\n| `[soft]` | Softer delivery | Uses a smaller, lighter, cooler treatment while keeping the central word legible | \u003cimg src=\"docs/screenshots/readme/tps-cues/14-volume-soft.png\" alt=\"Soft cue reader screenshot\" width=\"360\"\u003e |\n| `[whisper]` | Whispered delivery | Uses a smaller, airy italic treatment with subdued opacity and dotted texture | \u003cimg src=\"docs/screenshots/readme/tps-cues/15-volume-whisper.png\" alt=\"Whisper cue reader screenshot\" width=\"360\"\u003e |\n| `[warm]` | Warm emotional tone | Tints the central word with an amber/orange warm treatment | \u003cimg src=\"docs/screenshots/readme/tps-cues/16-emotion-warm.png\" alt=\"Warm emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[urgent]` | Urgent emotional tone | Gives the central word a red/crimson urgent treatment | \u003cimg src=\"docs/screenshots/readme/tps-cues/17-emotion-urgent.png\" alt=\"Urgent emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[excited]` | Excited emotional tone | Gives the central word a magenta/violet excited treatment | \u003cimg src=\"docs/screenshots/readme/tps-cues/18-emotion-excited.png\" alt=\"Excited emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[happy]` | Happy emotional tone | Tints the central word for upbeat delivery | \u003cimg src=\"docs/screenshots/readme/tps-cues/19-emotion-happy.png\" alt=\"Happy emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[sad]` | Sad emotional tone | Tints the central word with a lower-intensity mood | \u003cimg src=\"docs/screenshots/readme/tps-cues/20-emotion-sad.png\" alt=\"Sad emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[calm]` | Calm emotional tone | Keeps the central word muted and steady | \u003cimg src=\"docs/screenshots/readme/tps-cues/21-emotion-calm.png\" alt=\"Calm emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[energetic]` | Energetic emotional tone | Gives the central word a stronger active treatment | \u003cimg src=\"docs/screenshots/readme/tps-cues/22-emotion-energetic.png\" alt=\"Energetic emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[professional]` | Professional emotional tone | Keeps the central word controlled and formal | \u003cimg src=\"docs/screenshots/readme/tps-cues/23-emotion-professional.png\" alt=\"Professional emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[focused]` | Focused emotional tone | Highlights the central word as concentrated delivery | \u003cimg src=\"docs/screenshots/readme/tps-cues/24-emotion-focused.png\" alt=\"Focused emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[concerned]` | Concerned emotional tone | Uses a concerned tint on the central word | \u003cimg src=\"docs/screenshots/readme/tps-cues/25-emotion-concerned.png\" alt=\"Concerned emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[motivational]` | Motivational emotional tone | Gives the central word an encouraging emphasis | \u003cimg src=\"docs/screenshots/readme/tps-cues/26-emotion-motivational.png\" alt=\"Motivational emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[neutral]` | Neutral tone reset | Gives the central word a readable silver neutral treatment without decorative emotion color | \u003cimg src=\"docs/screenshots/readme/tps-cues/27-emotion-neutral.png\" alt=\"Neutral emotion cue reader screenshot\" width=\"360\"\u003e |\n| `[aside]` | Aside delivery shape | Gives the central word a delivery-specific aside cue | \u003cimg src=\"docs/screenshots/readme/tps-cues/28-delivery-aside.png\" alt=\"Aside delivery cue reader screenshot\" width=\"360\"\u003e |\n| `[rhetorical]` | Rhetorical delivery shape | Marks the central word with a rhetorical treatment | \u003cimg src=\"docs/screenshots/readme/tps-cues/29-delivery-rhetorical.png\" alt=\"Rhetorical delivery cue reader screenshot\" width=\"360\"\u003e |\n| `[building]` | Building delivery shape | Adds a crescendo-style hairpin and progressive weight so delivery can rise through the phrase | \u003cimg src=\"docs/screenshots/readme/tps-cues/30-delivery-building.png\" alt=\"Building delivery cue reader screenshot\" width=\"360\"\u003e |\n| `[sarcasm]` | Sarcastic delivery shape | Marks the central word with a sarcastic delivery cue | \u003cimg src=\"docs/screenshots/readme/tps-cues/31-delivery-sarcasm.png\" alt=\"Sarcasm delivery cue reader screenshot\" width=\"360\"\u003e |\n| `[legato]` | Smooth articulation | Adds a music-like curved slur below the central word | \u003cimg src=\"docs/screenshots/readme/tps-cues/32-articulation-legato.png\" alt=\"Legato articulation cue reader screenshot\" width=\"360\"\u003e |\n| `[staccato]` | Clipped articulation | Adds clipped music-like dots below the central word | \u003cimg src=\"docs/screenshots/readme/tps-cues/33-articulation-staccato.png\" alt=\"Staccato articulation cue reader screenshot\" width=\"360\"\u003e |\n| `[energy:8]` | High intensity contour | Adds stronger energy weight and rhythm to the central word | \u003cimg src=\"docs/screenshots/readme/tps-cues/34-contour-energy.png\" alt=\"Energy contour cue reader screenshot\" width=\"360\"\u003e |\n| `[melody:3]` | Melodic movement | Adds a subtle melodic contour to the central word | \u003cimg src=\"docs/screenshots/readme/tps-cues/35-contour-melody.png\" alt=\"Melody contour cue reader screenshot\" width=\"360\"\u003e |\n| `[highlight]` | Editorial highlight | Uses a shaped translucent marker background behind the cue word without broken half-height fills | \u003cimg src=\"docs/screenshots/readme/tps-cues/36-editorial-highlight.png\" alt=\"Highlight cue reader screenshot\" width=\"360\"\u003e |\n| `[emphasis]` | Editorial emphasis | Uses a stronger word shape and weight treatment without connector underlines between words | \u003cimg src=\"docs/screenshots/readme/tps-cues/37-editorial-emphasis.png\" alt=\"Emphasis cue reader screenshot\" width=\"360\"\u003e |\n| Markdown bold | Strong editorial emphasis | Shows a heavier bold word shape without raw markdown markers | \u003cimg src=\"docs/screenshots/readme/tps-cues/38-markdown-bold.png\" alt=\"Markdown bold reader screenshot\" width=\"360\"\u003e |\n| Markdown italic | Light editorial emphasis | Shows a visibly slanted italic word shape without raw markdown markers | \u003cimg src=\"docs/screenshots/readme/tps-cues/39-markdown-italic.png\" alt=\"Markdown italic reader screenshot\" width=\"360\"\u003e |\n| `[pronunciation:/prəˌnʌnsiˈeɪʃən/]` | Pronunciation note | Uses the guide itself as the primary reader text and keeps the original spelling as compact secondary context | \u003cimg src=\"docs/screenshots/readme/tps-cues/40-guide-pronunciation.png\" alt=\"Pronunciation guide reader screenshot\" width=\"360\"\u003e |\n| `[phonetic:/fəˈnɛtɪk/]` | Phonetic note | Uses the phonetic guide itself as the primary reader text and keeps the original spelling as compact secondary context | \u003cimg src=\"docs/screenshots/readme/tps-cues/41-guide-phonetic.png\" alt=\"Phonetic guide reader screenshot\" width=\"360\"\u003e |\n| `[stress:rising]` | Stress guide | Adds a stress mark and dedicated double stress stroke so rehearsal stress is separate from emphasis and bold | \u003cimg src=\"docs/screenshots/readme/tps-cues/42-guide-stress.png\" alt=\"Stress guide reader screenshot\" width=\"360\"\u003e |\n| `[edit_point]` | Production cut point | Stays out of the spoken word while leaving a compact standard edit marker before the next word | \u003cimg src=\"docs/screenshots/readme/tps-cues/43-edit-point.png\" alt=\"Edit point reader screenshot\" width=\"360\"\u003e |\n| `[edit_point:medium]` | Medium production cut point | Stays out of the spoken line and adds a stronger medium-priority edit marker | \u003cimg src=\"docs/screenshots/readme/tps-cues/44-edit-point-medium.png\" alt=\"Medium edit point reader screenshot\" width=\"360\"\u003e |\n| `[edit_point:high]` | High production cut point | Stays out of the spoken line and adds the strongest high-priority edit marker | \u003cimg src=\"docs/screenshots/readme/tps-cues/45-edit-point-high.png\" alt=\"High edit point reader screenshot\" width=\"360\"\u003e |\n| `Speaker:Narrator` | Speaker metadata | Keeps persona metadata in validation, graph, and optional chrome without raw reader text | \u003cimg src=\"docs/screenshots/readme/tps-cues/46-metadata-speaker.png\" alt=\"Speaker metadata reader screenshot\" width=\"360\"\u003e |\n| `Archetype:Coach` | Archetype metadata | Keeps delivery persona metadata for validation, graph, and assistant context without decorative reader styling | \u003cimg src=\"docs/screenshots/readme/tps-cues/47-metadata-archetype.png\" alt=\"Archetype metadata reader screenshot\" width=\"360\"\u003e |\n| `[slow]slow cadence[/slow]` | Phrase pace span | Applies the same slow timing and open tracking across a two-word cue phrase | \u003cimg src=\"docs/screenshots/readme/tps-cues/48-phrase-speed-slow.png\" alt=\"Slow phrase reader screenshot\" width=\"360\"\u003e |\n| `[urgent]urgent cadence[/urgent]` | Phrase emotion span | Applies the urgent color treatment across a two-word cue phrase | \u003cimg src=\"docs/screenshots/readme/tps-cues/49-phrase-emotion-urgent.png\" alt=\"Urgent phrase reader screenshot\" width=\"360\"\u003e |\n| `[loud]loud cadence[/loud]` | Phrase volume span | Applies stronger vocal weight and tone across a two-word cue phrase | \u003cimg src=\"docs/screenshots/readme/tps-cues/50-phrase-volume-loud.png\" alt=\"Loud phrase reader screenshot\" width=\"360\"\u003e |\n| `[building]building cadence[/building]` | Phrase delivery span | Applies one crescendo-style hairpin and progressive build treatment across the two-word cue phrase | \u003cimg src=\"docs/screenshots/readme/tps-cues/51-phrase-delivery-building.png\" alt=\"Building phrase reader screenshot\" width=\"360\"\u003e |\n| `[legato]legato cadence[/legato]` | Phrase articulation span | Applies one smooth legato slur across the two-word cue phrase | \u003cimg src=\"docs/screenshots/readme/tps-cues/52-phrase-articulation-legato.png\" alt=\"Legato phrase reader screenshot\" width=\"360\"\u003e |\n| `[energy:1]` | Low intensity contour | Shows the restrained floor of the energy contour so quiet energy still reads differently from neutral text | \u003cimg src=\"docs/screenshots/readme/tps-cues/53-contour-energy-low.png\" alt=\"Low energy contour reader screenshot\" width=\"360\"\u003e |\n| `[energy:5]` | Mid intensity contour | Shows the middle energy contour weight used for steady projected delivery | \u003cimg src=\"docs/screenshots/readme/tps-cues/54-contour-energy-mid.png\" alt=\"Mid energy contour reader screenshot\" width=\"360\"\u003e |\n| `[energy:10]` | Peak intensity contour | Shows the strongest energy contour weight and rhythm without letting the word spill into its neighbors | \u003cimg src=\"docs/screenshots/readme/tps-cues/55-contour-energy-peak.png\" alt=\"Peak energy contour reader screenshot\" width=\"360\"\u003e |\n| `[melody:1]` | Low melodic contour | Shows the lightest melodic contour so melodic marks stay visible even at the soft end of the range | \u003cimg src=\"docs/screenshots/readme/tps-cues/56-contour-melody-low.png\" alt=\"Low melody contour reader screenshot\" width=\"360\"\u003e |\n| `[melody:5]` | Mid melodic contour | Shows the center melodic contour used for readable pitch movement | \u003cimg src=\"docs/screenshots/readme/tps-cues/57-contour-melody-mid.png\" alt=\"Mid melody contour reader screenshot\" width=\"360\"\u003e |\n| `[melody:10]` | Peak melodic contour | Shows the strongest melodic contour while keeping the phrase readable at README scale | \u003cimg src=\"docs/screenshots/readme/tps-cues/58-contour-melody-peak.png\" alt=\"Peak melody contour reader screenshot\" width=\"360\"\u003e |\n\nThe full implemented rendering contract, animation constraints, and verification evidence are recorded in [TPS Cue Rendering Specification](TPS_CUE_RENDERING_PLAN.md).\n\n---\n\n### First-Run Onboarding\n\nThe app now opens with a guided first-run tour instead of expecting you to infer the workflow from the chrome. It explains what PrompterOne is for, why TPS exists, what RSVP rehearsal does, how the editor differs from Learn and Teleprompter, and what Go Live is responsible for in the browser-owned studio flow.\n\nThe tour is localized, can be dismissed if you already know the app, and can be reopened later from Settings when you need the full product map again.\n\n---\n\n### RSVP Rehearsal (Learn)\n\n**Learn** is the rehearsal surface. It presents one word at a time using RSVP (Rapid Serial Visual Presentation) with an ORP-style focal point so the eye lands in a predictable place even as word lengths change.\n\nContext rails show nearby words without clipping into the focal lane, phrase-aware pauses come from the TPS source, and speed is adjustable while you rehearse. Step controls, loop mode, stop-at-end behavior, and sentence-local context make it useful for both memorization and pacing work before you step into the reader.\n\n![Learn](docs/screenshots/readme/learn.png)\n\n---\n\n### Teleprompter\n\nThe delivery surface. Large readable text, phrase-aware emphasis, adjustable font size, adjustable reader width, and a focal guide you can reposition without leaving the route. TPS formatting carries through here too: speed modifiers affect timing while preserving readable word gaps, inline emphasis stays intact, punctuation is attached correctly, and emphasis groups stay continuous instead of breaking word by word.\n\nA live camera feed can run behind the reader as a background layer, and the operator controls stay on-screen: horizontal mirror, vertical mirror, reader orientation toggle, browser fullscreen, font controls, width controls, focal positioning, segmented block progress, and transport-style playback controls all live inside the same reader shell. Smooth block-to-block transitions keep the reading flow readable in both forward and backward navigation.\n\nReader preferences persist between sessions, so your chosen layout, focal position, mirrors, and camera background do not have to be rebuilt every time.\n\n![Teleprompter](docs/screenshots/readme/teleprompter.png)\n\n---\n\n### Go Live\n\nA browser-owned studio session. PrompterOne captures a composed program feed directly in the browser, so canvas composition, audio monitoring, and source switching stay client-side.\n\n**Local recording** saves the composed feed to a file on your machine and is the strongest part of the current live stack. **Remote publishing** is transport-aware through [LiveKit](https://livekit.io/) and [VDO.Ninja](https://vdo.ninja/): the browser keeps one real upstream transport path active for a session, and downstream targets are routed or blocked according to what that transport can actually service.\n\nDistribution targets such as YouTube, Twitch, and custom RTMP are capability-gated: unsupported paths are blocked instead of being faked. PrompterOne does not hide a private relay tier behind the UI. The browser remains the only app runtime.\n\n| Settings | Go Live |\n| :---: | :---: |\n| ![Settings](docs/screenshots/readme/settings.png) | ![Go Live](docs/screenshots/readme/go-live.png) |\n\n---\n\n### Settings\n\nSettings holds the operational state for the rest of the app: appearance, browser language, cloud snapshot targets, camera selection with preview, microphone setup with live meters, delay and sync offsets, output quality profiles, recording defaults, minimal AI provider preferences, transport credentials, and onboarding restart. AI provider setup stays intentionally small: choose one active provider, enter only the endpoint or base URL when needed, the API key when needed, and the model or deployment names you actually use. Theme changes and layout preferences persist, and appearance changes propagate across tabs instead of drifting out of sync.\n\n---\n\n### Localization\n\nPrompterOne negotiates the initial language from your browser and remembers your explicit choice after that. The routed chrome, onboarding, diagnostics, settings, library actions, editor command surfaces, cloud sync status, AI Spotlight shell, and core reader controls all use the shared localization catalog across English, German, Spanish, French, Italian, Portuguese, and Ukrainian. Technical protocol names, API-key examples, and product brand text stay intentionally unlocalized.\n\n## The Full Flow\n\n```mermaid\ngraph LR\n    A[\"Library\u003cbr/\u003e\u003csub\u003ebrowse \u0026 organize\u003c/sub\u003e\"] --\u003e B[\"Editor\u003cbr/\u003e\u003csub\u003ewrite with TPS markup\u003c/sub\u003e\"]\n    B --\u003e C[\"Learn\u003cbr/\u003e\u003csub\u003erehearse at speed\u003c/sub\u003e\"]\n    C --\u003e D[\"Teleprompter\u003cbr/\u003e\u003csub\u003eread on camera\u003c/sub\u003e\"]\n    D --\u003e E[\"Go Live\u003cbr/\u003e\u003csub\u003erecord \u0026 stream\u003c/sub\u003e\"]\n```\n\nEvery stage works with the same script. Pacing, emphasis, structure, and metadata you add in the editor show up in rehearsal, in the teleprompter, and in the live session. No re-importing, no copy-paste, no format conversion.\n\n## Product Status\n\nPrompterOne is in **active alpha**: the core authoring, rehearsal, reader, and local-recording flow is solid now; remote publishing and portability layers are still expanding.\n\n| Area | Status | Current reality |\n| --- | :---: | --- |\n| **Library** | ✅ | Script browsing, folder organization, create and move flows, workflow launchers, persisted browser storage |\n| **Editor** | ✅ | Monaco-native TPS authoring, front-matter hydration, metadata rail, floating formatting controls, in-document find, script graph tab, local autosave/history, syntax-aware cue rendering, responsive large-draft typing |\n| **Learn** | ✅ | ORP-aligned RSVP, phrase-aware timing, context rails, WPM controls, stepping, looping, punctuation-safe progression |\n| **Teleprompter** | ✅ | Reader width and font controls, focal positioning, TPS cue contour rendering, horizontal and vertical mirror toggles, orientation toggle, browser fullscreen, segmented progress, persisted layout |\n| **Onboarding** | ✅ | Localized first-run walkthrough plus Settings-driven tour restart |\n| **Settings** | ✅ | Appearance sync, browser language, media permissions, camera and mic setup, delay offsets, recording defaults, AI provider preferences, cloud snapshot forms, transport configuration |\n| **Local recording** | ✅ | Browser-side recording of the composed program feed with decodable video and audio |\n| **Localization** | ✅ | Browser-negotiated language, persisted manual override, shared resource parity across supported languages, localized onboarding, diagnostics, settings, library actions, editor command surfaces, AI Spotlight shell, and reader controls |\n| **Go Live studio shell** | ✅ | Source rails, scene switching, preview/program layout, runtime telemetry, session chrome, browser-owned operator workflow |\n| **VDO.Ninja transport** | 🟡 | Real transport-aware browser integration, with operational polish still expanding |\n| **LiveKit transport** | 🟡 | Real transport-aware browser integration and guest-path work, with operational polish still expanding |\n| **Distribution routing** | 🟡 | Targets are capability-gated and blocked when the selected transport cannot service them |\n| **Cloud storage snapshots** | 🟡 | Browser-local provider configuration ships now; broader import/export maturity is still expanding |\n| **AI provider execution** | ✅ | AI Spotlight runs a configured Microsoft Agent Framework agent with route/editor context, MCP-style tools, structured chat-plus-edit output, and exact range edit application; script graph analysis uses the configured LLM extractor before any explicit tokenizer fallback |\n| **Generic RTMP fan-out** | ❌ | Intentionally unsupported without a real upstream transport path |\n| **PrompterOne backend** | ❌ | By design: the browser is the only app runtime |\n\n## Roadmap\n\nThese are product directions, not release-date promises.\n\n**Near term:**\n- Remote publish polish for VDO.Ninja and LiveKit transport flows\n- Broader cloud portability for scripts, settings, and snapshots\n- More public documentation and real-world workflow examples\n\n**After that:**\n- Stronger guest and destination-routing workflows on top of the browser studio\n- More agent-callable editor, media, and streaming operations on top of the existing AI runtime\n- Deeper operational telemetry and operator ergonomics in Go Live\n\n## Quick Start\n\n**Requirements:** [.NET 10 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/10.0)\n\n```bash\ngit clone https://github.com/managedcode/PrompterOne.git\ncd PrompterOne\ndotnet run --project src/PrompterOne.Web\n```\n\nOr just open [app.prompter.one](https://app.prompter.one/) — no install needed.\n\n## Technology\n\nPrompterOne is a standalone [Blazor WebAssembly](https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor) app on [.NET 10](https://dotnet.microsoft.com/en-us/download/dotnet/10.0). The browser is the runtime: media capture, composition, recording, and transport-aware output happen through browser APIs such as MediaDevices, WebRTC, MediaRecorder, Web Audio, and Canvas. Transport integrations use [LiveKit](https://livekit.io/) and [VDO.Ninja](https://vdo.ninja/). Verification uses [TUnit](https://tunit.dev/), [bUnit](https://bunit.dev/), and [Playwright](https://playwright.dev/), with browser scenarios acting as the main release bar. Deployment is a static GitHub Pages build.\n\n## For Contributors\n\n```bash\ndotnet build ./PrompterOne.slnx -warnaserror\ndotnet test @./tests/dotnet-test-progress.rsp --solution ./PrompterOne.slnx\ndotnet format ./PrompterOne.slnx\ndotnet test @./tests/dotnet-test-progress.rsp --project ./tests/PrompterOne.Core.Tests/PrompterOne.Core.Tests.csproj --coverage --coverage-output-format cobertura\ndotnet test @./tests/dotnet-test-progress.rsp --project ./tests/PrompterOne.Web.Tests/PrompterOne.Web.Tests.csproj --coverage --coverage-output-format cobertura\ndotnet test @./tests/dotnet-test-progress.rsp --project ./tests/PrompterOne.Web.UITests.Shell/PrompterOne.Web.UITests.Shell.csproj --coverage --coverage-output-format cobertura\ndotnet test @./tests/dotnet-test-progress.rsp --project ./tests/PrompterOne.Web.UITests.Studio/PrompterOne.Web.UITests.Studio.csproj --coverage --coverage-output-format cobertura\ndotnet test @./tests/dotnet-test-progress.rsp --project ./tests/PrompterOne.Web.UITests.Editor/PrompterOne.Web.UITests.Editor.csproj --coverage --coverage-output-format cobertura\ndotnet test @./tests/dotnet-test-progress.rsp --project ./tests/PrompterOne.Web.UITests.Reader/PrompterOne.Web.UITests.Reader.csproj --coverage --coverage-output-format cobertura\n```\n\nArchitecture and ownership boundaries are documented in [docs/Architecture.md](docs/Architecture.md). Each project has a local `AGENTS.md` that describes purpose, entry points, and rules for that area. Feature docs live in [docs/Features/](docs/Features/).\n\n## Credits\n\n- [LiveKit](https://livekit.io/) and [VDO.Ninja](https://vdo.ninja/) for transport infrastructure\n- [cameron/squirt](https://github.com/cameron/squirt) for RSVP inspiration\n- [Inter](https://rsms.me/inter/), [JetBrains Mono](https://www.jetbrains.com/lp/mono/), [Playfair Display](https://fonts.google.com/specimen/Playfair+Display)\n- [Feather Icons](https://feathericons.com/)\n- Deployed on [GitHub Pages](https://docs.github.com/en/pages)\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanagedcode%2Fprompterone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmanagedcode%2Fprompterone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanagedcode%2Fprompterone/lists"}