- Replaced SQLite with BaraDB via TCP wire protocol - Added baradb_client.nim and baradb_sqlite.nim adapter - Renamed SQL keywords: status->usrStatus, key->sessionKey, like->postLike - Added NOW() support for datetime defaults - Switched Jester to asynchttpserver (-d:useStdLib) to avoid thread/GC issues - Frontend built and favicon added
4.5 KiB
nimforum
NimForum is a light-weight forum implementation with many similarities to Discourse. It is implemented in the Nim programming language.
This fork uses BaraDB instead of SQLite. BaraDB is a custom database engine that communicates via a TCP wire protocol. The forum connects to a running BaraDB server instead of opening a local SQLite file.
Architecture
┌─────────────┐ HTTP ┌─────────────┐ TCP ┌─────────────┐
│ Browser │ ◄─────────────► │ nimforum │ ◄────────────► │ BaraDB │
│ │ │ (Jester) │ (wire proto) │ Server │
└─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ public/ │
│ (JS, CSS) │
└─────────────┘
Why BaraDB?
This project was created to test and validate BaraDB's SQL compatibility and wire protocol. Running a real-world application like NimForum against BaraDB surfaced many practical issues (reserved keywords, type conversions, async protocol safety) that unit tests alone would not catch.
Changes from upstream
| Area | Upstream | This fork |
|---|---|---|
| Database | SQLite (file) | BaraDB (TCP server) |
| DB driver | db_connector/db_sqlite |
baradb_sqlite.nim (drop-in adapter) |
| Keywords | status, key, like |
Renamed to usrStatus, sessionKey, postLike |
| Date/time | DATETIME('now') |
NOW() |
| FTS search | SQLite FTS4 | Disabled (returns empty) |
| HTTP backend | httpbeast (multi-threaded) | asynchttpserver (single-threaded)* |
* Switched to asynchttpserver via -d:useStdLib because httpbeast's worker threads share the global db ref, causing GC corruption and segfaults at startup.
Requirements
- Nim >= 2.0
- Nimble
- libsass / libsass-dev (for SCSS compilation)
- A running BaraDB server (see below)
Quick start
1. Start BaraDB
cd ../Baradb
BARADB_JWT_SECRET=test nimble build_debug
BARADB_JWT_SECRET=test ./build/baradadb
The server listens on 127.0.0.1:9472 by default.
2. Build and run the forum
cd nimforum
git submodule update --init --recursive
# Build CSS and frontend JS
nimble frontend
# Create development database (admin/admin)
nimble devdb
# Compile and run backend
nimble backend
The forum will be available at http://localhost:5000.
Build tasks
nimble backend # Compile & run the forum backend
nimble runbackend # Run the compiled backend
nimble frontend # Build CSS + JS frontend assets
nimble devdb # Create a dev database with seed data
nimble testdb # Create a test database
nimble blankdb # Create an empty database
Project layout
nimforum/
├── src/
│ ├── forum.nim # Main Jester backend
│ ├── baradb_client.nim # BaraDB wire-protocol client
│ ├── baradb_sqlite.nim # Drop-in db_sqlite adapter
│ ├── setup_nimforum.nim # DB initialization script
│ └── frontend/ # Karax SPA sources
├── public/
│ ├── js/forum.js # Compiled frontend (generated)
│ ├── css/ # Compiled SASS + Spectre
│ └── images/
├── Baradb/ # BaraDB source (sibling directory)
└── nimforum.nimble
Known issues / limitations
- FTS search disabled — BaraDB does not support SQLite FTS4 virtual tables. The search endpoint returns empty results.
- No
COLLATE NOCASE— Some string comparisons may be case-sensitive where the original was not. - Manual
nextId()— Auto-increment is simulated withSELECT COALESCE(MAX(id),0)+1, which is not atomic under high concurrency. - Single-threaded HTTP — Due to the global
dbref holding async TCP state, the forum runs on a single async thread. For a busy site you would need per-request DB connections or a connection pool.
License
MIT — see upstream nimforum for original copyright.