Sitelet https://github.com/bobbyquantum/inkweld
Skip to content

Latest commit

Β 

History

2,292 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Inkweld

Inkweld

Self-hosted collaborative writing platform for novelists & worldbuilders
Your words, your server, your control.

Quick Start β€’ Features β€’ Status β€’ Architecture β€’ Development β€’ Contributing

MIT License Build Docker


Quick Start

# Pull and run with Docker
docker run -d \
  --name inkweld \
  -p 8333:8333 \
  -e HOST=0.0.0.0 \
  -e SESSION_SECRET=$(openssl rand -hex 32) \
  -e WEBAUTHN_RP_ID=your-domain.com \
  -e ALLOWED_ORIGINS=https://your-domain.com \
  -v inkweld_data:/data \
  ghcr.io/bobbyquantum/inkweld:latest

Then open http://localhost:8333 in your browser.

πŸ“– Full deployment guide β†’


Features

Write together, or alone. Work entirely in your browser with no server, keep writing across your devices through your own cloud storage, or connect to an Inkweld server for real-time collaboration.

Build your world as you write. Create characters, locations, factions β€” whatever your story needs. Link them together with relationships, and reference them directly in your prose with @mentions.

Own your data. Many hosting options are supported. Native sync server binaries (thanks to Bun), self contained Docker images, and support for Cloudflare free tier deployment.

Export when you're ready. PDF, EPUB, Markdown, HTML. Configurable publish plans let you publish multiple asset variants from a single project.

Three ways to use it

Browser Cloud Sync Realtime Sync
Where your writing lives This browser only Your own Dropbox or Nextcloud An Inkweld server
Account needed None Your cloud provider account Inkweld account on that server
Works offline βœ… βœ… (syncs when back online) βœ… (syncs when back online)
Use on several devices ⬜ βœ… βœ…
Real-time co-editing, presence, cursors ⬜ ⬜ βœ…
Share projects with collaborators ⬜ ⬜ βœ…
Version history & snapshots βœ… local βœ… synced βœ… synced
Media library & covers βœ… βœ… βœ…
Publishing (PDF, EPUB, HTML…) βœ… βœ… βœ…
AI features, MCP API keys ⬜ ⬜ βœ… (if the server enables them)
Backup Export archive Continuous mirror + export archive Server + export archive
Move to another mode later βœ… βœ… βœ…
Cost to run Free Free (your storage quota) Self-host, or a hosted server

πŸ“‹ Full feature roadmap β†’


Status

Unreleased

  • Can be deployed and used now, however, until numbered releases are started, there are no guarantees that data migration paths will be available.
  • Not recommended for production use. If you do use it in this way, always back up your work before upgrading, and be aware, manual fixing of exports might be needed to move to newer versions.
  • At some point closer to the first numbered release, the drizzle migrations will be squashed into a single V1 migration, meaning existing databases will need to be reset or manually fixed.

Feature Roadmap

Status: βœ… Done | πŸ”¨ In Progress | ⬜ Planned
Priority: πŸ”₯ High | 🟑 Medium | 🟒 Nice to have

Project Management

Status Priority Feature Notes
βœ… πŸ”₯ Home screen with project cards Browse and manage all projects
βœ… πŸ”₯ Drag-and-drop project tree Organize documents, folders, elements
βœ… πŸ”₯ Folder hierarchy Unlimited nesting depth
βœ… πŸ”₯ Project archives (import/export) Backup and restore entire projects
βœ… 🟑 Project renaming
βœ… 🟑 Context menus Right-click actions on tree items
βœ… 🟑 Home screen search Filter projects by name
βœ… 🟑 Project templates Start new projects from templates
βœ… 🟒 Project duplication Export & re-import with new name

Search & Navigation

Status Priority Feature Notes
βœ… πŸ”₯ Quick file open (Ctrl/Cmd + P)
βœ… πŸ”₯ Find in document (Ctrl/Cmd + F)
βœ… πŸ”₯ Mobile-responsive design
βœ… πŸ”₯ Project-wide search (Ctrl/Cmd + Shift + F) Full-text search across all documents
βœ… πŸ”₯ Find and replace in document
βœ… 🟑 Tag filtering in search Filter search results by tags, element types, relationships, and worldbuilding schemas
βœ… 🟑 Browse elements by tag Project search browse mode filters by tag; open from the Tags settings tab or the search dialog
βœ… 🟑 Breadcrumbs Folder path shown above each editor (document, folder, worldbuilding, canvas, relationship chart, timeline); toggle in user settings
βœ… 🟑 Pinning Pin elements to Home tab and sidebar for quick access
βœ… 🟒 Recent files list Tracks last 10 files per project

Writing Tools

Status Priority Feature Notes
βœ… πŸ”₯ Full keyboard shortcut support
βœ… πŸ”₯ Image insertion
βœ… 🟑 Zen mode (distraction-free)
βœ… 🟑 Document snapshots Version history for documents
βœ… 🟑 Comments/Annotations Inline feedback with threaded replies and resolution
βœ… 🟒 Writing statistics Daily word counts and session stats across projects, shown on your profile
βœ… πŸ”₯ Scenes & notes Prose documents are created as Scenes (manuscript, with synopsis/status/word target/story date) or Notes (research, front matter); POV and location as relationships
βœ… πŸ”₯ Corkboard & outline Open a folder to see its scenes as index cards (drag to reorder, edit synopsis and status in place) or as an outline table with word counts and totals

Worldbuilding

Status Priority Feature Notes
βœ… πŸ”₯ Custom element templates
βœ… πŸ”₯ Relationships with backlinks Bidirectional connections
βœ… πŸ”₯ Element references (@mentions)
βœ… 🟑 Tags on documents & elements Categorize and organize content
βœ… 🟑 Tags on images Extend tagging to media library
βœ… 🟑 Custom calendar systems Fantasy calendars with custom months/years
βœ… 🟑 Random generators Names, places and writing prompts; the worldbuilding templates ship five, bound to Character, Settlement, Building and Geographic Feature for a dice by the name field
⬜ 🟒 Language/Conlang tools Vocabulary lists, alphabets
⬜ 🟒 Secrets/GM notes Per-element spoiler hiding from some collaborators
⬜ 🟒 Reference images panel Side-by-side images while writing

Media Library

Status Priority Feature Notes
βœ… πŸ”₯ Local-first image storage Saved to IndexedDB, syncs to server
βœ… πŸ”₯ Inline image embedding Paste/drop images into documents
βœ… 🟑 Cover images Project and element covers
βœ… 🟑 Category filtering Filter by generated, inline, published, etc.
βœ… 🟑 Server sync Bi-directional sync when connected
βœ… 🟑 Image search/filtering Search within media library
⬜ 🟒 Bulk image operations Multi-select, batch delete

Collaboration

Status Priority Feature Notes
βœ… πŸ”₯ Real-time co-editing Multiple users editing same document
βœ… πŸ”₯ CRDT conflict resolution Yjs-based, no manual merge needed
βœ… πŸ”₯ Presence indicators See who's viewing/editing
βœ… πŸ”₯ Collaborative cursors See other users' cursor positions
βœ… 🟑 Project sharing Invite collaborators with role-based access
βœ… 🟑 Local-first architecture Works offline, syncs when connected
βœ… 🟑 Migrate local to server Start offline, add sync server later
βœ… 🟒 Activity feed Per-project feed of recent changes by collaborators

Relationship Charts

Status Priority Feature Notes
βœ… πŸ”₯ Relationship chart element New element type for visualizing connections
βœ… πŸ”₯ Graph layout Force-directed network visualization
βœ… 🟑 Hierarchy layout Tree-style parent/child visualization
βœ… 🟑 Relationship type filtering Choose which relationship types to include
βœ… 🟑 Element type filtering Choose which element types to include
βœ… 🟒 Export chart as image PNG/SVG export

Canvas

