Everything you need to set up, deploy, and use OmniLog.
OmniLog is a self-hosted work journal designed for developers, researchers, and anyone who wants a private, structured writing tool. It supports three editor modes — rich text, Markdown, and LaTeX — all interconvertible.
Key principles:
OmniLog uses a client-server model. Desktop and mobile apps connect to a central server over a REST API. The server stores all data in MongoDB and handles authentication, versioning, and file uploads.
The server is a single Rust binary with no runtime dependencies. It can run on any Linux server, VPS, or even a Raspberry Pi.
The recommended way to run OmniLog. You get full control over your data, backups, and access.
Download the latest release for your platform. The binary is self-contained — no Node.js, Python, or Docker required.
Create a .env file in the same directory as the binary:
# Server
PORT=9528
HOST=0.0.0.0
# Database
MONGODB_URI=mongodb://user:pass@localhost:27017/omnilog?authSource=admin
# Security - generate a random token for API auth
API_TOKEN=your-random-token-here
# Bootstrap admin account
ADMIN_USERNAME=admin
ADMIN_PASSWORD=your-secure-password
# Optional
# SMTP_HOST=smtp.example.com
# SMTP_PORT=587
# [email protected]
# SMTP_PASS=password
# PUBLIC_URL=https://omnilog.example.com
# Run directly
./omnilog-server
# Or create a systemd service for auto-start
sudo tee /etc/systemd/system/omnilog.service <<EOF
[Unit]
Description=OmniLog Server
After=network.target mongod.service
[Service]
Type=simple
WorkingDirectory=/opt/omnilog
ExecStart=/opt/omnilog/omnilog-server
EnvironmentFile=/opt/omnilog/.env
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now omnilog
Put the server behind a reverse proxy. Example with Caddy:
omnilog.example.com {
reverse_proxy localhost:9528
}
Open the desktop or mobile app, enter your server URL (e.g. https://omnilog.example.com), and sign in with the admin credentials from your .env.
Tip: The first time the server starts, it creates an admin account using ADMIN_USERNAME and ADMIN_PASSWORD. You can then create additional user accounts through the admin panel or API.
Don't have a server? The desktop app includes an embedded server that runs on your machine with one click.
To start: open the desktop app, and click “Start local server” on the setup screen. The app spawns the server in the background and connects automatically.
Migration: You can switch from local mode to a self-hosted server at any time. Your entries are synced to the new server automatically.
Note: Local mode is desktop-only. Mobile apps require a remote server to connect to — they cannot run an embedded server.
We are building a hosted version of OmniLog for users who prefer not to manage a server. The official cloud service will offer:
Your apps will connect to the official service the same way they connect to a self-hosted server. You can migrate between self-hosted and cloud at any time.
The full-featured client, built with Tauri 2 (Rust + React). Includes:
Optimized for quick capture and review on the go. Built with Tauri 2 Mobile. Includes:
Note: The mobile app is currently in development. Android release coming soon.
All clients connect to the same server. Write on your desktop at work, review on your phone at home.
Each device identifies itself by a unique device name, visible in the version history so you can see where each edit was made.
The server exposes a full REST API for all operations. Both the desktop and mobile apps use this API — there is no special protocol.
Two methods:
.env as API_TOKEN. Sent as Authorization: Bearer <token>. Has full admin access.POST /api/auth/login with username and password. Returns a JWT token scoped to the user's permissions.GET /health # Server health check
POST /api/auth/login # Login, returns JWT
GET /api/auth/me # Current user profile
GET /api/entries # List entries (with ?folderId= filter)
POST /api/entries # Create entry
PUT /api/entries/:id # Update entry
DELETE /api/entries/:id # Delete entry
GET /api/entries/search?q= # Full-text search
GET /api/folders # List folders
POST /api/folders # Create folder
PUT /api/folders/:id # Update folder
DELETE /api/folders/:id # Delete folder
GET /api/settings # Server settings
PUT /api/settings # Update settings
POST /api/assets/upload # Upload image (multipart)
All configuration is done through environment variables (or a .env file).
# Required
PORT=9528 # HTTP listen port
HOST=0.0.0.0 # Bind address
MONGODB_URI=mongodb://... # MongoDB connection string
API_TOKEN=... # Static admin token
# Bootstrap (used on first run only)
ADMIN_USERNAME=admin
ADMIN_PASSWORD=...
# Optional: Email (for verification & password reset)
SMTP_HOST=smtp.example.com
SMTP_PORT=587
[email protected]
SMTP_PASS=...
EMAIL_FROM=OmniLog <[email protected]>
# Optional: Public URL (used in emails)
PUBLIC_URL=https://omnilog.example.com
# Optional: CORS (default: allow all)
CORS_ORIGIN=https://your-frontend.com