SkyWall CMS

A modern, secure, and multi-core World of Warcraft CMS built for private server operators.

Enterprise Security

28 security fixes including CSRF, XSS, SQL injection, and command injection prevention.

Multi-Core Support

AzerothCore, TrinityCore, cMaNGOS, and VMaNGOS with automatic detection.

Template System

Custom themes with live Monaco editor, no file editing required.

Performance

File-based caching, optimized queries, and lazy-loaded assets.

Modular Design

Shop, Forum, Armory, Vote, Bugtracker, and more out of the box.

Responsive

Beautiful dark theme that works on desktop, tablet, and mobile.

Requirements

PHP 7.4 or higher with PDO, pdo_mysql, OpenSSL, and cURL extensions (SOAP required for shop delivery)
Web Server Apache with mod_rewrite (recommended) or Nginx
Database MySQL 5.7+ or MariaDB 10.3+
WoW Server AzerothCore, TrinityCore, cMaNGOS, or VMaNGOS
SOAP Enabled on worldserver for shop delivery

Installation

SkyWall CMS features a guided installer that handles database setup, configuration, and core detection automatically.

1
Upload Files

Upload all CMS files to your web server's document root (e.g., /var/www/html or public_html).

2
Set Permissions

Ensure the following directories are writable by the web server:

chmod 775 cache/ logs/ templates/
3
Run the Installer

Navigate to https://yourdomain.com/install.php in your browser.

The installer guides you through license key activation, database connection, and WoW core detection (AzerothCore, TrinityCore, cMaNGOS, or VMaNGOS).
4
Configure Server Settings

Enter your realm name, SOAP credentials, and server status settings. The installer auto-detects your WoW core (AzerothCore, TrinityCore, cMaNGOS, or VMaNGOS).

5
Complete Setup

After installation, delete install.php from the server (or restrict access to it) — it is no longer needed. Visit your site and log in with an account that has GM Level 3+ to access the admin panel.

Nginx Configuration

Recommended Nginx config for clean URLs, security, and the dynamic robots.txt/sitemap.xml:

server {
    listen 80;
    server_name yourdomain.com;
    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Dynamic robots.txt and sitemap.xml
    location = /robots.txt { rewrite ^ /core/seo/robots.php last; }
    location = /sitemap.xml { rewrite ^ /core/seo/sitemap.php last; }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Block sensitive files and directories
    location ~ /\.(env|git|htaccess) { deny all; }
    location ~ \.sql$ { deny all; }
    location ~ ^/(cache|logs|vendor|node_modules|dist|app)/ { deny all; }
    location ~ ^/(core|modules|templates)/.*\.php$ { deny all; }
}

Apache Configuration

SkyWall includes a .htaccess file with rewrite rules. Ensure mod_rewrite is enabled:

a2enmod rewrite
systemctl restart apache2

Configuration

All settings are stored in the .env file at the project root. The installer generates this file automatically. You can edit it directly or use the Admin Panel settings pages.

Core Type

CORE_TYPE=azerothcore    # azerothcore, trinitycore, cmangos, vmangos

Database Settings

DB_HOST=127.0.0.1
DB_USERNAME=root
DB_PASSWORD=your_password
DB_AUTH=acore_auth
DB_CHA=acore_characters
DB_WORLD=acore_world
DB_CMS=skywall_cms

SOAP Settings

SOAP_IP=127.0.0.1
SOAP_PORT=7878
SOAP_USER=gamemaster
SOAP_PASS=your_password

GM Levels

GM levels are defined as PHP constants in core/GmLevels.php (they are not .env values):

GM_LEVEL_PLAYER    = 0
GM_LEVEL_VIP       = 1
GM_LEVEL_MODERATOR = 2
GM_LEVEL_ADMIN     = 3
GM_LEVEL_CONSOLE   = 4
After changing .env, clear the cache from Admin Panel to apply new settings.

Developer Build (Compiling Tailwind CSS)

SkyWall is distributed in two forms. This section explains the difference and how to rebuild the frontend stylesheet if you are a developer.

Distribution Types
Package Contents
Standard ZIP Ready-to-run. Includes the compiled tailwind.css and all runtime files. No build step required.
Developer ZIP (optional) Same as Standard, plus the build tooling needed to recompile the Tailwind CSS: package.json, tailwind.config.js, and the input stylesheet.

