Library / SDK
writer/writer-framework avatar
writer/writer-framework

Writer Framework: A Visual Editor Over a Python Event Handler

No-code in the front, Python in the back. An open-source framework for creating data apps.

1,449 stars101 forksPythonApache-2.0

At a glance

What is it?
Writer Framework pairs a drag-and-drop UI editor with a Python backend and a WebSocket connection between them. It is a reasonable fit for internal data and AI apps, and a poor fit for anything that needs multi-user state or a pure-Python workflow.
Who is it for?
Adopt Writer Framework if your team splits UI work from Python work and the app is a single-user or internal tool, and verify first that your Python version sits inside the documented 3.9.2 to 3.12 window, since that range is narrower than what most current toolchains ship. Do not adopt it if the app has to run without a browser-based editor step or if you need a component library you can extend in Python alone.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 53 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The gap Writer Framework is trying to close

Most Python data app tools make you describe the interface in Python. Streamlit and Dash both work that way: you write layout calls or component trees in code, and the browser is a rendering target. That is fine for a solo developer, but it means a designer or a product manager cannot touch the interface without editing the same file the backend logic lives in. Writer Framework inverts that. The README describes it as a framework where you "build user interfaces using a visual editor; write the backend code in Python," and it frames the split as "separation of concerns between UI and business logic." The intended user is a small team building an internal AI or data app, where one person owns the layout and another owns the Python. The README also positions it inside Writer's commercial platform, describing Writer as "the full-stack generative AI platform for enterprises," so the framework is the open source front door to a paid product. That context matters when you weigh how much you want to depend on it.

How the editor and the Python process talk to each other

The architecture implied by the material is a two-part system. On one side there is a visual editor, opened by a CLI command, that runs in the browser and produces a UI definition. On the other side there is a Python application that the framework runs as a server. The repository topics list websockets alongside interface-builder and ui-components, which tells you the connection between the two is a persistent socket rather than request-response form posts. That is the mechanism that makes the split work: the browser holds the rendered interface, the Python process holds state and event handlers, and events travel over the socket. The practical consequence is that your Python code is not generating HTML. It is reacting to named events that the editor wires up. The README does not document the handler signature, the state object, or the message format, so anyone evaluating this should read the official documentation at dev.writer.com before assuming the event model looks like Streamlit's rerun-the-whole-script model. It does not appear to work that way, but the README alone will not settle it.

Getting an app running: the writer CLI

Installation is a single pip command: pip install writer. From there the README gives five commands. writer hello creates a demo app, which is the fastest way to see the shape of a project before committing to one. writer create my_app scaffolds a new app under a directory you name. writer edit my_app opens the visual editor in your browser, and the README states you build the UI there "by dragging and dropping components." writer run my_app starts the app. The README does not list flags, ports, or a config file format, so the four commands above are the whole documented surface. Two constraints are stated explicitly and both are worth checking before you start: the framework runs on Linux, Mac, and Windows, and it supports Python versions 3.9.2 through 3.12. That lower bound is unusually specific. If your environment pins 3.9.0 or 3.9.1, or if you have already moved to 3.13, the README gives you no reason to expect it to work.

Where the visual editor becomes a constraint

A drag-and-drop editor is a good deal when your interface matches the components it ships. It becomes a liability the moment it does not. Because the UI lives in a definition the editor owns, adding a component type the editor does not provide is not a matter of writing a Python class. You are either waiting for the project to add it or working around the editor entirely, and the README does not describe an escape hatch for either case. The second limitation is more structural. A WebSocket-backed session with server-side Python state is a good model for a handful of concurrent users and a bad one for thousands, because each connected browser holds a live connection to a Python process. The README says nothing about horizontal scaling, session persistence, or what happens when the process restarts mid-session. For an internal dashboard that is fine. For a public app with unpredictable traffic, that silence is the thing to resolve before you build on it. The third issue is the editor step itself. Any deployment or CI pipeline that needs to produce a UI without a human opening a browser has no documented path here.

The maintenance picture, and what the release history suggests

The release list is short and the spacing is uneven. v0.7.4 landed on 2024-09-03, then v0.8.1 and v0.8.2 arrived within three days of each other in late November and early December 2024. The repository is not archived, the default branch is dev, and the most recent push recorded is 2026-07-24, well after the last tagged release. That combination is common in projects where the default branch carries work that has not been cut into a version yet, and it means the tagged release you install may lag the code you read on the dev branch. For a pre-1.0 project, expect the API to move. The licence is Apache-2.0, which permits commercial use and modification and includes a patent grant, but it also means the project carries no warranty and no obligation on the maintainers to fix anything. That is a normal open source arrangement and not a criticism, but it is the reason the framework's ties to Writer's commercial platform are worth naming: the open source project and the paid product share a vendor, and the roadmap is not something the licence gives you any control over. This is a description of the licence terms, not legal advice.

How it differs from Streamlit and Dash

The comparison that matters is with Streamlit, because both target the same person: a Python developer who needs a browser interface without writing a frontend. Streamlit's model is a script that reruns top to bottom on every interaction, and the layout is expressed in Python calls. There is no separate editor and no separate UI artifact. Writer Framework splits those two things apart, which is the whole point of the project and also its main cost. You gain a visual editor that a non-Python teammate can use, and you take on a UI definition that lives outside your code and a socket protocol you did not write. Dash sits closer to the traditional model still, with explicit callback functions wired to component IDs, and it gives you more control over the frontend at the price of more boilerplate. Neither Streamlit nor Dash is a drop-in replacement here, because the separation Writer Framework sells is precisely what they do not offer. If you do not need that separation, you are paying for it without using it.

Who should adopt it, and what to check first

The framework fits a team where UI work and Python work are genuinely different jobs, the app is internal, and the component set in the editor covers most of what you need to build. It also fits anyone already inside Writer's platform, since the framework is presented as part of that stack. It does not fit a solo developer who is comfortable writing layout in Python, because the editor becomes an extra artifact to keep in sync for no benefit. It does not fit a public-facing app with unpredictable concurrency until someone confirms how sessions behave under load, and the README does not address that. It does not fit a team on Python 3.13 or on a pinned 3.9.0, given the documented 3.9.2 to 3.12 range. The first thing to verify is not a feature but a workflow: install with pip install writer, run writer hello, open the editor, and run the demo. If that loop feels wrong, nothing further in the documentation will fix it. The second thing to verify is the event and state model in the official docs, because the README describes the separation of concerns but never shows what a handler looks like.

Editorial conclusion

Adopt Writer Framework if your team splits UI work from Python work and the app is a single-user or internal tool, and verify first that your Python version sits inside the documented 3.9.2 to 3.12 window, since that range is narrower than what most current toolchains ship. Do not adopt it if the app has to run without a browser-based editor step or if you need a component library you can extend in Python alone. Before committing, run writer create on a scratch app and confirm the editor opens and the run command serves it locally on your machine.

Official sources

  1. License: Apache-2.0
  2. Project website
  3. README
  4. Releases
  5. writer/writer-framework on GitHub
Community notes

Community notes