Skip to content

kryptonmediagroup/skribe

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

69 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Screenshot_20260427_123730

Skribe - A Parallel Workflow for Scrivener

A personal, cross-platform writing environment in the spirit of Scrivener 3. Built with Python 3 and PySide6 (Qt 6), so it runs on Linux, macOS, Windows, and the Raspberry Pi 5. Skribe is intended as a parallel work flow to Scrivener, allowing you to read, modify and write Scrivener files as part of your work flow as a novelist or writer of short stories on systems that would not ordinarily support Scrivener. My feeling is that having Skribe accessible might actually influence people to buy Scrivener where they otherwise wouldn't, because while cannot supplant the original, it does branch part of the Scrivener writer's workflow into a Linux environment.

Skribe is deliberately a small subset of Scrivener — the features one writer actually reaches for, day in and day out, with none of the screenplay/teleplay, format-preset, or section-layout machinery. When something needs that level of polish, the Export to Scrivener path round-trips the project so the heavy lifting can happen there.

Capabilities at a glance

Project structure

  • Three-pane layout: binder on the left, editor in the middle, inspector + comments on the right.
  • Standard binder containers — Manuscript, Research, Trash — plus arbitrary nested folders and text items.
  • Drag-and-drop reorder/reparent inside the binder.
  • Corkboard view for any folder (Ctrl+2), showing children as synopsis cards.

Rich-text editor

  • Headings, bold/italic/underline, bulleted/numbered lists, alignment.
  • Configurable default font, first-line paragraph indent, and paragraph spacing.
  • Auto-indent: every new paragraph inherits the configured indent.
  • Per-document cursor position is saved on every project switch.
  • The edit pane is zoomable, with apparent font size chageable on the fly for the best writing and editing experience.
  • Supports text to speech - hear your wondrous prose spoken aloud. Great for finding problems with phrasing, missing words or repetition. Powered by KittenTTS, a tiny CPU-only neural voice (no GPU, runs on the Pi); pick from eight voices and set the speaking rate on the Speech tab of Preferences. Trigger it with Read Selection (Ctrl+Shift+R) or the right-click menu.
  • Typographic substitutions as you type: straight quotes become contextual curly quotes, -- becomes an em dash (—), and a hyphen flanked by spaces becomes an en dash (–). Each is independently toggleable on the Editor tab of Preferences. Hold Ctrl while pressing ' or " to insert a literal straight quote; for an unconverted dash, hit Ctrl+Z right after the substitution to roll it back without losing the keystrokes. A one-shot Tools → Convert Straight Quotes to Smart… sweeps existing project content (HTML-aware; idempotent).

Spell-check

  • Inline spell-check via pyenchant + hunspell (red-underline highlighter).
  • Right-click for suggestions, Add to Dictionary, and Ignore.
  • Per-user personal dictionary; language is configurable.

Comments

  • Anchored, ranged comments with author/initials, body text, and a yellow highlight.
  • Right-rail comments panel is in lockstep with the editor; deleting the highlight deletes the card.
  • DOCX export carries comments as native Word annotations; RTF export uses standard RTF annotation groups.

Project-wide search (Ctrl+Shift+F)

  • Search tab in the binder area with a magnifier shortcut in the corner of the tab bar.
  • Scope: All / Title / Text / Synopsis.
  • Operator: Any Word / All Words / Exact Phrase / Whole Word / RegEx.
  • Options: Match case, Invert results.
  • Results list shows match counts; clicking a result opens the document with the cursor on the first hit and every match overlaid in cyan via QTextEdit ExtraSelections (the document is never modified — closing the search tab clears the overlay).

Compile (Ctrl+Shift+E)

A "Compile Overview"-style dialog that walks the Manuscript subtree, concatenates each item with its title as an <h1> and CSS page breaks between chapters, then dispatches the resulting HTML to:

  • Print and PDF via Qt's QPrinter.
  • Web Page (.html) as a direct write.
  • Plain Text (.txt) via Qt's plain-text projection.
  • Rich Text (.rtf), DOCX, ODT, ePub 2 Ebook, ePub 3 Ebook via pandoc.

Optional title-page front matter (Title / Subtitle / Author). Per-item Include in Compile checkboxes persist back to the project.

Per-document import/export

  • Import: Markdown, HTML, plain text, DOCX, ODT, RTF (via pandoc), and legacy .doc (via LibreOffice).
  • Export: TXT, RTF, DOCX, ODT, and legacy DOC.

Scrivener round-trip

  • Import any Scrivener 3 .scriv bundle (Windows or Mac), preserving the binder tree, UUIDs, synopses, IncludeInCompile / Label / Status metadata, and document bodies (RTF → HTML via pandoc, with a striprtf fallback).
  • Export any Skribe project back out to a Scrivener 3-compatible .scriv bundle. Bodies render as standalone RTF documents Scrivener reads correctly; comments are emitted as standard RTF annotation groups.

