Skip to main content

Proseview

A local dashboard and AI harness for novelists who write in Markdown. โœ๏ธ

Proseview reads your manuscript folder, gives you a writer-grade view of its structure and prose, and turns the same surface into a place where you can read, edit, annotate, and bring an AI assistant to any paragraph without leaving the page.

It runs entirely on your machine. No cloud, no telemetry, no lock-in. Your files stay where they are.

CI status python platform license

The Proseview dashboard: word-count goal, writing streak, and recently modified files

๐Ÿ“ธ A look around

Read and revise, with editorial passes on

Nine prose passes highlight repetition, passive voice, filter verbs and more, right on the page you are reading.

A scene open in the reading view with four highlight passes enabled

Search the whole repository

Mod-K from anywhere. File paths, scene metadata, TODOs, notes, and prose, grouped by kind.

The search palette open over a scene, showing file, scene, and prose matches

Analytics that mean something

Character presence, sentence-rhythm bands, setting stickiness, and character co-occurrence charts

Screenshots use the bundled fixtures/demo-repo (four scenes), so the charts are deliberately small. Your book fills them in.

โœจ What you get

  • ๐Ÿ“Š Dashboard. Word count, chapter pacing, lexical health (MATTR / MTLD), sentence-rhythm variance, character presence, location stickiness, character co-occurrence, plus a sortable scene table.
  • ๐Ÿ“– Reading view. Open a scene as a typographic page with a real reader font. The dashboard chrome gets out of the way.
  • โœ๏ธ WYSIWYG editor. ProseMirror-backed. Same surface as the reading view, just with Edit toggled on. Mod-S saves. Conflict guard checks the file mtime so a concurrent change in your editor never gets silently overwritten.
  • ๐ŸŽจ Editorial highlights. Toggle nine prose passes on top of any scene: repetition, passive voice, filter verbs, crutch words, hyperbole, lyrical reach, sensory density, comedy beats, first-person rate. Each pass is a single click.
  • ๐Ÿ—’๏ธ Inline TODOs and Notes. Select a passage, drop a TODO or a tagged NOTE (continuity / character / theme / question), and it lands in the file as a Markdown comment. Survives in git.
  • ๐Ÿค– AI on the selection. Send the highlighted passage to Codex, Claude, or Gemini in one click. An in-browser terminal hosts the conversation; the agent can see the file, the selection, and your repo. Your tools, your prompts.
  • ๐Ÿ’ฌ Discuss with Codex. Open a document-aware conversation beside any scene or supported repository text file. Proseview sends the current document automatically and only adds selections, files, or folders you explicitly attach. Safe progress summaries, plans, tool activity, approval requests, and streamed answers stay visible while you read.
  • ๐Ÿงฐ In-browser terminal. xterm.js wired to a real PTY. Run codex, claude, or any shell command without leaving the dashboard. Tabs persist across page reloads.
  • ๐Ÿ” Live reload. Save a file in your editor and the dashboard picks up the change over Server-Sent Events. No manual refresh.
  • ๐Ÿ”— Deep links. Every scene and file has a URL. Copy the address bar to share or revisit a view. Back / forward work.
  • ๐Ÿ”Ž Repository search. Press Mod-K or choose Search from any dashboard, scene, or file view. File paths come from one repository-wide inventory; opening a result loads its preview lazily and reopening Search preserves the current query.
  • ๐ŸŽจ Themes and fonts. Light, Dark, Docsify, Hopscotch. Reader, Literary, Inter, Georgia, Baskerville, Sans, Mono.
  • ๐Ÿงช Tested. 400 tests: unit coverage of the analytics engine, scene parsing, save guards, history, and refresh behavior, plus end-to-end tiers that boot the real server and drive the real UI in a browser.

๐Ÿš€ Quick start

Requirements: Python 3.11+ on macOS or Linux. The server uses Unix-only APIs (fcntl, and a real PTY for the terminal), so Windows needs WSL.

git clone https://github.com/ourarash/proseview.git
cd proseview
pip install -r requirements.txt

# Run the dashboard against your novel repo
python -m proseview --root /path/to/your/novel

A browser tab will open at http://localhost:7842. Press Ctrl-C to stop.

If you'd rather install proseview as a tool:

pip install -e .
proseview --root /path/to/your/novel

๐Ÿ“ What proseview expects

A folder of Markdown scene files, one folder per chapter. The minimum viable repo:

