omajot

Get started

Set up omajot

omajot has two parts. The hub runs on one computer that is always on. The clients are the web app, for every browser and phone, and the Omarchy plugin, an extra for Omarchy users. Tailscale connects them. The setup takes about 15 minutes. You do not need a compiler.

Try it locally first Optional

You can try the web app on one computer, without Tailscale. This example uses the sample notes from the repository.

$ git clone https://github.com/renerocksai/omajot && cd omajot
$ tools/install-release.sh
$ bin/omajot hub --port 8787 --data /tmp/omajot-demo --no-auth &
$ tools/seed_sample.py --data /tmp/omajot-demo-replica --hub http://127.0.0.1:8787

Open http://127.0.0.1:8787 in your browser. --no-auth turns off the login check. The hub accepts it only on the loopback address.

What you need

Choose your path

Every setup needs the hub (step 1) and Tailscale (step 2). Then choose:

A · Web app

For Mac, Windows, Linux and phones. You do not need Omarchy or Linux. The web app is a complete omajot client: it works offline and syncs.

Do steps 1, 2 and 5.

B · Web app and Omarchy plugin

The same, plus omajot in your Omarchy bar: a dropdown and a main window.

Do steps 1 to 5.

The labels on each section show where it applies: Hub computer Every device Omarchy only Optional

We test the web app in Chrome and Chromium on the desktop and in Safari on iOS 26. Other modern browsers should work.

1 · Run the hub Hub computer

The hub stores all changes and sends them to your devices. It also serves the web app. Do these steps on the computer that is always on.

Install omajot. On macOS, use Homebrew. On Linux, use Homebrew or the install script.

ComputerCommand
macOS, or Linux with Homebrewbrew install renerocksai/tap/omajot
Linux without Homebrewgit clone https://github.com/renerocksai/omajot ~/omajot && ~/omajot/tools/install-release.sh

Homebrew installs the released binary for this computer. tools/install-release.sh downloads it from the GitHub release and checks its SHA-256 against release.json in the repository. It installs the binary into ~/omajot/bin/omajot and links ~/.local/bin/omajot to it, so omajot works from any folder. It tells you if ~/.local/bin is not on your PATH.

Tell the hub your login. Make the file ~/.config/omajot/config.json, or add the key if the file exists already. Replace you@example.com with your Tailscale login name. The Tailscale admin console shows it on the Users page. The hub accepts API requests only from this login.

{ "hub_login": "you@example.com" }

Start the hub:

$ tmux new -s omajot-hub
$ omajot hub

The hub listens on 127.0.0.1:8787 only. It writes all changes to ~/omajot-data/batches.jsonl and all images to ~/omajot-data/blobs/. Include this folder in your backups. The web app is in the omajot binary. To use other values, add "hub_port" or "hub_data" to the config file, or use the flags --login, --port and --data (see omajot hub).

The tmux line is optional. tmux keeps the hub running when you close the terminal window. You can also use another tool for this, or keep a terminal window open. With Homebrew, you can also start the hub as a service now: see Start the hub at boot.

On Windows (experimental), download omajot-x86_64-windows.exe from the releases. The Windows binary builds on the IOCP backend of bounded/http. We did not run it as a hub yet. If there is no release for your computer, build from source.

tmux: install it, detach, and come back later

Install tmux if your computer does not have it:

ComputerCommand
Omarchytmux is installed already
Other Arch Linuxsudo pacman -S tmux
Debian, Ubuntusudo apt install tmux
macOSbrew install tmux (this needs Homebrew)
WindowsThere is no tmux. Keep the window with the hub open, for example minimized.

Use it:

To do thisDo this
Start a session with a nametmux new -s omajot-hub, then start the hub in it
Leave the session. The hub continues to run.Press Ctrl+b, release, then press d ("detach")
Show the sessionstmux ls
Go back to the hub, also from another computer over SSHtmux attach -t omajot-hub
Stop the hubGo back to the session, press Ctrl+c, then type exit

A tmux session ends when the computer restarts. To start the hub again by itself, run it as a service (next section).

Later: start the hub at boot, as a service

When the hub runs well in tmux, you can make it a service. Then it starts when the computer starts, and it restarts after a crash. Stop the hub in tmux first: only one hub may use the data folder. The service reads your login from ~/.config/omajot/config.json (step 1).

macOS, or Linux with Homebrew

$ brew services start omajot
$ tailscale serve --bg --https=8443 http://127.0.0.1:8787
To do thisCommand
See if the hub runsbrew services info omajot
Read its output (also the QR code)tail -f "$(brew --prefix)/var/log/omajot-hub.log"
Update the hubbrew upgrade omajot && brew services restart omajot
Stop it and do not start it againbrew services stop omajot

On macOS, the service starts at login. The Tailscale app for macOS also runs only when a user is logged in. On a Mac without a screen, turn on automatic login: System Settings → Users & Groups → Automatically log in as.

