Skip to main content

A writer-first terminal writing app

Project description

Prosaic

AI-DECLARATION: copilot Build License: MIT

A writer-first terminal writing app built with Python and Textual, built with the assistance of LLM/Copilot tools.

Landing page

Motivation

I write on multiple devices (an iPad, a laptop, even more), and I wanted a quick way to start every day, get some frontmatter ready for my daily pieces on journal.coffee, jot down notes and even work on books. I have tried several software, some stellar, some half-assed, some bloated, some minimal, but I felt like I needed something of my own.

So, I decided that the best way to go about it is to have a TUI. I can access it from anywhere, and mostly, it will do the job. This way, I can access it from a terminal app on the iPad or Windows (cue: Termix on a browser) and on the Macbook. Hence, Prosaic was born.

Full disclosure: I did rely on LLMs to make it, but as much as I could, I tried to get it to follow best practices, good architecture, and clean code principles.

Publish with Ode

Looking somewhere to publish your writing that is philosophically compatible with Prosaic? Check out Ode. You can also go to the GitHub directly.

Ode is for writers who want to publish in an aesthetically pleasing website, ignoring the bells and whistles of the modern internet. It is opinionated, minimal, and easy to use, guided by an Ethos that prioritizes the craft of writing and the joy of reading over metrics and engagement.

Screenshots

Installation

# Install (requires Python 3.11+)
pipx install prosaic-app

# Upgrade to latest version
pipx upgrade prosaic-app

# Run (first launch runs setup wizard)
prosaic

# Re-run setup wizard anytime
prosaic --setup

Usage

prosaic [OPTIONS] [FILE]
Option Description
--light Use light theme (default)
--dark Use dark theme
--profile <name> Use a specific profile
--profiles List all profiles
--setup Run setup wizard again
--reference Show reference
--license Show MIT license
--help Show help message

Open a file directly:

prosaic ~/writing/draft.md
prosaic --dark ~/writing/draft.md

Features

  • Markdown-first: Live outline, word counting
  • Focus mode: Hide everything except your writing
  • Reader mode: Distraction-free reading
  • Start writing: Quick writing session with all panes open
  • Continue writing: Resume your last edited document
  • Daily metrics: Track words and characters written each day
  • Profiles: Separate workspaces for different projects
  • Git-ready: Archive is Git-initialized for versioning

Profiles

Profiles let you maintain separate workspaces for different writing projects (personal, work, fiction, etc.).

# List profiles
prosaic --profiles

# Use a specific profile
prosaic --profile work

# Create a new profile (runs setup wizard)
prosaic --profile fiction

Each profile has its own:

  • Archive directory
  • Git remote (optional)
  • Theme preference

Manage profiles from the dashboard menu (m key) or edit in ~/.config/prosaic/settings.json.

Upgrading from v1.1.1 or older? Your existing setup is automatically preserved as the "default" profile. On first launch after upgrading, you'll be offered the option to set up additional profiles or rename your default.

Books

Books are long-form writing projects stored as directories in your archive's books/ folder.

my-book/
  chapters/               Individual chapter files
    chapter-one.md
    chapter-two.md
  chapters.md             Chapter reading order (one filename per line)
  manuscript.md           Auto-generated compilation (read-only)

Working on a book:

  1. Press b on the dashboard to open book selection
  2. Select an existing book or create a new one
  3. Select an existing chapter or create a new one
  4. The manuscript auto-compiles on every save and when you leave a chapter
  5. Press m in chapter selection to compile manually at any time

The manuscript is read-only in Prosaic — edit your chapters, not the manuscript directly.

Upgrading from v1.3.4 or older? Legacy books (single .md files) are automatically migrated to this structure on first open. Your original file is preserved with a .bak extension.

Keybindings

Category Key Action
Dashboard s Start writing (quick session)
Dashboard c Continue writing (if last file exists)
Dashboard p Write a piece
Dashboard b Work on a book
Dashboard n Add a note
Dashboard r Read notes
Dashboard f Find files
Dashboard ? Help
Dashboard m Manage profile
Dashboard q Quit
Editor Ctrl+e Toggle file tree
Editor Ctrl+o Toggle outline
Editor Ctrl+p Key palette
Editor Ctrl+s Save
Editor Ctrl+m Compile manuscript (books only)
Editor Ctrl+q Go home
Editor F1 Help
Editor F5 Focus mode
Editor F6 Reader mode
Editor F7 Toggle spell check
Writing Ctrl+z Undo
Writing Ctrl+y Redo
Writing Ctrl+x Cut
Writing Ctrl+c Copy
Writing Ctrl+v Paste
Writing Ctrl+a Select all
Writing Ctrl+k Toggle markdown comment

Pane Defaults

Mode Tree Outline
write a piece (default) shown hidden
start writing shown shown
add a note hidden shown
read notes hidden shown
work on a book hidden shown
focus mode hidden hidden
reader mode hidden hidden

Themes

  • Prosaic Light (default): Warm white background with brick accents
  • Prosaic Dark: Deep charcoal with warm tan accents
# Light mode (default)
prosaic

# Dark mode
prosaic --dark

Configuration

Config location (in order of priority):

  1. PROSAIC_CONFIG_DIR env var (explicit override)
  2. $XDG_CONFIG_HOME/prosaic/ (Linux standard)
  3. ~/.config/prosaic/ (default)

Override with environment variable:

PROSAIC_CONFIG_DIR=~/custom/path prosaic

Git Integration

If your chosen archive directory already contains a git repository, the wizard will:

  • Detect the existing .git directory
  • Inherit the repository (no re-initialization)
  • Read the remote URL if configured
  • Prompt for a remote URL if none exists
  • Store this info in settings.json

Example settings.json:

{
  "app_version": "1.2.1",
  "setup_complete": true,
  "active_profile": "default",
  "profiles": {
    "default": {
      "archive_dir": "/Users/you/Prosaic",
      "init_git": true,
      "git_remote": "git@github.com:you/writing.git",
      "theme": "light",
      "last_file": "/Users/you/Prosaic/pieces/2026-03-03-example.md"
    }
  }
}

Archive Structure

~/Prosaic/              # Default archive (configurable)
  pieces/               # Pieces with preloaded markdown frontmatter
  books/                # Long-form projects with Outline already open
  *.md                  # Drafts (loose files in root)
  notes.md              # Quick notes with auto date headers
  metrics.json          # Daily statistics for archival and display
  .git/                 # Version control

License

MIT

Project details


Download files

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

Source Distribution

prosaic_app-1.5.1.tar.gz (51.1 kB view details)

Uploaded Source

Built Distribution

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

prosaic_app-1.5.1-py3-none-any.whl (48.9 kB view details)

Uploaded Python 3

File details

Details for the file prosaic_app-1.5.1.tar.gz.

File metadata

  • Download URL: prosaic_app-1.5.1.tar.gz
  • Upload date:
  • Size: 51.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for prosaic_app-1.5.1.tar.gz
Algorithm Hash digest
SHA256 fe17f7eb4b7e2aea14cf65f403954736368513703653a02d93ace0769551a109
MD5 2d024a894a520c6cea528f12b905f818
BLAKE2b-256 3b09f8e12afcec5d325ef3c73153320c578eb2c3d37d6b36e3405cfec91d82f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for prosaic_app-1.5.1.tar.gz:

Publisher: publish.yml on DimwitLabs/Prosaic

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

File details

Details for the file prosaic_app-1.5.1-py3-none-any.whl.

File metadata

  • Download URL: prosaic_app-1.5.1-py3-none-any.whl
  • Upload date:
  • Size: 48.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for prosaic_app-1.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 114fa17f0402327978ef1f9adf5480de37f8b00619d9350df132c496ac31c024
MD5 d537d9af727528ce56b2e6be10da2030
BLAKE2b-256 e0ee2edbe3edcc26d2638761bf2fe9a3333cf6b70f6de957bbbee5ae21715155

See more details on using hashes here.

Provenance

The following attestation bundles were made for prosaic_app-1.5.1-py3-none-any.whl:

Publisher: publish.yml on DimwitLabs/Prosaic

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