my-novel/
โ”œโ”€โ”€ manuscript/
โ”‚   โ”œโ”€โ”€ ch01/
โ”‚   โ”‚   โ”œโ”€โ”€ 01-opening.md
โ”‚   โ”‚   โ””โ”€โ”€ 02-meeting.md
โ”‚   โ””โ”€โ”€ ch02/
โ”‚       โ””โ”€โ”€ 01-aftermath.md
โ””โ”€โ”€ .proseview.yaml          # optional

Scene files use simple frontmatter:

---
title: Opening
chapter: Chapter 1
status: draft
where: A bar in the West Village
when: Friday night, late
pov: Nima
characters: [Nima, Mira]
goal: Nima needs to get the question on the table
conflict: He's afraid she already has someone
outcome: She agrees to dinner; he leaves rattled
todos:
  - Tighten the opening paragraph
---

# Opening

The bar was loud and the music was bad...

Every field is optional. Proseview reads what's there and falls back gracefully on what isn't.

๐Ÿ“ Frontmatter contract

These are the keys proseview recognizes. Any other keys are passed through and ignored. Every field is optional.

Identity

  • title (string) header of the scene viewer; defaults to a Title-Case version of the filename stem.
  • chapter (string) "Chapter" column in the scene table and the chapter rows of charts; defaults to the chapter folder name.
  • status (string) color-coded status badge. Conventional values: draft, revision, done. Anything else renders as a generic chip; missing means unknown.

Scene context

  • where (string) "Where" row in the scene card. Also feeds the Setting Stickiness chart (Words per Location).
  • location (string) synonym for where (older convention).
  • when (string) "When" row in the scene card. Free-form.
  • pov (string) "POV" row in the scene card. Free-form.
  • characters (list of strings) "Characters" row in the scene card; each name is clickable to open the bio if <characters_path>/<name>.md exists. Also feeds the Character Presence and Co-occurrence charts.

Arc

  • goal (string) "Goal" row in the arc panel.
  • conflict (string) "Conflict" row in the arc panel.
  • outcome (string) "Outcome" row in the arc panel.

Tasks

  • todos (list of strings) each entry shows up as a frontmatter-level TODO in the Tasks panel. Inline <!-- TODO: ... --> comments inside the prose are picked up too and get a line anchor.

A scene with no frontmatter still renders, just with Unknown / Not defined placeholders in the scene card and the file's stem as its title.

โš™๏ธ Configuration

proseview works with zero config. Drop a .proseview.yaml at the repo root if you want to customize:

# Where the manuscript lives. Default: manuscript/
manuscript_path: manuscript/

# Where character bios live. Default: story-bible/characters
characters_path: story-bible/characters

# Where AI skill prompts live. Default: skills
skills_path: skills

# Word-count goal for the finished book.
target_words: 80000

# Daily word goal (drives the "days to finish" estimate).
daily_target: 500

# Healthy band for local lexical variety (MATTR).
mattr_band: [0.74, 0.77]

# Healthy band for whole-scene lexical variety (MTLD).
mtld_band: [105, 130]

# Editor URL handler. One of: vscode, cursor, zed, positron, custom.
editor:
  scheme: vscode

# Folders shown in the file tree alongside the manuscript.
repo_tab:
  folders: [plans, continuity, outline, story-bible, docs, templates]

Every key has a sensible default; missing folders are simply skipped.

๐Ÿง  The analytics

Lexical health is real, not vibes:

  • ๐Ÿ“ MATTR (moving-average type-token ratio, window 100). Measures local vocabulary variety. Low = the same words inside a paragraph; high = constant rotation that may feel jittery.
  • ๐Ÿ“ MTLD (measure of textual lexical diversity). Measures whole-scene variety. Low = the scene keeps circling the same ground; high = the scene keeps reaching.
  • ๐Ÿ“ Sentence rhythm. Per-chapter standard deviation of sentence length. Static / Rhythmic / Dynamic zones are annotated on the chart.
  • ๐Ÿ“ Dialogue percentage, passive voice rate, crutch-word rate, first-person density, sensory density, filter-verb rate, paragraph length.

Every scene gets a row in the deep-dive table; outliers get listed under Editorial Alerts with a one-line revision signal.

๐Ÿค Working with AI

Four places where AI shows up, all opt-in:

  1. Selection menu. Highlight any text in a scene. The pill that appears includes Add TODO, Add Note, and (if the corresponding tools are installed locally) Run in Codex and Skills. Skills are reusable prompts you keep in skills/<name>/SKILL.md; they show up automatically in the menu.

  2. Agent menu. From the scene header, launch a conversation with Codex, Claude, or Gemini scoped to that file. The conversation runs in the in-browser terminal so you can keep reading the prose underneath while the agent works.

  3. Discuss. Choose Discuss in a scene or text-file header for a document-aware conversation in the side dock. The document you are reading is attached to each question by default โ€” drop its chip to omit it, or press @ to attach other files and folders. Tool and file actions wait on approvals you can see.

    Under the hood it starts a local codex app-server on demand and uses your existing Codex login, model, and history. Proseview stores a bounded list of thread IDs and display metadata for each document in your state directory, and discards raw reasoning โ€” only Codex's own progress summaries reach the browser. History lets you reopen, rename, export, or remove a previous conversation. New conversation starts a blank discussion while keeping the previous one available there.

  4. TODOs as Markdown. Every TODO and Note is a plain <!-- TODO: ... --> or <!-- NOTE[tag]: ... --> comment in the scene file. Your AI assistant can see them through the file, your repo can track them through git, and you can grep them.

๐Ÿ›ฃ๏ธ Roadmap

This is alpha. Things that are working and things that are coming:

  • โœ… Live server, live reload, ProseMirror editor, highlights, TODOs, notes, deep links, in-browser terminal, agent menu, and document-aware Discuss conversations with Codex.
  • โœ… Vendored front-end dependencies. chart.js, marked, xterm and friends ship with the package and load from /vendor/. ProseMirror modules are pinned to specific versions on esm.sh.
  • โœ… Modularized front-end. The JS lives in twelve topical files under templates/assets/js/, concatenated at render time.
  • โœ… proseview init writes a starter .proseview.yaml so a fresh novel repo gets a working configuration with one command.
  • โœ… Persisted UI prefs. Your highlight-pass toggles and theme choices survive scene navigation and reloads.
  • ๐Ÿšง Diff-confirm for AI-suggested edits (selection runs in a terminal today; nothing applies edits without your approval, but the diff UX is still terminal-only).
  • ๐Ÿšง Configurable agent list (Codex / Claude / Gemini are presets today).
  • ๐Ÿšง Continuity surfacing (warn when a scene contradicts a known fact).
  • ๐Ÿšง Frontmatter editor (status, where, todos) inside the scene viewer so you don't need to drop into your text editor for routine fields.

See plans/roadmap.md for the full punch list.

๐Ÿงช Development

pip install -e ".[dev]"
pytest

That runs the unit suite plus an HTTP end-to-end tier that boots a real proseview subprocess and drives every endpoint โ€” saves and the conflict guard, TODOs and notes, the AI proposal bridge through the actual CLI, live reload over SSE, and PTY terminals โ€” asserting on bytes written to disk. Discuss integration tests use a deterministic fake app-server and isolated home/state directories; they never contact Codex, the network, or your profile. ~15 seconds, no extra dependencies.

A browser tier drives the real UI in Chromium (editor round-trip fidelity, the selection menu, highlight passes, deep links, agents, terminals, Discuss streaming/approvals/shared-dock behavior, and applying an AI proposal end to end). It's opt-in:

pip install -e ".[e2e]"
python -m playwright install chromium
pytest -m e2e_browser

Both tiers work on a throwaway copy of fixtures/demo-repo. See CONTRIBUTING.md for details.

๐Ÿ“œ License

MIT. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

proseview-0.1.1.tar.gz (398.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

proseview-0.1.1-py3-none-any.whl (369.0 kB view details)

Uploaded Python 3

File details

Details for the file proseview-0.1.1.tar.gz.

File metadata

  • Download URL: proseview-0.1.1.tar.gz
  • Upload date:
  • Size: 398.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for proseview-0.1.1.tar.gz
Algorithm Hash digest
SHA256 3cd82c4269649a91665a2125a19f9beafac2eeea50e6e3404c2615a845fd9070
MD5 b642920046894c3daa1c5010553a505b
BLAKE2b-256 bb95b0cdbb009db486b14eaea034c89299ba7054d62c9d054dc3660df73bf8ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for proseview-0.1.1.tar.gz:

Publisher: release.yml on ourarash/proseview

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file proseview-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: proseview-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 369.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for proseview-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 557dcbb4f2bacd7079dcf2a40105a728926395efc345f0cf30087f9a13910b1d
MD5 a87d172c901852deb5f467b8455c1be1
BLAKE2b-256 b9cf588fec5b7fb626edff40a464fe30590c743b988d46c5af2d3c9df3156539

See more details on using hashes here.

Provenance

The following attestation bundles were made for proseview-0.1.1-py3-none-any.whl:

Publisher: release.yml on ourarash/proseview

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page