Requirements

To compile the stylesheet yourself you need Node.js (LTS) with npm installed on your machine.

Files Involved

package.json                                  # build scripts + tailwindcss dependency
tailwind.config.js                            # Tailwind config (theme colors, fonts, content paths)
templates/skywall/assets/css/tailwind-input.css   # input file (@tailwind directives)
templates/skywall/assets/css/tailwind.css         # compiled output (generated)

Building

1
Install Dependencies
npm install
2
Compile (production, minified)
npm run css:build

Generates templates/skywall/assets/css/tailwind.css.

3
Watch Mode (development)
npm run css:watch

Automatically rebuilds whenever a .php or .js file changes.

Customizing the Theme

Edit tailwind.config.js to change the brand palette and fonts:

module.exports = {
  content: [
    './modules/**/*.php',
    './templates/**/*.php',
    './core/**/*.php',
    './index.php',
    './install.php',
    './core/migrate.php',
    './Router.php',
    './assets/js/**/*.js',
  ],
  theme: {
    extend: {
      colors: {
        'sky-gold': { DEFAULT: '#FF7E02', light: '#FFC010', deep: '#CC6502' },
        'sky-void': '#07090F',
      },
      // ...
    },
  },
};
You only need the Developer ZIP if you intend to modify the theme colors/fonts or add custom Tailwind classes. The standard package already ships a compiled stylesheet and works out of the box.

SEO, Robots.txt & Sitemap

robots.txt and sitemap.xml are generated dynamically — there are no static files to edit. The domain is detected automatically from the current request, so each installation serves its own URLs without any manual configuration.

How it works

The files are served by two small PHP scripts located in core/seo/:

core/seo/robots.php     # outputs robots.txt
core/seo/sitemap.php   # outputs sitemap.xml

The .htaccess rewrites the public URLs to these scripts:

RewriteRule ^robots\.txt$ core/seo/robots.php [L]
RewriteRule ^sitemap\.xml$ core/seo/sitemap.php [L]

Nginx

On Nginx (which ignores .htaccess), add the equivalent rules to your server { } block:

location = /robots.txt { rewrite ^ /core/seo/robots.php last; }
location = /sitemap.xml { rewrite ^ /core/seo/sitemap.php last; }
Because these files are generated on the fly, there is nothing to cache or reset — they always reflect the current domain and the public pages.

Admin Panel

The Admin Panel is accessible at ?page=admin and requires GM Level 3+ (configurable via GM_LEVEL_ADMIN). The sidebar is organized with 5 fixed core items at the top, followed by sortable module items.

Access Requirements

Your account must have GM Level 3+ in the account_access table. Changes take effect after logout and re-login.

Sidebar Structure

# Item Sortable
1DashboardFixed
2NewsFixed
3Site LayoutFixed
4UsersFixed
5ModulesFixed
6+Shop, Vote, Forum, Bugtracker, Audit Log, Settings, etc.Sortable

Dashboard

The dashboard provides a real-time overview of your server and CMS activity.

Server Status

Online/offline status, player count, and uptime for auth and world servers.

Recent Purchases

Last 5 shop purchases with status (delivered/pending/failed).

Recent Registrations

Newest accounts with registration date and email.

Forum Activity

Recent forum posts and thread counts.

Shop Management

The shop system allows players to purchase items, gold, services, and more using in-site currency or real money integration.

Adding Shop Items

Navigate to Admin Panel → Shop Items → Add Item and fill in:

NameDisplay name shown to players
CommandSOAP command with {player} placeholder
IconFontAwesome icon class (e.g., fas fa-coins)
PriceCost in donation points or currency
CategoryGrouping: Items, Services, Gold, Mounts, etc.
RarityVisual border color: Common, Uncommon, Rare, Epic, Legendary
LimitMax purchases per account (0 = unlimited)
ActiveToggle visibility in the shop

Shop Activity Log

View all purchases with timestamps, buyer info, item details, and delivery status. Failed deliveries show SOAP error messages for debugging.

Shop items are cached for performance. Changes may take up to 5 minutes to appear, or clear cache manually.

Donation Management

Manage donation packages, transactions and payment gateways from Admin Panel → Donations.

Packages