Omarchy, without Homebrew

  1. Install Tailscale as a service. It then starts at boot, and you can run tailscale serve without sudo:

    $ omarchy install service tailscale
  2. Make the file ~/.config/systemd/user/omajot-hub.service with this text. %h is your home folder.

    [Unit]
    Description=omajot hub
    After=network-online.target
    
    [Service]
    ExecStart=%h/omajot/bin/omajot hub
    Restart=on-failure
    RestartSec=5
    
    [Install]
    WantedBy=default.target
  3. Start the service now and at each login:

    $ systemctl --user daemon-reload
    $ systemctl --user enable --now omajot-hub
  4. Start it at boot also when nobody logs in (this can ask for your password):

    $ loginctl enable-linger
  5. Publish the hub one time. Tailscale keeps this setting after a restart:

    $ tailscale serve --bg --https=8443 http://127.0.0.1:8787
To do thisCommand
See if the hub runssystemctl --user status omajot-hub
Read its output (also the QR code)journalctl --user -u omajot-hub -f
Update the hubcd ~/omajot && git pull && tools/install-release.sh && systemctl --user restart omajot-hub
Stop it and do not start it againsystemctl --user disable --now omajot-hub

This works the same on other Linux computers with systemd. Install Tailscale with their package manager, and run sudo systemctl enable --now tailscaled and sudo tailscale set --operator=$USER.

macOS, without Homebrew

  1. Make the file ~/Library/LaunchAgents/io.github.renerocksai.omajot-hub.plist. Use full paths: launchd does not know ~. Replace you with your user name.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0"><dict>
      <key>Label</key><string>io.github.renerocksai.omajot-hub</string>
      <key>ProgramArguments</key><array>
        <string>/Users/you/omajot/bin/omajot</string><string>hub</string>
      </array>
      <key>RunAtLoad</key><true/>
      <key>KeepAlive</key><true/>
      <key>StandardOutPath</key><string>/Users/you/omajot-data/hub.log</string>
      <key>StandardErrorPath</key><string>/Users/you/omajot-data/hub.log</string>
    </dict></plist>
  2. Load it. It starts now and at each login:

    $ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/io.github.renerocksai.omajot-hub.plist

Read the output with tail -f ~/omajot-data/hub.log. Stop the service with launchctl bootout gui/$(id -u)/io.github.renerocksai.omajot-hub. After a crash, launchd starts the hub again after about 10 seconds.

Windows (experimental)

Use the Task Scheduler. Make a task with the trigger At startup, the action Start a program with omajot-x86_64-windows.exe and the argument hub, and the option Run whether user is logged on or not. We did not test the hub on Windows yet.

Tips

  • Use full paths in service files. A service does not start in your home folder.
  • tailscale serve --bg is set one time. tailscale serve status shows it.
  • Back up the data folder (omajot-data). It holds all notes and images.

2 · Publish the hub with Tailscale Hub computer Every device

Install Tailscale on the hub computer and on every device that uses omajot: your phone, your laptop, your Omarchy computer. On Omarchy, run omarchy install service tailscale. Log in with the same account on all devices. Then, on the hub computer, run:

$ tailscale serve --bg --https=8443 http://127.0.0.1:8787

Tailscale gives the hub a real HTTPS certificate. Your hub URL is now https://your-mac.your-tailnet.ts.net:8443. The hub prints this URL and a QR code when it starts. Restart the hub after you run tailscale serve, so that it finds the URL. You can also put the URL into ~/.config/omajot/config.json on the hub computer as "hub" (see step 4); the hub then uses it and does not ask Tailscale.

3 · Install the plugin Omarchy only

Do this step on your Omarchy computer:

$ omarchy plugin add https://github.com/renerocksai/omajot --enable

When the plugin starts the first time, it runs tools/install-release.sh. The script downloads the omajot binary for this computer, checks its SHA-256 and installs it into bin/omajot. If the plugin folder has a local build in zig-out/bin/omajot, the plugin uses that build. The plugin also puts the omajot command on your PATH: it links ~/.local/bin/omajot to the binary it uses.

A note icon appears in the bar. Click it to open the dropdown. Middle-click it to open the main window.

4 · Tell omajot where your hub is Plugin and CLI

The plugin needs this step. On other computers, do it only if you want to use omajot qr or the note commands there. On the hub computer, it tells the hub its phone URL. Create ~/.config/omajot/config.json, or add the key if the file exists already (on the hub computer, it has hub_login):

{
  "hub": "https://your-mac.your-tailnet.ts.net:8443"
}

The plugin and the command line both read this file. Restart the shell, or change a plugin setting, to reload it. Without a hub, omajot keeps your notes on this computer only. See the config file for all fields.

5 · Open omajot in the browser and on your phone Every device

On a computer: open the hub URL, https://your-mac.your-tailnet.ts.net:8443, in the browser. To install it as an app, use Install app in Chrome or Edge (in the address bar or in the browser menu).

On your phone: use a QR code. You do not type the URL. There are three ways to show the code:

  1. The hub

    omajot hub prints its phone URL and a QR code in the terminal when it starts. It finds the URL in tailscale serve status. --url sets the URL. Look at the start output in the tmux session of the hub.

  2. omajot qr

    Run omajot qr on any computer where ~/.config/omajot/config.json has your hub.

  3. The web app or the plugin

    Open the hub URL once in a desktop browser. Click the phone button in the web app. It shows the address of the page as a QR code. The phone button in the plugin shows the hub URL.

