A static archive of the Champions of Regnum community forum. This application provides a modern web interface for browsing historical forum discussions, posts, and user profiles from the Regnum Online community.
- Read-only archive with search capabilities across threads, posts, and users
- Multi-language support for English, EspaΓ±ol, Deutsch, PortuguΓͺs, FranΓ§ais, and Italiano
- REST API for programmatic access to forum data
- Responsive design built with Bootstrap 5
- Docker deployment ready for production use
- Docker and Docker Compose
regnumforum.dbSQLite database file (contact maintainers for access)
git clone https://github.com/CoR-Forum/RegnumOnlineForumArchive.git
cd RegnumOnlineForumArchive
docker compose up -d --buildOpen http://localhost:3000 in your browser.
npm install
npm run dev # Development server with hot reload
npm start # Production serverBase URL: http://localhost:3000/api
GET /api/threadsParameters:
language(string) - Filter by language: "English", "EspaΓ±ol", "Deutsch", "PortuguΓͺs", "FranΓ§ais", "Italiano"category(string) - Filter by forum categorysearch(string) - Search thread titles and contentpage(integer) - Page number (default: 1)limit(integer) - Items per page (default: 20, max: 100)random(boolean) - Return random threads instead of chronological order
Response:
{
"success": true,
"data": {
"threads": [
{
"id": 123,
"name": "Thread Title",
"language": "English",
"category": "General Discussion",
"threadCreator": "Username",
"threadCreatorId": 456,
"createdTime": "2023-01-15 14:30:00",
"lastPoster": "LastUser",
"lastPosterId": 789,
"lastPostTime": "2023-01-20 16:45:00",
"postCount": 25
}
],
"pagination": {
"page": 1,
"totalPages": 10,
"totalThreads": 200,
"hasNext": true,
"hasPrev": false
}
}
}GET /api/threads/:idResponse:
{
"success": true,
"data": {
"thread": {
"id": 123,
"name": "Thread Title",
"language": "English",
"category": "General Discussion",
"threadCreator": "Username",
"threadCreatorId": 456,
"createdTime": "2023-01-15 14:30:00",
"lastPoster": "LastUser",
"lastPosterId": 789,
"lastPostTime": "2023-01-20 16:45:00",
"postCount": 25,
"path": "/Forum/English/General Discussion/Thread Title"
}
}
}GET /api/threads/:id/postsParameters:
page(integer) - Page number (default: 1)limit(integer) - Posts per page (default: 20, max: 50)
Response:
{
"success": true,
"data": {
"posts": [
{
"id": 789,
"threadId": 123,
"userId": 456,
"username": "PostAuthor",
"message": "<p>Post content with HTML formatting</p>",
"timestamp": "2023-01-15 14:35:00",
"postNo": 1
}
],
"pagination": {
"page": 1,
"totalPages": 3,
"totalPosts": 25,
"hasNext": true,
"hasPrev": false
}
}
}GET /api/threads/meta/languagesResponse:
{
"success": true,
"data": [
"English",
"EspaΓ±ol",
"Deutsch",
"PortuguΓͺs",
"FranΓ§ais",
"Italiano"
]
}GET /api/usersParameters:
search(string) - Search usernamespage(integer) - Page number (default: 1)limit(integer) - Users per page (default: 20, max: 100)
Response:
{
"success": true,
"data": {
"users": [
{
"id": 456,
"name": "Username",
"postCount": 150,
"threadCount": 12,
"firstPost": "2022-05-10 09:15:00",
"lastPost": "2023-01-20 16:45:00"
}
],
"pagination": {
"page": 1,
"totalPages": 25,
"totalUsers": 500,
"hasNext": true,
"hasPrev": false
}
}
}GET /api/users/:idResponse:
{
"success": true,
"data": {
"user": {
"id": 456,
"name": "Username",
"postCount": 150,
"threadCount": 12,
"firstPost": "2022-05-10 09:15:00",
"lastPost": "2023-01-20 16:45:00",
"joinDate": "2022-05-10 09:15:00"
}
}
}GET /api/users/:id/postsParameters:
page(integer) - Page number (default: 1)limit(integer) - Posts per page (default: 20, max: 50)
Response:
{
"success": true,
"data": {
"posts": [
{
"id": 789,
"threadId": 123,
"threadName": "Thread Title",
"message": "<p>Post content</p>",
"timestamp": "2023-01-15 14:35:00",
"postNo": 1
}
],
"pagination": {
"page": 1,
"totalPages": 8,
"totalPosts": 150,
"hasNext": true,
"hasPrev": false
}
}
}GET /api/users/:id/threadsParameters:
page(integer) - Page number (default: 1)limit(integer) - Threads per page (default: 20, max: 50)
Response:
{
"success": true,
"data": {
"threads": [
{
"id": 123,
"name": "Thread Title",
"language": "English",
"category": "General Discussion",
"createdTime": "2023-01-15 14:30:00",
"postCount": 25
}
],
"pagination": {
"page": 1,
"totalPages": 1,
"totalThreads": 12,
"hasNext": false,
"hasPrev": false
}
}
}GET /api/stats/overviewResponse:
{
"success": true,
"data": {
"totalUsers": 1500,
"totalThreads": 850,
"totalPosts": 12000,
"totalLanguages": 6
}
}GET /api/statsResponse:
{
"success": true,
"data": {
"overview": {
"totalUsers": 1500,
"totalThreads": 850,
"totalPosts": 12000,
"totalLanguages": 6
},
"languages": [
{
"language": "English",
"flag": "πΊπΈ",
"thread_count": 450,
"post_count": 8000,
"percentage": 66.67
}
],
"mostActiveUsers": [
{
"id": 456,
"name": "Username",
"post_count": 150,
"rank": 1,
"medal": "π₯"
}
],
"yearlyActivity": [
{
"year": 2023,
"post_count": 2500,
"percentage": 85.5
}
],
"topCategories": [
{
"category": "General Discussion",
"full_category": "Forum/English/General Discussion",
"display_category": "Forum βΊ English βΊ General Discussion",
"post_count": 3000,
"rank": 1,
"percentage": 100.0
}
]
}
}GET /api/stats/languagesResponse:
{
"success": true,
"data": [
{
"language": "English",
"flag": "πΊπΈ",
"thread_count": 450,
"post_count": 8000,
"percentage": 66.67
}
]
}GET /api/stats/users?limit=10GET /api/stats/activityGET /api/stats/categories?limit=10GET /api/threads/meta/categories?language=EnglishResponse:
{
"success": true,
"data": [
{
"category": "General Discussion",
"thread_count": 120,
"post_count": 3000
},
{
"category": "Suggestions & Ideas",
"thread_count": 85,
"post_count": 1200
}
]
}GET /api/healthResponse:
{
"success": true,
"status": "healthy",
"timestamp": "2023-01-15T14:30:00.000Z",
"uptime": 3600.5,
"database": "connected"
}All endpoints return errors in this format:
{
"success": false,
"error": "Error message",
"code": "ERROR_CODE"
}HTTP status codes: 200 (success), 400 (bad request), 404 (not found), 429 (rate limited), 500 (server error)
βββ src/ # Backend API
β βββ app.js # Express server
β βββ middleware/ # Custom middleware (empty)
β βββ models/database.js # SQLite database layer
β βββ routes/ # API endpoints (threads, users, stats)
β βββ utils/helpers.js # Server utilities
βββ public/ # Frontend SPA
β βββ index.html # Main HTML
β βββ assets/ # Static assets (logos)
β βββ css/forum.css # Stylesheets
β βββ js/ # JavaScript modules (app, api, router, components, utils)
βββ regnumforum.db # SQLite database
βββ docker-compose.yml # Docker configuration
βββ Dockerfile # Node.js container
βββ package.json # Node.js dependencies
The application requires a SQLite database file named regnumforum.db containing the forum archive data. This file must be present in the root directory for the application to function.
Database Schema:
threads- Forum thread discussionsposts- Individual post messagesusers- User profiles and statistics- Additional metadata tables for categories and languages
NODE_ENV- Runtime environment (production/development)PORT- Server port (default: 3000)DB_PATH- SQLite database path (default: ./regnumforum.db)
We are planning to expand the archive by scraping additional historical forum data from archive.org (Wayback Machine) to preserve even more community discussions that may not be in the current database.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- GitHub Repository: RegnumOnlineForumArchive
- Community Forum: CoR Forum
This archive preserves the historical discussions from the Champions of Regnum gaming community. Regnum Online is a medieval fantasy MMORPG that has fostered a dedicated international community for many years. This project ensures that valuable community discussions, guides, and memories remain accessible to current and future players.