Skip to content

Configuration

Configuration is managed via environment variables. For development, copy .env.sample to .env:

Terminal window
cp .env.sample .env

For production, copy the production template:

Terminal window
cp deploy/env.production.example server/.env.production
VariableDefaultDescription
NODE_ENVdevelopmentEnvironment mode (development or production)
PORT3000API server port
BASE_URLhttp://localhost:3000Public URL for your instance
ALLOWED_ORIGINSComma-separated list of allowed CORS origins

Example:

Terminal window
NODE_ENV=production
PORT=3000
BASE_URL=https://knitly.example.com
ALLOWED_ORIGINS=https://knitly.example.com
VariableDefaultDescription
DATABASE_PATH../knitly.dbPath to SQLite database (relative or absolute)
VariableDefaultDescription
USE_LOCAL_STORAGEtrueStore uploads on local filesystem
LOCAL_UPLOAD_DIR../uploadsDirectory for media uploads
VariableDescription
USE_LOCAL_STORAGESet to false to use S3
SPACES_ENDPOINTS3 endpoint URL
SPACES_REGIONS3 region
SPACES_BUCKETBucket name
SPACES_KEYAccess key ID
SPACES_SECRETSecret access key
SPACES_PUBLIC_URLPublic URL for accessing uploads

Example S3 Configuration:

Terminal window
USE_LOCAL_STORAGE=false
SPACES_ENDPOINT=nyc3.digitaloceanspaces.com
SPACES_REGION=nyc3
SPACES_BUCKET=my-knitly-bucket
SPACES_KEY=YOUR_ACCESS_KEY
SPACES_SECRET=YOUR_SECRET_KEY
SPACES_PUBLIC_URL=https://my-bucket.nyc3.cdn.digitaloceanspaces.com
VariableDefaultDescription
MAX_UPLOAD_BYTES10485760 (10MB)Maximum file size
MEDIA_MAX_DIMENSION2048Maximum image dimension
MEDIA_QUALITY82JPEG quality (1-100)
VariableDefaultDescription
ADMIN_EMAILEmail for admin account
ADMIN_PASSWORDPassword for admin account
ADMIN_USERNAMEUsername for admin account
ADMIN_DISPLAY_NAMEDisplay name for admin account

After setup, configure these in the admin panel at /admin:

  • Instance name - Display name for your instance (max 50 characters)
  • Logo icon - Chosen from a fixed set of Lucide icons (Zap, Rocket, Sparkles, Heart, and more)

Invite links are also managed from the admin panel, including expiry and revocation.

Set ALLOWED_ORIGINS to a comma-separated list of allowed domains:

Terminal window
ALLOWED_ORIGINS=https://your-domain.com,https://www.your-domain.com

For development, you can use wildcards:

Terminal window
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000

Note: Wildcards are not allowed in production for security.

Knitly includes automatic security headers:

HeaderValue
Content-Security-PolicyDefault CSP for self-hosted app
X-Frame-OptionsDENY
X-Content-Type-Optionsnosniff
Referrer-Policystrict-origin-when-cross-origin
Permissions-PolicyRestricted permissions

Customize via middleware/security.js if needed.

Endpoint TypeLimitWindow
Auth5minute
Search20minute
General API100minute

Customize via middleware/rateLimit.js.

Knitly stores everything in a single SQLite file, so a backup is a file copy. Stop the server first so the copy is consistent (or use SQLite’s online backup).

Terminal window
# Stop the server (systemd example)
sudo systemctl stop knitly
# Backup
cp ../knitly.db ../knitly.db.backup.$(date +%Y%m%d)
# Restart
sudo systemctl start knitly

Create a backup script:

Terminal window
sudo nano /usr/local/bin/knitly-backup
#!/bin/bash
BACKUP_DIR="/var/backups/knitly"
DB_PATH="/path/to/knitly.db"
mkdir -p "$BACKUP_DIR"
cp "$DB_PATH" "$BACKUP_DIR/knitly.db.$(date +%Y%m%d%H%M%S)"
find "$BACKUP_DIR" -name "knitly.db.*" -mtime +30 -delete
Terminal window
sudo chmod +x /usr/local/bin/knitly-backup

Add to crontab:

Terminal window
sudo crontab -e
# Backup daily at 2am
0 2 * * * /usr/local/bin/knitly-backup

Logs to console when running bun run dev.

Check logs via:

systemd:

Terminal window
journalctl -u knitly -f

Docker:

Terminal window
docker compose logs -f

Production logs go to server/logs/.

You can specify a custom environment file:

Terminal window
NODE_ENV=staging bun --cwd server run dev

Or for production:

Terminal window
NODE_ENV=production bun --cwd server run start
EnvironmentLocation
Developmentserver/.env
Productionserver/.env.production
DockerSet in docker-compose.yml