Overview
Ayase Quart is built on the Quart async web framework and follows a modular architecture with support for multiple database backends and extensible plugin systems.Core technology stack
- Framework: Quart (async Python web framework)
- Server: Hypercorn (ASGI server)
- Templating: Jinja2
- Database support: MySQL, SQLite, PostgreSQL (via Asagi schema)
- Caching: Redis (for moderation bloom filtering)
- Search engines: LNX, Meilisearch, TypeSense
Project structure
Database abstraction layer
Ayase Quart uses a unified database abstraction layer that supports multiple backends through theDbHandler class.
Database handler
TheDbHandler class in db/__init__.py provides a consistent interface across database types:
Supported databases
- MySQL: Production archives (Asagi schema)
- SQLite: Lightweight archives, moderation database
- PostgreSQL: Alternative production backend
db/mysql.py- MySQL-specific pool and query runnerdb/sqlite.py- SQLite-specific pool and query runnerdb/postgresql.py- PostgreSQL-specific pool and query runner
Query execution
The abstraction layer provides two query methods:query_tuple()- Returns rows as tuples (fast)query_dict()- Returns rows as dictionaries (convenient)
Application lifecycle
Initialization
The application is created inmain.py through the create_app() factory:
Register components
- Rate limiter
- Jinja2 template environment
- Blueprints (routes)
- Plugin blueprints (if enabled)
Shutdown
On application shutdown,close_dbs() is called to cleanly close:
- Redis connections
- Query database pool
- Moderation database pool
- Search engine connections
Blueprint architecture
Blueprints organize routes into logical modules. They are conditionally loaded based on configuration:Web blueprints
bp_about- About pagebp_app- Board browsing, thread viewingbp_search- Search functionalitybp_search_fts- Full-text searchbp_search_sql- SQL-based searchbp_moderation- Moderation toolsbp_auth- Authentication (login/logout)bp_admin- Admin panelbp_media- Media serving (optional)bp_stats- Statistics (optional)
API blueprints
Mirror functionality for web blueprints with JSON responses:bp_api_app- Board/thread databp_api_auth- Token-based authenticationbp_api_admin- Admin operationsbp_api_moderation- Moderation actions
Plugin system
Ayase Quart supports two types of plugins:Search plugins
Extend search functionality with custom logic. Located inplugins/search/:
i_search.py interface.
Search plugins face a “post-filtering” challenge where results are filtered twice (plugin + native search), making final page sizes unpredictable.
Blueprint plugins
Add custom endpoints to the application. Located inplugins/blueprints/:
Configuration system
Configuration is loaded from TOML files using theconf_loader.py module:
config.toml- Main application configurationboards.toml- Board definitionsasset_hashes.json- JavaScript integrity checksums
app_conf- Application settings (port, SSL, autoreload)db_conf- Database connection settingsmod_conf- Moderation system settingsindex_search_conf- Full-text search configurationmedia_conf- Media storage settingsstats_conf- Statistics features
Search engine integration
Ayase Quart integrates with multiple search engines through provider classes insearch/providers/:
- LNX - Full support, tested (only v0.9.0)
- Meilisearch - Partial support
- TypeSense - Partial support
baseprovider.py interface for:
- Index creation
- Document loading
- Query execution
- Connection management
Moderation system
The moderation system includes:Authentication
- Web: Cookie-based with math CAPTCHA
- API: Bearer token authentication
- CLI: Direct server access (no auth required)
Features
- User-submitted reports management
- Auto-hide reported content
- Regex-based content filtering
- Redis bloom filtering for performance
Database
Moderation data is stored in a separate SQLite database (db_m) with schema defined in moderation/sql/.
Post processing
Posts go through multiple processing stages in theposts/ module:
- Comment parsing - Parse 4chan-style comments
- Quotelinks - Generate cross-post references
- Capcodes - Handle moderator/admin tags
- Template optimization - Prepare data for Jinja2 rendering
Security features
Located insecurity/:
- CAPTCHA - Math-based CAPTCHA for authentication
- CSRF protection - Via Flask-WTF
- Rate limiting - Via Quart-Rate-Limiter
- SSL/TLS - Certificate-based encryption
- Asset integrity - Subresource Integrity (SRI) for JavaScript
Performance considerations
- Async/await - Non-blocking I/O throughout
- Connection pooling - Database connection reuse
- Redis caching - Bloom filters for moderation
- Asset hashing - Browser cache optimization
- Hypercorn workers - Multi-process parallelism