Statistics

Word count, character count (with and without spaces), paragraphs, sentences, document count, longest/shortest/average document, paperback page estimate, and reading-time projection — for the whole project, current selection, or any subtree.

Themes & settings

  • Light and dark themes that propagate to the editor palette.
  • Persistent settings (recent projects, last-opened, fonts, indents, theme, spellcheck language, etc.).
  • First-run dialog establishes baseline preferences; the Preferences dialog mirrors them afterward.

Requirements

  • Python 3.11+
  • PySide6 ≥ 6.7
  • lxml, striprtf, pyenchant (see requirements.txt)
  • pandoc on the system PATH for DOCX/ODT/RTF/EPUB conversion (Print, PDF, HTML, and TXT compile work without it).
  • LibreOffice (soffice) for legacy .doc import/export.
  • hunspell dictionaries for spell-check (e.g., hunspell-en-us).
  • KittenTTS (installed via requirements.txt) for text-to-speech; the voice model downloads from Hugging Face on first use. Playback uses aplay (ALSA) on Linux.

Installation

# Create a venv at the location run.sh expects
python3 -m venv "$HOME/skribe/.venv"
"$HOME/skribe/.venv/bin/pip" install -r requirements.txt

Override with SKRIBE_VENV=/path/to/venv if you'd rather keep the venv elsewhere.

Running

./run.sh

run.sh simply execs python -m skribe from the configured venv.

Packaging a standalone binary

Skribe ships a PyInstaller spec (skribe.spec) that produces a single self-contained executable per platform — no Python install required on the target machine.

"$HOME/skribe/.venv/bin/pip" install pyinstaller
"$HOME/skribe/.venv/bin/pyinstaller" skribe.spec --clean
# → dist/Skribe/        (folder distribution; binary is dist/Skribe/Skribe)
# → dist/Skribe.app     (additionally, on macOS)

A few caveats:

  • No cross-compile. Build on each target OS — Windows, macOS, Linux x86_64, and Linux aarch64 (Raspberry Pi 5) — using the same spec.
  • External binaries are not bundled. pandoc, LibreOffice (soffice), and hunspell dictionaries must still be installed on the target machine.
  • Native icons are optional. Drop skribe.ico (Windows) or skribe.icns (macOS) into skribe/resources/icons/ and the spec picks them up automatically; otherwise the OS uses a generic app icon and the in-app QApplication icon (the SVG) takes over once the window is up.
  • UPX is off in the spec — it has a long history of corrupting Qt binaries on some platforms.

Project layout

skribe/
├── app.py                  # entry point; sets up QApplication and icon
├── main_window.py          # three-pane shell, menus, action wiring
├── settings.py             # QSettings-backed preferences
├── themes.py               # light/dark palettes
├── stats.py                # word/sentence/page metrics
├── spellcheck.py           # pyenchant wrapper
├── model/                  # Project, BinderItem, BinderModel, Comment
├── ioformat/               # all import/export pipelines
│   ├── doc_convert.py      # pandoc / soffice wrappers
│   ├── doc_import.py       # per-document import
│   ├── doc_export.py       # per-document export (TXT/RTF/DOCX/ODT/DOC)
│   ├── compile_export.py   # whole-project compile pipeline
│   ├── scriv_import.py     # .scriv → .skribe importer
│   ├── scriv_export.py     # .skribe → .scriv exporter
│   └── skribe_io.py        # the .skribe bundle on-disk format
├── ui/                     # Qt widgets and dialogs
│   ├── editor.py           # rich-text editor + format toolbar
│   ├── binder_view.py      # left-rail tree
│   ├── corkboard_view.py   # synopsis-card grid
│   ├── inspector.py        # synopsis + Include-in-Compile
│   ├── comments_panel.py   # right-rail comment cards
│   ├── search_panel.py     # project-wide search tab
│   ├── compile_dialog.py   # "Compile Overview" dialog
│   ├── statistics.py       # stats dialog
│   ├── preferences.py      # preferences dialog
│   ├── first_run.py        # first-run setup
│   └── spell_highlighter.py
└── resources/
    ├── icons/
    │   └── skribe.svg      # application icon
    └── textures/
        └── cork.jpg        # corkboard background tile

skribe.spec at the repo root drives the PyInstaller build described above.

Status

Skribe is built for one writer's workflow on his own machines. There's no test suite, no plugin API, no release schedule. Bugs get fixed when they get in the way of writing.

License

Skribe is released under the GNU General Public License, version 3 (or, at your option, any later version).

About

Skribe - A Parallel Workflow Editor for Scrivener

Topics

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages