Skip to content
M3264Public

About

9t is your own workspace for the files, snippets, and links you want to find later. Save them once, then pick them up from your browser or paired Android phone.

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

9t

A quiet, self-hosted workspace for moving the things you need between your devices.

Files · snippets · links · handoffs · phone sync

GPL-3.0 Node 22+ Linux PRs welcome

Website · Documentation · Quick start · Contributing

9t is a small personal cloud you run yourself. Capture text, URLs, and files in one inbox, find them later, and hand them off to another device without routing your data through a third-party workspace.

Why 9t

  • One inbox for everything — paste text, links, screenshots, and files into the same capture flow.
  • Your server, your storage — data stays in the storage location you choose, with opaque file keys and atomic persistence.
  • LAN-first device handoff — the Android client prefers the local network, falls back to the internet route, and reconnects in the background.
  • Fast when you need it — search, filters, pinning, Quick Access, keyboard shortcuts, and a command palette keep the workspace light.
  • Share with control — create expiring, optional-password public handoffs with access counts and revocation.
  • Comfortable anywhere — responsive desktop and mobile web UI, installable PWA, system/light/dark themes, and an Android client.

What is included

Area Included
Capture Universal inbox, clipboard text, URLs, drag-and-drop files, pasted images
Organise Search, filtering, pinning, Quick Access, collections, editable names, Spatial Board
Handoff Stable item pages, QR handoff, expiring public links, password protection, access counts
Phone Encrypted persistent connection, LAN-first routing, background receiving, HTTP catch-up fallback
Operations Setup wizard, module and upload limits, hourly cleanup, daily verified backups
Automation Authenticated CLI for push, list, get, share, trash, and restore

Quick start

The setup wizard is the recommended path. It asks for your preferences, creates the administrator, builds the app, and can install a service that starts 9t at boot.

git clone https://github.com/M3264/9t.git
cd 9t
./setup.sh

Choose the network mode during setup:

  • Local — this computer only.
  • LAN — reachable by your phone and other devices on the same network.
  • Public — bind locally behind an existing HTTPS reverse proxy.

The wizard also configures modules, theme, storage, upload size, retention, and startup. It never overwrites an existing data directory.

After setup:

./9t start
# or, if ~/.local/bin is on PATH:
9t start

Useful wizard commands:

./9t setup --help
./9t setup --dry-run

For repeatable or unattended installs, see docs/installation.md.

Connect a phone

Install the Android client from the v0.6.5 release:

https://github.com/M3264/9t/releases/download/v0.6.5/9t-android-0.6.5.apk

Pair it from the 9t Devices page. The client uses an encrypted persistent connection when supported, prefers the LAN address, switches to the public route when needed, and catches up through the authenticated HTTP API after reconnecting. Enable background receiving in Android settings so the operating system does not stop the receiver when the app is closed.

For Windows and WSL, hotspot, firewall, port-forwarding, and address selection help, see docs/network-troubleshooting.md. The full pairing and background-receiving notes are in docs/android.md.

Manual installation

Requirements: Node.js 22 or newer.

npm install
cp .env.example .env.production
npm run build
npm start

9t listens on 0.0.0.0:3265 by default. Set PORT or NINE_T_HOST to change the listener. Generate a setup token before exposing a new instance:

openssl rand -hex 16

Put the value in NINE_T_SETUP_TOKEN. It is required only while creating the first administrator.

Configuration

NINE_T_DATA_DIR=/absolute/path/to/9t/data
NINE_T_SETUP_TOKEN=replace-with-a-random-secret
NINE_T_HTTPS=false

Set NINE_T_HTTPS=true when an HTTPS reverse proxy is in front of 9t so session cookies receive the Secure flag. Runtime data, uploads, sessions, production secrets, dependencies, and build output are excluded from Git.

CLI

From a checkout, link the CLI and authenticate it to your instance:

npm link
9t login --url https://9t.example.com --username owner
9t push ./photo.jpg
9t push 'docker compose up -d' --name deploy
9t list
9t get ab12cd34
9t share ab12cd34 --lifetime 1d --password optional-password
9t trash ab12cd34
9t restore ab12cd34
9t configure [--section modules|exposure|domain|limits|interface|server]

The token is stored with owner-only permissions in ~/.config/9t/config.json. Run 9t logout to revoke it on the server.

Backups and retention

The included systemd timers clean expired and trashed objects hourly and create a daily archive. Fourteen backups are retained by default. Verify an archive without changing data:

node scripts/restore.mjs backups/9t-….tar.gz --verify

Stop 9t before a real restore, then omit --verify. The restore tool keeps the previous data directory beside the restored copy.

Project map

src/app/              Next.js routes and API endpoints
src/components/       Setup, workspace shell, inbox, dialogs (access/, workspace/, ui/)
src/lib/client/       Browser API and formatting helpers
src/lib/server/       Authentication, configuration, and persistence
src/styles/           Global visual system
public/               PWA, fonts, brand assets (pinned at root by Next.js)
scripts/              Server, CLI (cli/), cleanup, backup, and restore operations
scripts/setup.mjs     Install wizard (also: ./9t setup --service for boot)
android/              Android client
deploy/               Nginx (nginx/), systemd (systemd/), Docker (docker/)
db/migrations/        PostgreSQL migration target
docs/                 Whitepaper, installation, network, Android, site ops
site/                 Public landing + docs for 9t.kennyy.tech (static)
tests/                Node test suites + install smoke test

Service deployment

Deployment examples live under deploy/. Adjust the user, checkout path, and environment-file path before installing them.

sudo install -m 644 deploy/systemd/9t.service /etc/systemd/system/9t.service
sudo systemctl daemon-reload
sudo systemctl enable --now 9t.service

The HTTPS Nginx example is deploy/nginx/9t.conf; its certificate paths assume Certbot with the Nginx plugin.

Documentation and roadmap

Full documentation lives at https://9t.kennyy.tech/docs (source: site/docs). The markdown originals ship in this repo:

9t is currently designed for a single owner. PostgreSQL, multi-user ownership, automated exposure switching, and S3 storage remain on the roadmap.

Contributing

See CONTRIBUTING.md for setup, tests, and pull-request guidance. Security reports: SECURITY.md.

License

9t is free software under the GNU General Public License v3.0. Self-host it, modify it, share it — under the same terms.

About

9t is your own workspace for the files, snippets, and links you want to find later. Save them once, then pick them up from your browser or paired Android phone.

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages