Skip to main content

Poiesis

A local Overleaf, with your own GitHub as the backend and an AI that fixes your LaTeX errors.

CI License: MIT Python 3.10+

pipx install poiesis && poiesis

poiesis (ποίησις) — "to bring into existence." The act of making thought into form.

Poiesis runs entirely on your machine: a FastAPI backend and a React/Monaco frontend. You bring your own AI key, and collaboration runs through your own private GitHub repos — there is no Poiesis server, no account, and nothing to sign up for.

Status: active alpha. Everything listed under What works today is built and used daily, but APIs and UI still move quickly.

Why not Overleaf?

Overleaf free tier Poiesis
Full version history Paid Built in
Collaborators per project 1 As many as the GitHub repo has
Track changes Paid Team chat now, document comments on the roadmap
Git / GitHub integration Paid Every project is a git repo
Compile timeout Yes Your machine, your rules
AI that fixes compile errors No Yes
Works offline No Yes
Where your files live Their servers Your disk

Reflects Overleaf's published free tier at the time of writing; check their pricing page for the current terms. Poiesis is not affiliated with Overleaf.

What works today

  • LaTeX editor (Monaco) with syntax highlighting, a formatting toolbar, and LaTeX-aware autocompletion — \cite{ completes from your .bib files, \ref{ from every \label{} in the project, \begin{ auto-closes its environment, and file paths complete inside \includegraphics{.
  • Live PDF preview that recompiles as you type and refreshes in place.
  • Inline compile diagnostics — log errors become red squiggles in the editor, and "Fix with AI" sends the error plus surrounding source to the assistant, which edits the file and recompiles until it builds.
  • SyncTeX — click the PDF to jump to the source line, and vice versa.
  • Swappable compile backendTectonic by default (auto-downloads packages, no multi-GB TeX install), with latexmk / pdflatex as a fallback.
  • AI assistant — an in-app chat that reads and edits files in your project. Bring your own key; it talks to any OpenAI-compatible endpoint (OpenRouter, OpenAI, DeepSeek, …) and is scoped to workspace tools, not a raw shell.
  • Matplotlib figure builder — code-centric figure authoring with \includegraphics injection.
  • Version history — commit list per project, per-file diffs, one-click restore. Works on synced projects and on local-only ones.
  • Citation picker — searchable \cite insert over your .bib files; paste a DOI or arXiv link to fetch the BibTeX, append it, and cite it in one step.
  • arXiv-ready export — comment-stripped sources, .bbl when present, styles and graphics only.
  • Multi-file projects with a file tree and a workspace hub.

Collaboration (GitHub sync)

Poiesis uses GitHub as an invisible backend for collaboration — each project becomes its own private GitHub repo. No Poiesis servers, and every file stays on your machine.

  • One-click GitHub sign-in via OAuth Device Flow — click Sign in with GitHub, authorize once, and you're connected forever. No client IDs, secrets, or config (the public client ID is embedded; nothing sensitive ships).
  • Share a project to a new private repo and sync automatically in the background (pure-Python git via dulwich — no system git required).
  • Invite collaborators with a github.com-style username autocomplete (type a few letters, pick from a live dropdown of GitHub users).
  • See your team — collaborator profile pictures appear on each shared project card in the hub.
  • Team chat per project — a sidebar chat where collaborators talk and leave comments, stored persistently as comments on a dedicated GitHub Issue in the repo (history syncs to everyone, survives restarts).
  • Real-time co-editing (optional) — live cursors and shared editing via Yjs/WebRTC, end-to-end encrypted between repo members.
  • Conflict resolution — a visual, per-hunk merge picker (Mine / Theirs / Both) when two people edit the same lines.

Architecture

src/poiesis/
├── web.py                    # `poiesis` entry point: serve + open a browser
├── server.py                 # FastAPI app: projects, files, compile, AI, sync
├── services/
│   ├── chat_service.py       # in-app AI assistant (OpenAI-compatible, stdlib urllib)
│   ├── sync_service.py       # GitHub-as-backend sync: OAuth device flow, dulwich git,
│   │                         #   collaborators, team chat (Issue comments), conflicts
│   ├── compile_service.py    # LaTeX compile pipeline
│   ├── synctex_service.py    # PDF ↔ source position mapping
│   └── history_service.py    # per-project commit list, diffs, restore
├── core/                     # compiler backends, document model, paths
├── static/                   # built frontend (generated; not in git)
└── ui/                       # legacy PySide6 desktop shell (app.py / main_window.py)

frontend/src/
├── App.tsx                   # editor shell, routing, shared state
├── Chat.tsx                  # AI assistant panel
├── PdfPreview.tsx            # live preview + inline PDF editing
├── FileTree.tsx              # project tree, context menus, drag/drop
├── latexIntelligence.ts      # completions, compile-log parsing, editor markers
├── sync/                     # GitHub sign-in, Share & Sync, collaborators
├── TeamChat.tsx              # per-project team chat panel
├── ConflictResolver.tsx      # visual per-hunk merge picker
└── realtime.ts               # Yjs/WebRTC live co-editing

Design principle: separation of concerns. The frontend talks only to the FastAPI backend over HTTP. The sync engine never imports the server (it's wired in via callables), GitHub REST/OAuth calls use only the stdlib, and git mechanics are hidden behind a small API. A legacy PySide6 desktop shell (poiesis.app) is still in the tree but the web app is the primary interface.

Requirements

  • Python 3.10+
  • A LaTeX engine on your PATH:
  • (Optional) An API key for any OpenAI-compatible AI provider, entered in-app.
  • Node.js 18+ — only to develop the frontend. Installing Poiesis does not need it; the UI ships prebuilt.

Install

pipx install poiesis
poiesis

That's it — poiesis starts the server and opens the editor in your browser. The UI ships prebuilt inside the package, so Node is not required to run it. Use --port, --host, or --no-browser to change how it starts.

pip install poiesis works too; pipx just keeps it out of your global environment.

Run from source (development)

git clone https://github.com/tygopoodt/Poiesis
cd Poiesis
python -m venv .venv && .venv\Scripts\activate     # macOS/Linux: source .venv/bin/activate
pip install -e ".[dev]"

python dev.py        # FastAPI backend (:8000) + Vite dev server (:5173)

Then open http://localhost:5173. dev.py runs npm install on first launch. The backend API docs live at http://127.0.0.1:8000/docs.

To build the frontend into the package the way a release does:

python build_frontend.py && poiesis

A legacy PySide6 desktop shell is still in the tree: pip install poiesis[desktop], then poiesis-desktop. New features land in the web app.

Testing

pytest                                  # backend
cd frontend && npm run build            # typecheck + build

CI runs both on every push, then builds a wheel, installs it into a clean environment and checks that it actually serves the app.

Roadmap

  • LaTeX-aware spell check (ignoring commands, math and preamble).
  • Comments anchored to line ranges in the document.
  • Zotero integration in the citation picker.
  • A WYSIWYG editing mode.
  • Threaded replies / reactions in team chat.
  • First-run onboarding: detect a missing LaTeX engine and offer to install it.
  • Packaged installers (.exe / .dmg) via GitHub Actions.

Contributing

Issues and pull requests are welcome — the project is early enough that most things are still up for discussion. Good places to start are labelled good first issue.

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

poiesis-0.1.1.tar.gz (2.6 MB view details)

Uploaded Source

Built Distribution

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

poiesis-0.1.1-py3-none-any.whl (2.7 MB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for poiesis-0.1.1.tar.gz
Algorithm Hash digest
SHA256 2dc165edae393896a484f7336ac9e05ec5e443a0d8c8147cd1af393bffecd8ac
MD5 18a8404b3054e9d7fb1450e21811230f
BLAKE2b-256 092feba9c243f4a58256ea7f7e3e383ad7e95a4a4f694e32e3f0699468389c9c

See more details on using hashes here.

Provenance

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

Publisher: release.yml on tygopoodt/Poiesis

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

File details

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

File metadata

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

File hashes

Hashes for poiesis-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b813506de784d8ded79715ec46a80919b81732129370b2581aea6c4eb83e0af7
MD5 3e05d2f434b5980ba6086db4c0f9e56c
BLAKE2b-256 c81cc4492c842642c13ae5624b861c49b8f9698164ae95f7d3ce0b50ae46ad8a

See more details on using hashes here.

Provenance

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

Publisher: release.yml on tygopoodt/Poiesis

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