Then point the phone camera at the QR code and open the link. The phone needs Tailscale. It is free for personal use: https://tailscale.com/download. On an iPhone or iPad, tap Share → Add to Home Screen. On Android, tap Install app in the browser menu. The web app then starts like a normal app, also offline.

$ omajot qr
Open omajot on your phone:
  https://your-mac.your-tailnet.ts.net:8443
                                     
                                     
    █▀▀▀▀▀█  ▀█▀ █▀▄   ▀█ █▀▀▀▀▀█    
    █ ███ █ ██▄▀▀▄ ██▄▀▄▀ █ ███ █    
    █ ▀▀▀ █ █▀▄▀ ▀▀▄█ █▀  █ ▀▀▀ █    
    ▀▀▀▀▀▀▀ █ █ █ ▀▄█ ▀▄▀ ▀▀▀▀▀▀▀    
    █▄██▀▀▀ ▄█▄█ ▀▄▀▄█▄▄█▄█▀█▀▀ ▄    
     █▄▀▄█▀▄▄▀▀█  ▀▀▄ ▀ █ ▀ ▄▄ ▄     
    █ ██▄█▀ ▀▀▀▄▄▀▄ ▄█▄▄█▄▄█▄▀▀ ▄    
      ▀█ ▀▀▀▄ ███ ▀▀▄ ▄▄█ ▀██▀▀▄     
    █▄ ▄▄█▀▄█ ▄█▀▀▄  █▄█▄▄▄█▄▀█ ▄    
    █  █▄▄▀▀▀▄██▄▀▄▀▀▀▄ ▀▀ █  ▀▄     
    ▀ ▀   ▀ ▄  ██▄ ▀█▀▄██▀▀▀█▄███    
    █▀▀▀▀▀█ ▄█▄ ██▀█▄  ██ ▀ █▀▀      
    █ ███ █ ██▀  ▄▀▀█▀  █▀▀▀▀▄███    
    █ ▀▀▀ █ ▀█     ▀▄ ▄▀██▀███▀█     
    ▀▀▀▀▀▀▀ ▀▀ ▀▀▀▀  ▀▀   ▀  ▀▀      
                                     
                                     
Your phone needs Tailscale. It is free for personal use:
  https://tailscale.com/download

The plugin and tools/install-release.sh link ~/.local/bin/omajot, so omajot is on your PATH. They never replace a file or a link that is not from omajot. Set OMAJOT_NO_LINK=1 to skip the link.

The web app shows its URL as a QR code

Without a hub, every QR view shows these steps instead:

Use omajot on your phone:

  1. Run omajot hub on a computer that is always on.
  2. Install Tailscale on that computer and on your phone. Tailscale is free for personal use: https://tailscale.com
  3. On the hub computer, run tailscale serve --bg --https=8443 http://127.0.0.1:8787.
  4. Put the hub URL in ~/.config/omajot/config.json.

Build from source Optional

omajot needs Zig 0.16.0 exactly.

Check the version with zig version. It must show 0.16.0.

Do not use omarchy-install-dev-env zig. It installs the latest Zig, and a newer Zig cannot build omajot.

For the plugin, build in the plugin folder that omarchy plugin add made. The plugin then uses zig-out/bin/omajot:

$ cd ~/.config/omarchy/plugins/io.github.renerocksai.omajot
$ zig build -Doptimize=ReleaseSafe
$ omarchy restart shell

For the hub, build in your clone and start zig-out/bin/omajot hub … instead of bin/omajot hub ….

Coming from Joplin? Optional

This is only for Joplin users. Skip it if you start fresh. The importer needs Python 3. It reads your Joplin database. It does not change it. It copies all notebooks, notes, tags and images into omajot and keeps the dates of your notes.

Run the importer on the computer that has Joplin, in an omajot folder:

With the Omarchy plugin:

$ cd ~/.config/omarchy/plugins/io.github.renerocksai.omajot
$ tools/import_joplin.py --dry-run
$ tools/import_joplin.py --data ~/omajot-import

The importer uses your own build (zig-out) if there is one, else the release binary (bin/omajot).

Update the hub Hub computer

With Homebrew:

$ brew upgrade omajot

Without Homebrew, in your omajot clone on the hub computer:

$ cd ~/omajot && git pull
$ tools/install-release.sh

Then restart the hub: in its tmux session, press Ctrl+c and start it again. As a service, use brew services restart omajot, systemctl --user restart omajot-hub or the launchd commands in start at boot. The web app is in the omajot binary, so the browsers and phones get the new web app from the new hub. tools/install-release.sh downloads a binary only if bin/omajot does not match the release in release.json. If you build from source, run zig build -Doptimize=ReleaseSafe instead.

Update the plugin Omarchy only

On your Omarchy computer. The plugin folder is the one that omarchy plugin add made:

$ omarchy plugin update io.github.renerocksai.omajot
$ ~/.config/omarchy/plugins/io.github.renerocksai.omajot/tools/install-release.sh
$ omarchy restart shell