Create packages with a name, price, DP amount and optional bonus. For example: Supporter Pack — €10 → 1100 DP (100 bonus). The currency is global and set in Settings.

Settings

ModeManual, Automatic, or Both
CurrencyEUR, USD, GBP and more (used for packages and payments)
DP rateDP awarded per 1 currency unit for custom amounts
Stripe keysSecret, publishable and webhook signing secret
PayPal keysClient ID, secret and webhook ID (sandbox toggle available)
Crypto addressesAdd one or more coin + address pairs (shown to players)
NotificationsDiscord/Slack webhook for new manual requests

Transactions

The transactions log lists every donation with user, package, amount, DP, gateway, reference code and proof. Manual requests (manual_pending) show Approve and Reject buttons — approving credits the DP, rejecting records an optional note shown to the player.

User Management

Manage player accounts, GM levels, bans, and character data directly from the admin panel.

Account Management

  • View all registered accounts with email, registration date, and last login
  • Edit GM levels via account_access
  • Ban/unban accounts by username or IP
  • Reset passwords (SRP6 re-encrypted automatically)

Character Management

  • Search characters by name
  • View character details: level, race, class, guild, location
  • Transfer characters between accounts
  • Rename characters

Content Management

News

Publish news articles with a rich-text editor (HTML sanitized). Articles appear on the public archive (?page=news) and in the homepage news section.

Site Layout

Manage the homepage sections (hero slider, promos, news, etc.), the navigation menu, hero buttons, and social links. Sections can be enabled/disabled and reordered via drag-and-drop.

Hero Slider Editor

The hero slider content is fully editable from Site Layout → Hero Slider: titles, subtitles and descriptions for guests and members, the background image (template path or full URL), and the Discord / register button labels. It's stored in the settings table and falls back to sensible defaults when empty.

Cache Management

SkyWall uses file-based caching for shop items, server status, and other frequently accessed data.

Clear Cache

Admin Panel → Cache Management → Clear Cache. This removes all cached files in cache/. Data will be re-cached on next request.

Do not delete the .htaccess file in the cache directory. It prevents direct web access to cached files.

Template System

SkyWall v3.0.0 introduces a powerful template system that allows you to create, customize, and switch themes without modifying core files.

How It Works

Each template lives in templates/{template_id}/ and contains its own views, assets, and configuration. The active template is set in Admin Panel → Settings.

Isolated Structure

Each template has its own views/ and assets/ directory.

Live Editor

Edit template files in-browser with Monaco Editor (VS Code engine).

Instant Switching

Change the active template from settings with one click.

Safe Updates

Core updates won't overwrite your custom templates.

Live Template Editor

The Template Editor provides a VS Code-like editing experience directly in your browser, powered by Monaco Editor.

Features

  • Syntax highlighting for PHP, HTML, CSS, and JavaScript
  • File browser sidebar with tree view of template files
  • Auto-save with manual save button
  • Preview button to see changes in a new tab
  • Error detection with inline diagnostics

Accessing the Editor

Admin Panel → Modules → Template Editor. Select the active template and browse files in the left panel.

Breaking changes to template files may cause display errors. Always backup before editing. Use the Preview button to test changes before saving.

Template Asset Helper

Use template_asset() in your templates to reference assets from the active template directory:

// In template PHP files:
<img src="">
<link href="" rel="stylesheet">

This resolves to templates/{active}/assets/img/logo.png automatically.

Template Structure

Each template follows a consistent directory structure:

templates/
  skywall/                    
    template.php              
    views/
      index.php               
      header.php              
      footer.php              
      login.php               
      register.php            
      shop.php                
      ...                     
    assets/
      img/
        logo.png              
        bg.jpg                
      css/
        custom.css            
      js/
        custom.js             

template.php

Every template must have a template.php file that returns metadata:

<?php
return [
    'name'        => 'SkyWall Default',
    'author'      => 'SkyWall Team',
    'version'     => '3.0.0',
    'description' => 'Default dark theme with gold accents',
];

Creating Custom Templates

1
Create Template Directory

Create a new folder in templates/ with a unique ID (lowercase, no spaces):

mkdir templates/mytheme
2
Add template.php

Create templates/mytheme/template.php with the metadata array shown above.

3
Create Required Views

