A minimalist Python web framework with minimal external dependencies.
Project description
Asok is a cohesive, full-stack Python web framework designed for developer speed, elegant architecture, and security-conscious defaults. Built around a "zero-runtime-dependency" philosophy, it unifies server-side logic and client-side reactivity into a single, high-performance package, offering a streamlined development experience from the first line of code.
๐ Official Website & Documentation | ๐ Quick Start Guide | ๐ฌ Join Discord | ๐ฅ YouTube Tutorials
๐ฏ Why Asok?
Zero Runtime Dependencies, Maximum Power
Asok requires no external runtime dependencies - just Python 3.10+. No Werkzeug, no Jinja2, no SQLAlchemy. The core framework is built from the Python standard library, making it:
- โ Extremely lightweight (~360KB, ~20K lines of code)
- โ Easy to audit (everything in one codebase, no hidden dependencies)
- โ Forever stable (no dependency hell or supply chain risks)
Modern Developer Experience
# File-based routing like Next.js
src/pages/blog/[slug]/page.py โ /blog/hello-world
# Client-side Reactivity
<div asok-state="{ count: 0 }">
<button asok-on:click="count++" asok-text="count"></button>
</div>
# WebSocket Sync
class Counter(Component):
count = 0
@exposed
def increment(self):
self.count += 1
def render(self):
return self.html("counter.html")
# Admin interface in 2 lines
admin = Admin(app)
โจ Key Features
Core Framework
- ๐ Full Type Hints - Complete PEP 484 support for IDE autocomplete
- โจ๏ธ Powerful CLI - Scaffolding, migrations, dev server, production builds
- ๐ฃ๏ธ File-based Routing - Next.js-style routing (
src/pages/โ URLs) - โ๏ธ Dynamic Routes - Parameters via
[id],[slug:slug]patterns
Database & ORM
- ๐๏ธ Built-in ORM - SQLite with relations, migrations, soft deletes
- ๐ Full-Text Search - FTS5 integration for lightning-fast search
- ๐ Auto Password Hashing - PBKDF2-SHA256 with 600,000 iterations
- ๐ Query Builder - Fluent API with eager loading
Templates & Frontend
- ๐จ Template Engine - Jinja-compatible with inheritance and macros
- โก Reactive Components - Client-side reactivity (< 3KB, no build step)
- ๐ Live Components - Server-driven real-time updates via WebSockets
- ๐จ HTML Streaming - Chunked responses for instant TTFB
- ๐ญ Transitions - Built-in fade/slide/scale animations
High-Performance APIs
- ๐ Native API Engine - Build robust REST APIs with minimal code
- ๐ Auto-OpenAPI - Automatic OpenAPI 3.0 (Swagger) generation for every route
- ๐ก๏ธ Bearer Token Auth - Built-in secure authentication for stateless clients
- โก Optimized JSON - High-speed serialization for high-throughput services
- ๐ Live Documentation - Interactive API explorer (Swagger UI) included
Security
- ๐ CSRF Protection - Auto-rotation, HMAC validation, SameSite=Strict
- ๐ XSS Prevention - Auto-escaping templates, CSP nonces
- ๐ SQL Injection - Parameterized queries, column validation
- ๐ Secure Sessions - HttpOnly, Secure flags, HMAC-signed
- ๐ Path Traversal - Absolute path validation
- ๐ OWASP Top 10 - Built-in protections for common web vulnerabilities
Admin & Developer Tools
- ๐จโ๐ผ Auto Admin - Django-inspired admin in 2 lines of code
- ๐ i18n Ready - Multi-language support with JSON translations
- ๐ง Email Service - SMTP integration with templates
- ๐ฆ Production Build - Bytecode compilation, minification, WebP conversion
- ๐งช Testing Tools - Built-in test client, fixtures support
๐ญ Philosophy
Asok is designed for developers who want to build modern web applications without managing a complex stack of dependencies. It's a cohesive toolkit where everything works together out of the boxโfrom database to real-time featuresโwhile remaining simple enough to understand and audit.
Core Principles:
- Cohesion over Composition: All components are designed to work together seamlessly
- Simplicity over Magic: Clear, readable code with minimal abstraction layers
- Security by Default: Strong security defaults are built in, with additional production hardening available through configuration
- Developer Joy: Fast feedback loops, intuitive APIs, excellent error messages
Asok doesn't aim to replace existing frameworksโit offers a different approach for teams who value simplicity, security, and rapid development in a unified environment.
๐ ๏ธ Installation & Setup
1. Installation
You can install Asok via pip:
pip install asok
or clone the repo and use the asok/ folder.
2. Create a project
asok create my-project
cd my-project
3. Start the server
asok dev
๐๏ธ Project Structure
โโโ src
โย ย โโโ components # Reactive components
โย ย โโโ locales # JSON translations (en.json, fr.json, ...)
โย ย โย ย โโโ en.json
โย ย โย ย โโโ fr.json
โย ย โโโ middlewares # Request interceptors
โย ย โโโ models # ORM models (Post.py, User.py)
โย ย โโโ pages # YOUR ROUTES (page.py, page.html)
โย ย โย ย โโโ page.html
โย ย โย ย โโโ page.py
โย ย โโโ partials # css, js, images, html, uploads
โย ย โโโ css
โย ย โย ย โโโ base.css
โย ย โโโ html
โย ย โย ย โโโ base.html
โย ย โโโ images
โย ย โย ย โโโ logo.svg
โย ย โโโ js
โย ย โย ย โโโ base.js
โย ย โโโ uploads
โโโ wsgi.py # Application entry point
๐ฃ๏ธ Routing
Routing is dictated by the structure of the src/pages/ folder. Each folder represents a URL segment, and contains a page.py or page.html file.
src/pages/page.htmlโ/src/pages/about/page.htmlโ/aboutsrc/pages/user/[id]/page.pyโ/user/123(idparameter)src/pages/blog/[slug:slug]/page.pyโ/blog/my-post-slug
Dynamic Page Example (src/pages/shop/[cat]/page.py)
from asok import Request
def render(request: Request):
category = request.params.get('cat')
return f"Shop : {category}"
๐จ Templates & Inheritance
Templates in src/pages/ can inherit from layouts in src/partials/html/.
Layout (src/partials/html/base.html) :
<!DOCTYPE html>
<html lang="{{ request.lang }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="{{ static('images/logo.svg') }}" type="image/svg+xml">
<title>{% block title %}{% endblock %} — my-project</title>
<link rel="stylesheet" href="{{ static('css/base.css') }}">
<script defer src="{{ static('js/base.js') }}"></script>
</head>
<body>
<main>{% block main %}{% endblock %}</main>
</body>
</html>
Page (src/pages/page.html) :
{% extends "html/base.html" %}
{% block title %}Welcome{% endblock %}
{% block main %}
<div class="container">
<img src="{{ static('images/logo.svg') }}" alt="Logo Asok">
<h1>Welcome to Asok</h1>
<p>No dependenciesโjust Pythonโs standard library</p>
<p>Edit <code>src/pages/page.html</code> to get started.</p>
</div>
{% endblock %}
๐๏ธ AsokDB (The ORM)
Define your models in src/models/.
from asok import Field, Model
class User(Model):
email = Field.String(unique=True, nullable=False)
password = Field.Password()
name = Field.String()
is_admin = Field.Boolean(default=False)
created_at = Field.CreatedAt()
๐ i18n & Validation
- Translation:
{{ __('welcome') }}(looks insrc/locales/). - Validation:
Validator(data).rule('email', 'required|email'). - CSRF:
{{ request.csrf_input() }}automatic in forms.
๐จ Admin Customization
The administration interface is highly customizable:
admin = Admin(app, site_name="My Platform", favicon="images/logo.svg")
Asset Resolution (Smart Resolution)
The admin automatically detects the source of resources:
- Internal Assets: Files like
admin.cssor the defaultlogo.svgare served from the package. - Project Assets: If you specify a path (e.g.
images/logo.svgoruploads/icon.png), the admin will serve them from your resources folder (src/partials/).
๐ Towards Production
Asok is WSGI compatible. You can use Gunicorn or any other WSGI server:
gunicorn wsgi:app
๐ Production Security Checklist
Asok is built to be secure by default, but production environments require specific configurations to enable all protections.
1. Mandatory Environment Variables
In production (DEBUG=False), Asok enforces strict security checks:
SECRET_KEY: Must be at least 32 characters long. Usesecrets.token_hex(32)to generate one.APP_URL: Required for Magic Links to prevent Host Header Injection. Example:https://myapp.com.
2. Secure Defaults
- DEBUG: Default is
False. You must explicitly setDEBUG=Truein your.envfor development. - Password Hashing: PBKDF2-SHA256 with 600,000 iterations.
- Security Headers: HSTS (1 year), CSP (with nonces), X-Frame-Options (DENY), and X-Content-Type-Options (nosniff) are enabled by default.
3. Recommended .env for Production
ASOK_ENV=production
DEBUG=false
SECRET_KEY=your-64-character-ultra-secure-key-here
APP_URL=https://yourdomain.com
DATABASE_URL=sqlite:///data/prod.db
๐ค Contributing
We โค๏ธ contributions! Asok is built to be simple, transparent, and fun to hack on. Whether you're a Python beginner or expert, there's a place for you here.
๐ Ways to Contribute
- ๐ Report bugs - Found an issue? Open a bug report
- ๐ก Suggest features - Have an idea? Start a discussion
- ๐ Improve docs - Spot a typo? Docs are in asok-docs
- ๐ง Submit PRs - Fixed something? Send a pull request
- โญ Star the repo - Show your support!
- ๐ฌ Help others - Answer questions in Discussions
๐ Quick Start for Contributors
# 1. Fork and clone the repo
git clone https://github.com/YOUR_USERNAME/asok.git
cd asok
# 2. Create a virtual environment
python -m venv venv
source venv/bin/activate # or `venv\Scripts\activate` on Windows
# 3. Install dependencies (dev mode)
pip install -e .
# 4. Run the test suite
python -m pytest
# 5. Create a branch for your feature
git checkout -b feature/amazing-feature
# 6. Make your changes and test
python -m pytest -v
# 7. Commit and push
git commit -m "feat: add amazing feature"
git push origin feature/amazing-feature
๐ Read our full Contributing Guide for code style, commit conventions, and more.
๐ Contributors
Thanks to all our amazing contributors! ๐
๐ฌ Support & Resources
Need help?
- ๐ Read the documentation
- ๐ Search existing issues
- ๐ฌ Ask in GitHub Discussions
- ๐ Report bugs via GitHub Issues
Documentation & Resources:
- ๐ Complete Framework Guide
- ๐ Documentation Source - Contribute to the docs
- ๐ ๏ธ Code Examples - Ready-to-use projects and templates
- ๐ CHANGELOG - See what's new in each release
Stay updated:
- โญ Star the repo to follow development
- ๐ Watch releases for new versions
๐บ๏ธ Roadmap
Asok is actively developed with exciting features planned:
v0.2.0 - Enterprise Features
- PostgreSQL & MySQL support
- Advanced ORM relationships (many-to-many improvements)
- WebSocket rooms for real-time collaboration
- Background job queue system
- Plugin ecosystem & CLI enhancements
v0.3.0 - Modern Stack
- GraphQL API support with auto-generated schemas
- Server-side rendering (SSR) & static site generation
- Built-in monitoring & observability tools
- Full async/await support (ASGI)
Note: Timelines are subject to change based on community feedback and development priorities.
๐ญ Production Status
Asok v0.1.x is early-stage software under active development. It's suitable for:
โ Recommended for:
- Personal projects and MVPs
- Internal tools and admin dashboards
- Rapid prototyping and experimentation
- Learning full-stack Python development
- Projects where dependency auditing is critical
โ ๏ธ Current Limitations:
- Database: SQLite only (PostgreSQL/MySQL planned for v0.2.0)
- Concurrency: WSGI only, no async/await yet (ASGI planned for v0.3.0)
- Ecosystem: Early-stage community, limited third-party plugins
- Maturity: v0.1.x - APIs may evolve before v1.0
For mission-critical production applications, consider your specific requirements and evaluate if Asok's current feature set meets your needs.
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file asok-0.1.7.tar.gz.
File metadata
- Download URL: asok-0.1.7.tar.gz
- Upload date:
- Size: 381.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29101e6366f9837f385e92792b68ce296cd02e0dba163aa0b74039d6ce13b814
|
|
| MD5 |
e176e99c658f3b28e09eba6573ac98ca
|
|
| BLAKE2b-256 |
bb27d2ea15e54528ae0cd3ee37eaaf9be5e69194628659d8f20f6faca272cd1c
|
Provenance
The following attestation bundles were made for asok-0.1.7.tar.gz:
Publisher:
release.yml on asok-framework/asok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
asok-0.1.7.tar.gz -
Subject digest:
29101e6366f9837f385e92792b68ce296cd02e0dba163aa0b74039d6ce13b814 - Sigstore transparency entry: 1629984393
- Sigstore integration time:
-
Permalink:
asok-framework/asok@1606f62a7d1aeb3aedc161427cf451b507c2569e -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/asok-framework
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1606f62a7d1aeb3aedc161427cf451b507c2569e -
Trigger Event:
release
-
Statement type:
File details
Details for the file asok-0.1.7-py3-none-any.whl.
File metadata
- Download URL: asok-0.1.7-py3-none-any.whl
- Upload date:
- Size: 436.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b68ff53b249db941ac6fb5610454860e2d64b6f97f037a52240c58190d21c23
|
|
| MD5 |
321c007c3a44415de71100e74e492f5a
|
|
| BLAKE2b-256 |
ac3378a27d7f91061770493efed4ddd672fdc1027d6b0cdabc82c4855142823a
|
Provenance
The following attestation bundles were made for asok-0.1.7-py3-none-any.whl:
Publisher:
release.yml on asok-framework/asok
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
asok-0.1.7-py3-none-any.whl -
Subject digest:
6b68ff53b249db941ac6fb5610454860e2d64b6f97f037a52240c58190d21c23 - Sigstore transparency entry: 1629984451
- Sigstore integration time:
-
Permalink:
asok-framework/asok@1606f62a7d1aeb3aedc161427cf451b507c2569e -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/asok-framework
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1606f62a7d1aeb3aedc161427cf451b507c2569e -
Trigger Event:
release
-
Statement type: