AI-Powered Conversational CMS - Build websites through chat.
- Conversational website building - Create and modify websites through natural language
- Single Docker container - Everything you need in one image
- Choose your LLM - Works with Claude, GPT-4, and other providers
- No vendor lock-in - Standard HTML/CSS/JS stored in a Git repository
- Self-hosted - Your data stays on your infrastructure
Pull the image and run:
docker run -d \
-p 8080:80 \
-e ADMIN_USER=admin \
-e ADMIN_PASS=changeme \
-v skynetcms-data:/data \
--name skynetcms \
ghcr.io/skynetcms/skynetcms:latestThen visit:
- Admin panel: http://localhost:8080/sn_admin/
- Your website: http://localhost:8080/
Run without credentials to use the web-based registration:
docker run -d \
-p 8080:80 \
-v skynetcms-data:/data \
--name skynetcms \
ghcr.io/skynetcms/skynetcms:latestVisit http://localhost:8080/sn_admin/ to create your admin account.
| Variable | Required | Default | Description |
|---|---|---|---|
ADMIN_USER |
No* | - | Admin username |
ADMIN_PASS |
No* | - | Admin password |
SITE_TITLE |
No | SkyNetCMS | Site title |
*If both ADMIN_USER and ADMIN_PASS are provided, admin is pre-configured. If neither is provided, a registration form will be shown at first access.
┌─────────────────────────────────────────────────────────┐
│ Docker Container │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ OpenResty (Nginx + Lua) │ │
│ │ │ │
│ │ / /sn_admin/ /sn_admin/oc/ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ Static Dashboard OpenCode │ │
│ │ Website (htpasswd) (AI Chat) │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Git Repo │ │
│ │ /data/ │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────┘
How it works:
- You chat with AI in the admin panel (
/sn_admin/oc/) - AI works in a draft worktree (isolated from live site)
- Preview your changes at
/sn_admin/dev/(Dev mode toggle) - When ready, tell the AI to "publish" your changes
- Visitors see updates at
/
SkyNetCMS protects your live site by separating draft work from production:
| URL | Purpose |
|---|---|
/ |
Live site - What visitors see (main branch) |
/sn_admin/dev/ |
Preview - See draft changes with live reload |
/sn_admin/oc/ |
AI Chat - Make changes via conversation |
- Start a session - OpenCode will suggest creating a worktree (isolated branch)
- Make changes - Chat with AI to edit your site
- Preview - Click the "Dev" toggle to see changes in real-time
- Publish - Tell the AI "publish my changes" when ready
Changed your mind? The AI automatically creates restore points:
- Say "rollback to the previous version" to undo a publish
- All previous states are saved as git tags
git clone https://github.com/SkyNetCMS/SkyNetCMS.git
cd SkyNetCMS
./build.shdocker run -d \
-p 8080:80 \
-e ADMIN_USER=admin \
-e ADMIN_PASS=test \
-v skynetcms-data:/data \
--name skynetcms \
skynetcmsdocker logs -f skynetcmsdocker stop skynetcms && docker rm skynetcmsDev preview fails / Vite crashes with EMFILE or ENOSPC (inotify)
On resource-constrained hosts the kernel's inotify limit (often 128 by default)
can be exhausted by Vite's file watcher, crashing the dev preview at
/sn_admin/dev/. The container can only warn about this — max_user_instances
is a host kernel setting and is not namespaced, so it cannot be raised reliably
from inside an unprivileged container.
Temporary fix (resets on host reboot):
sudo sysctl fs.inotify.max_user_instances=512
sudo sysctl fs.inotify.max_user_watches=524288Persistent fix:
echo -e "fs.inotify.max_user_instances=512\nfs.inotify.max_user_watches=524288" | \
sudo tee /etc/sysctl.d/99-inotify.conf
sudo sysctl --systemMIT License - Use it however you want.