Copy the default template's views/ folder as a starting point, then customize:

cp -r templates/skywall/views/ templates/mytheme/views/
4
Add Assets

Create templates/mytheme/assets/ with img/, css/, and js/ subdirectories.

5
Activate Template

Go to Admin Panel → Settings → Appearance and select your new template from the dropdown.

Your custom template is now active! Use the Live Template Editor to make further changes without touching the filesystem.

Module Overview

SkyWall is built with a modular architecture. Each module is self-contained with its own controllers, views, and routes.

Module Route Description
Home?page=homeHomepage with slides, news, and server status
Auth?page=loginLogin, registration, password recovery
Shop?page=shopItem shop with categories and cart
Donations?page=donateDonation packages with Stripe/PayPal/crypto
Forum?page=forumCommunity forum with categories and reactions
News?page=newsPublic news archive with full-article reading
Armory?page=armoryCharacter lookup by name or GUID
Rankings?page=rankingsLeaderboards (level, honor, kills, playtime)
Live Map?page=mapLive world map of online players
Vote?page=voteVote for rewards with callback support
Account Level?page=account_levelProgression ranks and shareable badges
Bugtracker?page=bugtrackerReport and track bugs
Status?page=statusServer status JSON API
Admin?page=adminAdministration panel (GM 3+)

Shop Module

The shop is the core revenue module. Players browse items, add to cart, and purchase with points or real currency.

Features

  • Category filtering and search
  • Rarity-based visual styling (Common to Legendary)
  • Purchase limits per account
  • Automatic SOAP delivery on purchase
  • Activity log with delivery status tracking
  • Rate limiting (10 purchases/hour)

Cart & Checkout

Players can add multiple items to their cart. At checkout, the system processes each item sequentially via SOAP commands. If any delivery fails, the error is logged and visible in the admin activity log.

Forum Module

A lightweight community forum with categories, threads, posts, and reactions.

Features

  • Category-based organization with icons and permissions
  • Thread creation with rich text (HTML sanitized)
  • Post reactions (AJAX-powered, no page reload)
  • Pinned and locked threads
  • Rate limiting (5 posts/hour)
  • Math CAPTCHA for guests

News Module

A public news archive (?page=news) that lists every published article in a card grid, with a full-article reading modal. The homepage keeps a shorter "Latest News" teaser.

Where articles live

  • Admin — write, edit, publish and delete articles (rich text, HTML sanitized, optional header image).
  • Public archive — ?page=news shows all articles, newest first.
  • Homepage teaser — the "Latest News" section (a carousel) is enabled/disabled from Site Layout → Page Sections.

The News module is self-contained: its admin controller, admin views (views/admin/), public archive and homepage section all live under modules/news/. Disabling the module removes the news archive, the homepage news section and the News menu item automatically.

Armory Module

A standalone character armory with a search page. Players can look up any character by name and view their full profile.

How it works

  • Open ?page=armory and search by character name
  • Or link directly: ?page=armory&name=Stylo or ?page=armory&guid=5

Features

  • Character sheet: level, race, class, guild, health, resources, gold
  • Equipment slots with real item icons and item-level average
  • Base stats (strength, agility, stamina, intellect, spirit), armor, crit
  • Talent tree distribution with spec detection
  • Achievements with real names and icons (from Wowhead)
  • PvP stats: arena ratings, honor kills
  • Professions with progress bars
  • Multi-core compatible (queries adapt to core schema)

Rankings Module

Player leaderboards driven by direct queries to the characters database, cached for 60 seconds.

Leaderboards

  • World Legends — top by level and XP
  • Honored Heroes — top by honor points
  • Elite Killers — top by confirmed kills
  • Most Dedicated — top by playtime

Hardcore Rankings

When the hardcore module is installed (hc_dead_log table present), two extra sections appear:

  • HC Longevity — the highest-level hardcore characters (all-time)
  • Hall of Fame (RIP) — fallen heroes with their killer

Character cards are clickable and open the armory. Rankings are automatically hidden from the profile when the module is disabled.

Live Map Module

A live world map showing online players on Azeroth, Outland and Northrend, refreshed every 30 seconds.

How it works

  • Open ?page=map and switch between the Azeroth / Outland / Northrend tabs.
  • Players are shown as colored dots — blue for Alliance, red for Horde.
  • Hover a dot to see the player name, level and zone; click it to open their armory.

