Deployment
Options for deploying SolidOS in production and development environments.
Deployment Models
1. Static Hosting
The simplest deployment — serve mashlib from a static host.
Best for: Quick demos, development, testing
<!DOCTYPE html>
<html>
<head>
<title>My Solid App</title>
<script src="https://cdn.jsdelivr.net/npm/mashlib/dist/mashlib.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/mashlib/dist/mash.css" rel="stylesheet">
</head>
<body>
<div id="PageBody"></div>
<script>
document.addEventListener('DOMContentLoaded', () => {
panes.runDataBrowser(document)
})
</script>
</body>
</html>
Hosting options:
- GitHub Pages
- Netlify
- Vercel
- Any static file server
2. Embedded in Solid Server
Many Solid servers can serve SolidOS as the default UI.
Community Solid Server (CSS)
npm install -g @solid/community-server mashlib
# Create config extending default
cat > config.json << 'EOF'
{
"@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^7.0.0/components/context.jsonld",
"import": [
"css:config/app/main/default.json",
"css:config/app/init/initialize-root.json"
]
}
EOF
# Run with mashlib
community-solid-server -c config.json
Node Solid Server (NSS)
NSS includes SolidOS by default:
npm install -g solid-server
# Run with default config
solid-server --port 8443
3. Standalone Application
Build a custom SolidOS-based application.
# Create new project
mkdir my-solid-app && cd my-solid-app
npm init -y
# Install dependencies
npm install mashlib
# Copy assets
cp node_modules/mashlib/dist/mashlib.min.js public/
cp node_modules/mashlib/dist/mash.css public/
// public/app.js
document.addEventListener('DOMContentLoaded', () => {
// Custom initialization
const startUri = 'https://your-pod.example/'
const subject = panes.UI.store.sym(startUri)
panes.runDataBrowser(document, subject)
})
4. Desktop Application (Data Kitchen)
Electron wrapper for desktop use.
git clone https://github.com/SolidOS/data-kitchen
cd data-kitchen
npm install
npm start
Build distributable:
npm run package
# Creates platform-specific installers
Production Considerations
CDN vs Self-Hosting
CDN (jsDelivr, unpkg)
- ✅ Easy setup
- ✅ Fast global delivery
- ✅ No maintenance
- ❌ Depends on third-party
- ❌ Version updates can break things
Self-Hosting
- ✅ Full control
- ✅ No external dependencies
- ✅ Lock to specific version
- ❌ Need to manage hosting
- ❌ Handle caching yourself
Pinning Versions
Always pin to a specific version in production:
<!-- Pinned to specific version -->
<script src="https://cdn.jsdelivr.net/npm/mashlib@1.8.5/dist/mashlib.min.js"></script>
<!-- Or host the exact version yourself -->
<script src="/assets/mashlib-1.8.5.min.js"></script>
HTTPS Requirement
Solid requires HTTPS for:
- WebID authentication
- Secure cookie handling
- CORS with credentials
Development options:
# Local CSS with self-signed cert
community-solid-server --https
# Or use localhost (browsers allow HTTP)
community-solid-server --port 3000
Production:
- Use Let's Encrypt for free certificates
- Configure your reverse proxy for HTTPS
Reverse Proxy Setup
Nginx
server {
listen 443 ssl;
server_name pod.example.org;
ssl_certificate /etc/letsencrypt/live/pod.example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pod.example.org/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket support
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Caddy
pod.example.org {
reverse_proxy localhost:3000
}
Docker Deployment
Basic Docker Setup
# Dockerfile
FROM node:20-alpine
WORKDIR /app
# Install CSS
RUN npm install -g @solid/community-server
# Copy mashlib
COPY node_modules/mashlib/dist /app/mashlib
EXPOSE 3000
CMD ["community-solid-server", "-p", "3000"]
Docker Compose
# docker-compose.yml
version: '3'
services:
solid:
build: .
ports:
- "3000:3000"
volumes:
- ./data:/app/data
environment:
- CSS_BASE_URL=https://pod.example.org
Performance Optimization
Code Splitting
If building a custom app, split mashlib:
// Load only what you need
import { graph, Fetcher, sym } from 'rdflib'
import { store, authn } from 'solid-logic'
import * as UI from 'solid-ui'
Caching Headers
Configure your server for optimal caching:
# Static assets - long cache
location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# HTML - no cache
location / {
add_header Cache-Control "no-cache";
}
Preloading
Preload critical resources:
<link rel="preload" href="mashlib.min.js" as="script">
<link rel="preload" href="mash.css" as="style">
Monitoring
Health Checks
// Simple health endpoint
app.get('/health', (req, res) => {
res.json({
status: 'ok',
version: process.env.npm_package_version,
uptime: process.uptime()
})
})
Error Tracking
// Global error handler
window.onerror = (message, source, line, col, error) => {
// Send to your logging service
console.error('SolidOS Error:', { message, source, line, error })
}
Environment-Specific Configuration
Development
const config = {
debug: true,
logLevel: 'verbose',
apiUrl: 'http://localhost:3000'
}
Production
const config = {
debug: false,
logLevel: 'error',
apiUrl: 'https://pod.example.org'
}
Feature Flags
const features = {
experimentalPanes: process.env.ENABLE_EXPERIMENTAL === 'true',
analytics: process.env.ENABLE_ANALYTICS === 'true'
}
if (features.experimentalPanes) {
paneRegistry.register(experimentalPane)
}
Upgrading
Checking for Updates
npm outdated mashlib
Upgrade Process
- Review changelog for breaking changes
- Update in staging environment first
- Run your test suite
- Deploy to production
- Monitor for issues
See Also
- Quick Start — development setup
- CSS Documentation
- Docker Hub - Solid