Status Priority Feature Notes
βœ… πŸ”₯ Canvas element type Infinite freeform canvas with layers
βœ… πŸ”₯ Drawing tools Freehand draw, line, shapes (rect, ellipse, arrow), text, pin
βœ… πŸ”₯ Image placement Add and position images on the canvas
βœ… 🟑 Layers Add, rename, duplicate, delete; visibility & lock toggles
βœ… 🟑 Pan and zoom Navigate large canvases smoothly
βœ… 🟑 Export as PNG Standard and high-resolution export
βœ… 🟑 Shape fills & stroke palette Per-object color editing with the full color picker; gradient fills for shapes
βœ… 🟒 Pin-to-element linking Connect canvas pins to worldbuilding elements
βœ… 🟑 Canvas size & crop frames Page bounds plus named crop frames; per-frame PNG/SVG export and set-as-project-cover
βœ… 🟑 Region pen tool Click-to-place vertices, close the loop into a polygon β€” trace map regions
βœ… 🟒 Collapsible sidebar sections Layers, Objects, Pins and Frames each collapse independently; state remembered
βœ… 🟒 Unified colour chooser Canvas uses the worldbuilding appearance picker: swatches, full picker, gradient mode
βœ… 🟒 Canvas guided tour Auto-offered on first open; replay from the sidebar help button
βœ… 🟑 Phone layout & touch Sidebar drawer on narrow screens, long-press context menu, tap-to-name linked regions, finger-sized handles
⬜ 🟒 SVG import Place an SVG as an image; later, import Inkscape files as editable objects

Interactive Maps

Status Priority Feature Notes
βœ… πŸ”₯ Map background images Flag any canvas image as a non-editable backdrop; multiple per layer for tiling large maps
βœ… πŸ”₯ Location pins Double-click (or double-tap) a linked pin to open its element
βœ… πŸ”₯ Pin-to-element linking canvas-pin relationship type; links cleaned up when elements are deleted
βœ… 🟑 Multiple map layers Per-layer backgrounds blended with layer visibility/opacity; "Map" preset in the new-element dialog
βœ… 🟑 Linked regions Shapes linked to elements: click-to-open areas; discontinuous regions via shared links
βœ… 🟑 Pins as annotations Pins live on an always-on overlay, independent of drawing layers
⬜ 🟒 AI map restyling Rough-colour a layer, restyle it via AI image generation (political, terrain, parchment…)

Timelines

Status Priority Feature Notes
βœ… πŸ”₯ Timeline element type New element for chronological visualization
βœ… πŸ”₯ Time systems Define custom calendars and date formats (see Custom calendar systems)
βœ… πŸ”₯ Timeline fields on elements Add dates to worldbuilding elements
βœ… πŸ”₯ Auto-build from elements Generate timeline from element date fields
βœ… 🟑 Events system Add events directly to timeline with element references
βœ… 🟑 Multiple timelines Parallel timelines for different storylines/regions
βœ… 🟒 Era/period grouping Visual spans for ages, reigns, wars

Publishing

Status Priority Feature Notes
βœ… πŸ”₯ EPUB export Industry-standard e-book format
βœ… πŸ”₯ PDF export (via Typst) Print-ready documents
βœ… πŸ”₯ Markdown export Plain text with formatting
βœ… πŸ”₯ HTML export Single-file web output
βœ… 🟑 Publish plans Save export configurations for reuse; a folder in a plan publishes its contents in tree order, so reordering scenes needs no plan changes
βœ… 🟑 Typography customization Per-plan style editor with 6 presets and full per-section overrides (font, size, weight, alignment, color, indent, page breaks)
⬜ 🟒 Presentation mode Read-only, docs-site-like rendering of a whole project

Auth & Security