Data source

Players are read from the characters table (online = 1) with their map, zone and coordinates. Coordinates are mapped to pixels using the standard WotLK world-map bounds. Results are cached for 30 seconds to limit database load.

Map images

The three continent maps live in modules/livemap/assets/img/map/ (azeroth.jpg, outland.jpg, northrend.jpg — 966×732 px). Placeholder images are shipped by default; replace them with real map images extracted from the WoW client.

Vote System

Reward players for voting on top-listing sites. Supports multiple vote sites with callback verification.

Configuration

Add vote sites in Admin Panel with:

  • Site name and URL
  • Callback URL (provided by the voting site)
  • Secret key for callback verification
  • Reward command (SOAP command to execute on vote)

Vote Callback API

The callback endpoint at ?page=api/vote/callback accepts a GET request with the following query parameters:

?user_id=123&site_id=1&secret=your_secret_key

Returns JSON {"success": true, "message": "Vote successful"} or {"success": false, "message": "reason"}.

Account Level System

Reward player progression across all characters with 30 account-wide levels.

Features

  • XP calculated from all characters (up to 12) using WotLK 3.3.5a XP table
  • 30 levels with progressive XP thresholds and rank titles
  • Tier system: gray, white, green, blue, purple, orange, legendary, mythic
  • Shareable badges with unique 8-character codes and public URLs
  • Character visibility toggle and XP details toggle
  • Badges displayed in forum posts

Bugtracker Module

Allow players to report bugs and track their resolution status.

Features

  • Submit bug reports with title, description, and severity
  • Status tracking: Open, In Progress, Resolved, Closed
  • Admin can update status and add comments
  • Rate limiting (10 reports/day)

Status Module

A lightweight JSON endpoint that reports the live server state. Point any external status page, Discord bot or monitoring tool at it.

Endpoint

GET /index.php?page=status

Returns a normalized JSON object, cached for 30 seconds, with a stale-cache fallback (5 minutes) and a TCP socket check as a last resort.

{
  "online": 42,
  "status": "online",
  "uptime": 10858,
  "timestamp": 1788729931,
  "fallback": false,
  "stale": false
}
  • online — current player count (from the characters DB)
  • status — online / offline
  • uptime — seconds since last restart (auth uptime table)
  • fallback — true when the result came from the socket check
  • stale — true when the result came from the stale cache

SOAP Command Reference

Shop items use SOAP commands to deliver rewards. Use the {player} placeholder which is replaced with the buyer's character name at purchase time.

Send Single Item
.send mail {player} "Subject" "Body" itemId

Example: .send mail {player} "Purchase" "Enjoy!" 49284

Send Gold via Mail
.send money {player} "Subject" "Body" copper_amount

1 Gold = 10,000 copper. Example: .send money {player} "Shop" "Gold!" 100000000 = 10,000g

Set Character Level
.character level {player} #level

Example: .character level {player} 80

Send Mail (Text Only)
.send mail {player} "Subject" "Body text"
Send Multiple Items
.send items {player} "Subject" "Body" id1:count1 id2:count2

Example: .send items {player} "Bundle" "Here!" 49284:1 49623:5

Add Title
.title add {player} #titleId

Example: .title add {player} 123

The {player} placeholder is replaced with the buyer's character name at purchase time. Character names are sanitized to alphabetic characters only for command injection prevention. All SOAP commands must start with a dot (.).

Security Features

SkyWall v3.0.0 includes 28 security fixes and enterprise-grade protection.

Feature Description
CSRF Tokens All POST requests enforced globally via Router middleware
Rate Limiting Login (5/5min), Register (3/h), Email change (5/h), Shop purchase (10/h), Forum (5–10/5min), Bugtracker comments (20/5min)
Session Manager Centralized with HttpOnly, SameSite=Strict, Secure flags, and session regeneration
IP Spoofing Prevention Only trusts forwarded headers behind known CDN/proxy IPs
.env Protection PHP exit tag prevents direct access on Nginx/PHP-FPM
SRP6 Encryption WoW-standard password hashing (binary + hex format support)
SQL Injection Prevention PDO prepared statements on every query
XSS Protection Output encoding + HTML sanitizer with whitelist
Secure Error Handling Generic error messages in production, detailed logs only
Command Injection Prevention Character names sanitized to alpha-only, commands must start with .
Math CAPTCHA Context-based bot protection (no third-party dependency)
Directory Protection .htaccess blocks direct access to internal PHP files (core/, modules/, templates/), SQL schema files, and sensitive directories (vendor/, cache/, logs/)
GM Level Constants Named constants replace magic numbers for access control
Audit Trail All admin actions logged with user, IP, and details

