The Web Framework
for the Everyman.
Python web apps, without the ceremony. Co-locate your logic and your output. Ship a functional tool before the shift ends.
@route('/orders/overdue')
{$
# Python logic lives right here, no controller file
orders = db['default'].query(
"SELECT client, days_open, total "
"FROM orders WHERE closed = 0 "
"ORDER BY days_open DESC"
)
$}
<h1>Overdue Orders</h1>
{% for o in orders %}
<div class="row">
<span>{{ o.client }}</span>
<span class="days">{{ o.days_open }}d</span>
<span>${{ "{:,.0f}".format(o.total) }}</span>
</div>
{% endfor %}
Zero-Ceremony Routing
Write your logic exactly where it renders. A decorator, a Python block, and HTML. No jumping between controller files and view templates. If it's a .stpl file, it works.
Built for the Database
Parameterized queries out of the box. SQLite for development, one config change to switch to PostgreSQL, MySQL, or MSSQL. Stop fighting ORMs when raw SQL gets the job done.
HTMX-Ready
@no_layout returns bare HTML fragments for HTMX partials. @sse enables Server-Sent Events with yield. Reactive UIs without a JavaScript framework or build step.
Get started
Full install guide →Install
tar -xzf scribe-*.tar.gz
./install.sh
Create & run
scribe new myapp
cd myapp
scribe dev
A browser IDE. Built in.
Run scribe ide alongside your dev server to get a Monaco-powered editor, live app preview, and a database browser — all at localhost:5001. No extension, no separate tool.
Prefabs
View all →Drop-in feature packages and UI components. Copy the files listed, follow the README, and ship a working feature without starting from scratch.
Modules
Full-feature packages — Python helpers, route snippets, migrations, and CSS. No dependencies beyond what each README lists.
Admin Settings · LDAP Auth
Browse Modules →Templates
Copy-paste UI components with live demos and source viewers. Vanilla JS, no build step, no framework lock-in.
Modal Dialog · Sortable Table · Rich Form
Browse Templates →