JM Tech Power

⌨️ jm CLI Docs

jm is the command-line tool for JM Tech Power — like git / gh. Every command below runs from your terminal. Looking for the REST API? →

Install

# Linux / macOS
curl -fsSL https://jmtechpower.com/jm/install.sh | sudo bash

# Windows (PowerShell)
irm https://jmtechpower.com/jm/install.ps1 | iex

Needs Python 3. After installing, run jm auth login and click Authorize in the browser. Manage tokens →

Setup & account

Install, then log in once. Config is saved in ~/.config/jm/config.json (override with the JM_HOST / JM_TOKEN env vars).

jm auth login
Log in — opens your browser to click Authorize (works with Google/GitHub sign-in).
jm auth login --with-token
Log in by pasting a token from the API Tokens page.
jm auth login --password
Log in with username/email + password.
jm auth logout
Forget the stored token.
jm whoami
Show the logged-in user and storage usage.
jm account [--nickname N] [--bio B]
Show or update your account settings.
jm update [--check]
Update jm to the latest version (or just check).
jm readme | jm help
Print the full embedded documentation.

Projects & releases

Projects are created and releases published on the website — create a project, then use Upload files for its browsable source and Draft a new release for installers and notes. The CLI covers native version control (jm proj <verb> — commit, branch, merge, …) plus reading and cloning published source (jm proj release <verb>). jm proj is the main command (jm project also works; jm apps is a deprecated alias). Point a working copy at a project with jm proj remote set <owner>/<name> and push; the project's Source tab then shows your commits rather than a release ZIP. Projects publish immediately — there's no approval queue.

jm proj clone <owner/name|id> [--dir D] [--version V]
Get a project's code. Clones the repository when the project has one, and falls back to the latest release source when nobody has pushed commits, so you need not know which kind it is first. --version V always means the published source at that version.
jm proj release new <project> --version V [--file F] [--asset PATH[:PLATFORM/ARCH]]...
Publish a release from the terminal. --asset repeats, once per per-platform build; each file's target is read from its name unless you append one like build.zip:linux/arm64. A release of per-platform builds alone is complete — --file is only for projects with a single main installer.
jm proj release clone <owner/name|id> [--dir D]
Explicitly download a published source zip rather than the repository, and write its jm.toml. Useful when a project has both and you want a specific version.
jm proj release checkout <project> <version> [--dir D]
Fetch a specific version's source into a directory.
jm proj release pull [--dir D]
Update a local checkout to the project's latest release source.
jm proj release readme <project> [--version V]
Print a project's README from its source.
jm proj release ls <project> [--version V]
List the files in a project's source.
jm proj release cat <project> <path> [--version V]
Print a source file to stdout.
jm proj list [--mine] [--search Q]
List your projects, or search published ones.
jm proj search <name>
Find projects by name.
jm proj release view <owner/name|id>
Show a project and its release history.
jm proj release releases <project>
List a project's releases.
jm proj release log <project> [-n N]
Show release history: short source hash, version tag, date and notes.
jm proj release diff <project> [<v1>] [<v2>] [--stat|--name-only]
Diff the browsable source between two releases (defaults to the latest two).
jm proj fork <owner/name|id> [--name NEW]
Fork a project into your account, copying its latest source.
jm proj forks <project>
List a project's forks.
jm proj stars <project>
List a project's stargazers.
jm proj pr-create <base> --from <fork>[@version] --title T [--body -]
Open a pull request: propose a fork's source to the base project.
jm proj pulls <base> [--state open|closed|merged]
List a project's pull requests.
jm proj pr <base> <number>
View a pull request and its source diff (base -> proposed).
jm proj pr-merge <base> <number>
Merge a pull request (base owner) — publishes the proposed source as a new release.
jm proj pr-close <base> <number>
Close a pull request.
jm proj init | add <path> | commit -m MSG (-a) | status | log | show [<ref>]
Native version control: a local .jm object store (blobs/trees/commits) with a staging area.
jm proj branch [NAME] | checkout <ref> | merge <branch> | rebase <upstream> [--continue|--abort]
Branches, a line-level 3-way merge (auto-merges disjoint edits), and rebase that pauses on conflict.
jm proj tag [NAME] | reset [--soft|--mixed|--hard] <ref> | revert <ref> | cherry-pick <ref>
Tag commits, move HEAD, undo a commit, or replay one onto HEAD.
jm proj stash [pop|list|drop] | rm <path> | mv <src> <dst> | blame <path> | diff [<a>] [<b>]
Shelve work (untracked included), remove/rename files, line-by-line authorship, and diffs.
jm proj remote [set <owner/name>]
Show or set where push sends commits. A repository is named <owner>/<name>.jmproj; the bare name, the .jmproj form and a full https:// URL all resolve to the same project.
jm proj push | fetch | pull
Sync commits and branches with the project's object store (pull = fetch + merge). Once a remote is set, jm proj push needs no argument, and what you push is what the project's Source tab shows. Transfers show a progress bar; JM_NO_PROGRESS=1 turns it off.
jm proj install <owner/name|id> [-y] [--run FILE] [--download-only]
Download a project's latest release and install it for your OS (.deb/.rpm/.AppImage/.pkg/.dmg/.exe/.msi; archives are extracted, then a dev-declared installer or --run FILE is run). Asks before running; -y skips. When a release attaches one build per platform, jm picks the one for your machine and falls back to the main installer if none fits.
jm proj installed
List the projects jm has installed, with the machine each one is on. The website's Installed apps page groups the same information by machine.
jm proj update [-y] [--check]
Upgrade every installed project to its latest version (--check just lists).
jm proj uninstall <owner/name|id> [--keep-files]
Uninstall from disk and untrack it. --keep-files only untracks.
jm proj visibility <project> <public|private>
Make a project public or private.
jm proj delete <id>
Delete a project with its releases, source and files.

Social

Stars, watching and issues — the collaborative surface. Agents can poll their inbox as an event bus.

jm proj star <project>
Star a project.
jm proj unstar <project>
Remove your star.
jm proj watch <project> [--level releases|all]
Watch a project for new releases (or --level all for all activity).
jm proj unwatch <project>
Stop watching a project.
jm proj issues <project> [--state open|closed|all]
List a project's issues.
jm proj issue <project> <number>
View an issue and its comments.
jm proj issue-create <project> --title T [--body -]
Open an issue (body from --body or piped stdin).
jm proj issue-comment <project> <number> [--body -]
Comment on an issue.
jm proj issue-close <project> <number>
Close an issue.
jm proj issue-reopen <project> <number>
Reopen an issue.
jm notifications [--unread] [--json]
Your inbox — new releases of watched projects, plus issues and replies. Alias: jm inbox. Use --json for agents.

Articles

jm articles list [--mine] [--search Q] [--category C]
List articles.
jm article view <id> [--raw]
Show an article (stripped text, or --raw HTML).
jm article create --title T --category C (--content "..." | --file body.html | stdin) [--summary ...] [--tags a,b] [--draft]
Create an article; --draft keeps it unpublished.
jm article edit <id> [--title ...] [--content ... | --file ...] [--tags ...] [--publish | --unpublish]
Update an article or toggle its publish state.
jm article delete <id>
Delete an article.

JMDrive (files)

jm drive ls [folder_id]
List files/folders (root by default).
jm drive upload PATH... [--folder ID] [--public]
Upload file(s); --public prints a share link.
jm drive mkdir NAME [--parent ID] [--public]
Create a folder.
jm drive download <id> [-o out]
Download a file (a folder downloads as a zip).
jm drive share <id> [--password P] [--limit N]
Make a file/folder public and print its link.
jm drive rm <id>
Delete a file or folder.

Chat

jm chat groups
List your chat groups.
jm chat read (--with USER_ID | --group ID) [--limit N]
Read a conversation.
jm chat send "message" (--to USERNAME | --group ID)
Send a direct or group message.

Tokens

jm token list
List your active API tokens.
jm token create [--name N]
Create a token (printed once).
jm token revoke <id>
Revoke a token.

Admin (official account)

jm admin stats
Site stats (users, projects, articles).
jm admin apps
List all projects with their status.
jm admin delete <id>
Delete a project.
jm admin users
List all users.

Search

jm search <query> [--web] [--limit N]
JM Search — apps, articles and people (or the crawled web index with --web).

Direct Install (devices)

Link a machine and the website can install projects onto it: open a project, press Direct install, pick the machine. The machine connects outbound, so this works from behind NAT with no ports opened. Run jm auth login on that machine first, as the user the service will run as. A linked machine gets its own token, scoped to its install jobs — it cannot read your Drive or publish projects — and unlinking revokes it. Manage your machines at /devices.

sudo jm service install | uninstall
Install the agent as a system service so the machine is reachable after a reboot without anyone signing in — a unit in /etc/systemd/system, a macOS LaunchDaemon, or an at-startup Scheduled Task. It runs as you, not as root: a root daemon taking orders from a web button is a much bigger thing to agree to, and user-local installs work either way. This is the one you want; a foreground agent is offline exactly when you reach for the button.
jm service status
Whether the service is installed and running. No sudo needed.
jm link [--name N]
Run the agent in the foreground to try it out. Stops when you close the window (Ctrl-C).
jm devices
List your linked machines, with whether each is online.
jm unlink <id>
Remove a linked machine and revoke its token.

Examples

jm proj init                                 # start version control (a local .jm repo)
jm proj add . && jm proj commit -m "first cut"  # stage + commit
jm proj branch feature && jm proj merge feature # branch + line-level 3-way merge

jm proj remote set someone/quickfire         # name the remote: someone/quickfire.jmproj
jm proj push                                 # push commits; the Source tab then shows them
jm proj clone someone/quickfire              # get a project's code (repo, or its release source)

# projects are created and releases published on the website ("Upload files" / "Draft a new release")
jm proj release clone someone/quickfire --version 1.2.0   # a specific published source zip
jm proj release log someone/quickfire        # release history: hash, version, date, notes

jm proj install someone/quickfire            # install a project by owner/name
jm service install                           # let the website install onto this machine

echo "<p>Hello world</p>" | jm article create --title "Hi" --category News --draft

jm drive upload report.pdf --public          # prints a https://.../d/<token> link

All of this is also available as a raw REST API — see the API Docs →