API Endpoints

Endpoint Method Description
?page=status GET Server status JSON (online, players, uptime)
?page=api/vote/callback POST Vote callback verification with secret auth
?page=badge&code=XXXXXXXX GET Public account level badge image
?page=forum_react POST Forum post reaction toggle (AJAX)
?page=admin_menu_sort POST Menu item reordering (AJAX)
?page=admin_sidebar_sort POST Admin sidebar reordering (AJAX)
?page=admin_migrate_run POST Run database migrations (AJAX)
?page=admin_template_editor_get_file POST Get template file content (AJAX)
?page=admin_template_editor_save_file POST Save template file content (AJAX)

FAQ

Replace templates/{active}/assets/img/logo.png with your own file. Keep similar dimensions for best results. You can also upload a new logo via the Live Template Editor.
Ensure your account has GM Level 3+ (GM_LEVEL_ADMIN) in account_access. Logout and login again for session updates.
  1. Check SOAP settings in .env (IP, port, user, pass)
  2. Make sure SOAP is enabled in worldserver.conf (SOAP.Enabled = 1)
  3. Make sure the SOAP account has GM level 3+ in account_access
  4. Test the command manually in-game: e.g. .send items Playername "Test" "Test" 49284:1
  5. Check Shop Activity in admin panel for error details
Admin Panel → Shop Items → Add Item. Fill in the name, server command (with {player} placeholder), icon, price, category, and rarity. See the SOAP Command Reference for command examples.
Use Wowhead (WotLK). Search for the item, the ID is in the URL: wowhead.com/wotlk/item=49284. For icons, the icon name is shown on the item page (e.g. ability_mount_spectraltiger).
SkyWall v3.0.0 supports 4 cores: AzerothCore, TrinityCore, cMaNGOS, and VMaNGOS. The installer can auto-detect your core after testing the database connection. Select your core during installation and the CMS will use the appropriate SQL queries and password hashing format.
The installer does not lock itself automatically. After installation completes and .env is created, delete install.php from the server (or restrict access to it) to prevent the setup from being run again.
Admin Panel → Cache Management → Clear Cache. Or manually delete all files in the cache/ directory (except .htaccess). Shop items will be re-cached on the next request.
Create a new folder in templates/ with a template.php metadata file, views/ directory, and assets/ directory. See the Creating Templates section for a step-by-step guide.
Items 1-5 in the admin sidebar (Dashboard, News, Site Layout, Users, Modules) are fixed. All remaining items are sortable via drag-and-drop. Reordering is saved via AJAX with CSRF protection.

Troubleshooting

Blank White Page

Enable error reporting temporarily by adding to .env:

APP_DEBUG=true

Check logs/app.log for PHP errors. Common causes: missing PHP extensions, incorrect file permissions, or syntax errors in templates.

SOAP Connection Refused

Verify:

  • SOAP.Enabled = 1 in worldserver.conf
  • SOAP port matches (default: 7878)
  • SOAP account exists with correct credentials
  • Firewall allows connections to the SOAP port
Database Connection Failed

Check .env values for DB_HOST, DB_USERNAME, DB_PASSWORD, DB_AUTH, DB_CHA, DB_WORLD, and DB_CMS. Test the connection manually:

mysql -h 127.0.0.1 -P 3306 -u root -p
CSRF Token Mismatch

This usually means your session expired. Refresh the page and try again. If persistent, clear your browser cookies and re-login.

Template Not Loading

Verify the active template name in Admin Panel → Settings matches a folder in templates/. Ensure template.php exists in the template directory and returns a valid array.

Still having issues? Check the logs/ directory for detailed error logs. Enable APP_DEBUG=true in .env for development environments.

© 2026 SkyWall CMS. All rights reserved.

Documentation v3.3.0 — • Performance optimized • Multi-core support