Status Priority Feature Notes
βœ… πŸ”₯ Password auth Strong client-side requirements. Disabled by default in v0.2+ (passwordless-first per NIST SP 800-63B Rev. 4) β€” set PASSWORD_LOGIN_ENABLED=true to opt in
βœ… πŸ”₯ Passkeys (WebAuthn) Passwordless sign-in with device biometrics or hardware security keys
βœ… πŸ”₯ Magic-link passkey recovery Email-based recovery to enrol a new passkey if the original device is lost (requires EMAIL_RECOVERY_ENABLED=true + SMTP)
βœ… πŸ”₯ CSRF protection
βœ… 🟑 User approval system
βœ… πŸ”₯ Password reset via email Forgot/reset flow with emailed token links (only when password login is enabled)
βœ… 🟑 GitHub OAuth Optional GitHub sign-in

DevOps & Admin

Status Priority Feature Notes
βœ… πŸ”₯ Docker with multi-stage builds
βœ… πŸ”₯ Docker Compose
βœ… πŸ”₯ CI/CD with automated testing
βœ… 🟑 Auto-publish to GHCR
βœ… 🟑 Admin dashboard User management, AI settings, announcements
βœ… 🟑 Production logging
⬜ 🟒 Monitoring setup

Documentation

Status Priority Item Notes
βœ… 🟑 Features marketing page /features landing page for website
βœ… 🟑 Import/archive docs User guide for exporting, importing, and backing up projects
βœ… 🟒 Desktop app docs Electron app installation guide

Optional AI Features

All AI features require admin configuration and are disabled by default. See AI Stance.

Status Priority Feature Notes
βœ… 🟑 AI image generation OpenAI, OpenRouter, Fal.ai, Stable Diffusion
βœ… 🟑 Image model profiles Admin-configured presets per provider/model
βœ… 🟑 Worldbuilding context for images Include element data in generation prompts
βœ… 🟑 Reference images Use existing images as style/composition reference
βœ… 🟑 Prompt optimization AI-powered prompt rewriting for better results
βœ… 🟑 AI grammar/lint suggestions Per-paragraph grammar/style suggestions with accept/reject (OpenAI)
⬜ 🟒 AI writing assistance Suggestions, continuations, rephrasing

Architecture

Inkweld has two parts that can run together or separately, plus an optional Cloud Sync mode that needs neither an Inkweld server nor an account:

Inkweld architecture: an Angular PWA in the browser talking to an optional Hono/Bun sync server over REST and WebSocket

The client is where you write. It's a full web app that works offline.

The server enables real-time collaboration and sharing. Run it on your own hardware or a VPS. Without it, you can still use Inkweld locally β€” documents save to your browser.

Cloud Sync mirrors your projects to your own Dropbox or Nextcloud straight from the browser, so you can move between devices without running a server.


Development

Requirements

Setup

git clone https://github.com/bobbyquantum/inkweld.git
cd inkweld
bun install
cp .env.example .env
npm run dev

Frontend runs on :4200, backend on :8333.

Commands

Task Command
Dev servers npm run dev
Run tests npm test
Build npm run build
Docker (local) npm run docker:prod

πŸ“– Developer docs β†’


Data Security & AI Stance

Inkweld is self-hosted β€” the content on your server doesn't leave your server and any browsers you connect with.

The exception to this are if you use external AI services. There's an AI Kill Switch that disables all AI features, and AI is disabled by default.

If you choose to enable AI features, you can configure both self hosted services and external services, and uses include image generation based on content, and grammar suggestions.

You should be aware when using external AI services that content could be used to train, and in the case of some providers, even be published or sold as training data sets.

Always check the provider policies when configuring AI features.

AI Usage Disclosure

Disclosure: GitHub Copilot and Claude Code is used in development (a lot). The desktop background image in the main app is currently AI-generated. Some of the examples in the docs use generative AI for images and text.

The main logo is not AI, this was hand-drawn in Inkscape as SVG.


Contributing

Check out the Status and Feature Roadmap for areas that need work.


License

MIT β€” see LICENSE.

About

Inkweld is a flexible writing and world-building application. Self-hosted deployment, with a local-first design, online collaboration, publishing and export options.

Topics

Resources

Stars

7 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages