{"id":50243902,"url":"https://github.com/pavi2410/jot","last_synced_at":"2026-05-26T22:16:40.067Z","repository":{"id":345928865,"uuid":"1187491988","full_name":"pavi2410/jot","owner":"pavi2410","description":"A modern Java build tool — like cargo for Rust or uv for Python. Single binary, zero config, fast deterministic builds.","archived":false,"fork":false,"pushed_at":"2026-04-22T10:51:07.000Z","size":361,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-22T12:32:37.668Z","etag":null,"topics":["build-tool","cli","java","jdk","jvm","maven","rust","toolchain"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pavi2410.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-20T19:39:40.000Z","updated_at":"2026-04-22T10:51:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pavi2410/jot","commit_stats":null,"previous_names":["pavi2410/jot"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/pavi2410/jot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavi2410%2Fjot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavi2410%2Fjot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavi2410%2Fjot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavi2410%2Fjot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pavi2410","download_url":"https://codeload.github.com/pavi2410/jot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavi2410%2Fjot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33541331,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"ssl_error","status_checked_at":"2026-05-26T15:22:15.568Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["build-tool","cli","java","jdk","jvm","maven","rust","toolchain"],"created_at":"2026-05-26T22:16:39.042Z","updated_at":"2026-05-26T22:16:40.062Z","avatar_url":"https://github.com/pavi2410.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jot\n\n**A modern Java build tool — like `cargo` for Rust or `uv` for Python.**\n\nSingle binary. Zero config to get started. Fast, deterministic builds with a lockfile.\n\n---\n\n## Why jot?\n\nJava tooling has historically required installing a JDK separately, writing verbose XML or Groovy DSL, and figuring out plugins just to run a formatter or check for CVEs. jot does all of that in one binary with a simple TOML config.\n\n| Capability | jot | Maven | Gradle |\n|---|---|---|---|\n| Single native binary | ✓ | ✗ | ✗ |\n| Built-in JDK manager | ✓ | ✗ | ✗ |\n| Lockfile with artifact hashes | ✓ | Partial | Plugin |\n| Workspace path dependencies | ✓ | Multi-module | Multi-project |\n| `fmt` / `lint` / `audit` built in | ✓ | Plugins | Plugins |\n| Dependency add/remove CLI | ✓ | ✗ | ✗ |\n| `deps` / `outdated` commands | ✓ | ✗ | Plugin |\n\n---\n\n## Quick Start\n\n```bash\n# 1. Create a new project\njot init my-app\ncd my-app\n\n# 2. Install and pin a JDK (done once)\njot toolchain install java@21\njot toolchain pin java@21\n\n# 3. Add a dependency\njot add com.google.guava:guava:33.4.0-jre\n\n# 4. Build and run\njot build\njot run\n```\n\nThat's it. No POM, no settings.gradle, no wrapper scripts.\n\n---\n\n## Install\n\nDownload the binary for your platform from the [latest GitHub Release](https://github.com/pavi2410/jot/releases), move it onto your `PATH`, then verify:\n\n```bash\njot --version\n```\n\nSelf-manage afterward:\n\n```bash\njot self update          # upgrade to latest release\njot self update --check  # just check, don't install\njot self uninstall       # remove the binary\n```\n\n---\n\n## Project config (`jot.toml`)\n\n```toml\n[project]\nname = \"my-app\"\nversion = \"1.0.0\"\nmain-class = \"com.example.App\"\nlayout = \"flat\"   # \"flat\" (default) or \"maven\"\n\n[toolchains]\njava = \"21\"\n\n[dependencies]\nguava = \"com.google.guava:guava:33.4.0-jre\"\n\n[test-dependencies]\njunit = { catalog = \"junit\" }   # resolved from libs.versions.toml\n\n[publish]\nlicense = \"Apache-2.0\"\ndescription = \"My published library\"\nurl = \"https://github.com/example/my-app\"\nscm = \"https://github.com/example/my-app.git\"\ndeveloper = { name = \"Your Name\", email = \"you@example.com\" }\n```\n\n---\n\n## Project Layout\n\njot supports two source layouts, selected via `layout` in `[project]`.\n\n### Flat (default)\n\nMinimal nesting — good for single-module projects.\n\n```\nmy-app/\n├── src/          # main sources (Java + Kotlin)\n├── test/         # test sources\n├── bench/        # JMH benchmark sources\n├── res/          # resources (copied to JAR root)\n└── jot.toml\n```\n\n### Maven\n\nMirrors the Maven/Gradle convention — useful when migrating an existing project or using IDEs that expect it.\n\n```\nmy-app/\n├── src/\n│   ├── main/\n│   │   ├── java/\n│   │   ├── kotlin/       # mixed projects only\n│   │   └── resources/\n│   ├── test/\n│   │   ├── java/\n│   │   └── kotlin/\n│   └── bench/\n│       ├── java/\n│       └── kotlin/\n└── jot.toml\n```\n\nSet it explicitly in `jot.toml`:\n\n```toml\n[project]\nlayout = \"maven\"   # omit or set to \"flat\" for the default\n```\n\n---\n\n## Command Reference\n\n### Project lifecycle\n\n| Command | Description |\n|---|---|\n| `jot init [--template \u003ct\u003e] [\u003cname\u003e]` | Scaffold a new project (`java-minimal`, `java-lib`, `java-cli`, `java-server`, `java-workspace`) |\n| `jot build [--module \u003cname\u003e]` | Compile sources and produce a JAR (+ fat-JAR if `main-class` is set) |\n| `jot run [--module \u003cname\u003e] [-- \u003cargs\u003e]` | Build and run the main class |\n| `jot test [--module \u003cname\u003e]` | Compile and run JUnit 5 tests |\n| `jot bench [--module \u003cname\u003e]` | Compile and run JMH benchmarks from `bench/` (flat) or `src/bench/java/` (maven) |\n| `jot publish [--module \u003cname\u003e] [--repository \u003ctarget\u003e] [--dry-run]` | Build publish artifacts, sign them with GPG, and upload them using Maven repository layout |\n| `jot clean` | Delete `target/` for the current project or workspace members |\n| `jot clean --global` | Wipe the global jot cache |\n\n### Dependencies\n\n| Command | Description |\n|---|---|\n| `jot add \u003cgroup:artifact:version\u003e [--test] [--name \u003calias\u003e]` | Add a Maven coordinate dependency |\n| `jot add --catalog \u003cname\u003e [--test]` | Add a version catalog reference |\n| `jot remove \u003cname\u003e [--test]` | Remove a dependency by alias |\n| `jot deps [--module \u003cname\u003e]` | List direct dependencies with resolved versions |\n| `jot outdated [--module \u003cname\u003e]` | Show which dependencies have newer versions on Maven Central |\n| `jot lock [\u003ccoords...\u003e]` | Resolve and write `jot.lock` |\n| `jot tree [\u003ccoord\u003e] [--workspace] [--module \u003cname\u003e]` | Print the dependency tree |\n| `jot resolve \u003ccoord\u003e [--deps]` | Resolve a single coordinate |\n\n### Code quality\n\n| Command | Description |\n|---|---|\n| `jot fmt [--check] [--module \u003cname\u003e]` | Auto-format Java sources (Google Java Format) |\n| `jot lint [--module \u003cname\u003e]` | Run PMD static analysis |\n| `jot audit [--fix] [--ci]` | Scan locked packages for CVEs via OSV.dev; `--fix` updates declarations; `--ci` exits non-zero on findings |\n| `jot doc [--open] [--module \u003cname\u003e]` | Generate API docs via Dokka (supports Java + Kotlin); `--open` launches `target/docs/index.html` in the browser |\n\n### Toolchain management\n\n| Command | Description |\n|---|---|\n| `jot toolchain install \u003ctool\u003e@\u003cversion\u003e` | Install a toolchain (e.g. `java@21`, `java@corretto-21`, `kotlin@2.1.0`) |\n| `jot toolchain list` | List installed toolchains |\n| `jot toolchain pin \u003ctool\u003e@\u003cversion\u003e [--workspace]` | Pin a toolchain version in `jot.toml` |\n\n---\n\n## Workspaces\n\nPut a `jot.toml` at the repo root listing members, then each sub-directory has its own `jot.toml`:\n\n```toml\n# root jot.toml\n[workspace]\nmembers = [\"domain\", \"api\", \"cli\"]\ngroup = \"com.example\"\n\n[toolchains]\njava = \"21\"\n```\n\nPath dependencies between members resolve automatically:\n\n```toml\n# api/jot.toml\n[dependencies]\ndomain = { path = \"../domain\" }\n```\n\n---\n\n## Version Catalog\n\nShare versions across modules via `libs.versions.toml` at the workspace root:\n\n```toml\n[versions]\njackson = \"2.18.0\"\njunit   = \"5.11.0\"\n\n[libraries]\njackson-databind = { module = \"com.fasterxml.jackson.core:jackson-databind\", version.ref = \"jackson\" }\njunit            = { module = \"org.junit.jupiter:junit-jupiter\", version.ref = \"junit\" }\n```\n\nReference entries in `jot.toml` as `{ catalog = \"jackson-databind\" }`.\n\n---\n\n## Offline Mode\n\nForce fully air-gapped operation (cache only):\n\n```bash\njot --offline build\njot --offline test\n```\n\nIf something's missing from cache, jot tells you exactly what to fetch first.\n\n---\n\n## Publishing\n\n`jot publish` publishes standard Maven-style artifacts:\n\n- main JAR\n- sources JAR\n- javadoc JAR\n- generated POM\n- ASCII-armored GPG signatures\n- SHA-256 sidecars\n\nMinimal flow:\n\n```bash\njot publish --repository file:///tmp/jot-m2 --dry-run\njot publish --repository https://repo.example.com/releases\n```\n\nNotes:\n\n- `[project].group` is required for publishing and can be inherited from `[workspace].group`\n- `[publish]` metadata is required\n- `gpg` must be available on `PATH`\n- use `--signing-key \u003ckey-id\u003e` or `JOT_PUBLISH_GPG_KEY` to pick a key explicitly\n- use `JOT_PUBLISH_USERNAME` and `JOT_PUBLISH_PASSWORD` for authenticated HTTP repositories\n\n---\n\n## Sample Projects\n\n| Sample | Layout | Description |\n|---|---|---|\n| `samples/java-app` | flat | CLI app using picocli; fat JAR |\n| `samples/java-lib` | flat | Library with JMH benchmarks |\n| `samples/java-web` | maven | HTTP server with MapStruct annotation processing |\n| `samples/java-workspace` | maven | Workspace with `domain`, `api`, `cli` modules and path dependencies |\n| `samples/java-kotlin` | maven | Mixed Java + Kotlin project |\n| `samples/kotlin-app` | flat | Kotlin-only app |\n\n---\n\n## Documentation\n\n- [User Guide](docs/USER_GUIDE.md)\n- [Design Proposal](docs/DESIGN_PROPOSAL.md)\n- [Implementation Plan](docs/IMPL_PLAN.md)\n\n---\n\n## License\n\nLicensed under either of:\n\n- [MIT License](LICENSE-MIT)\n- [Apache License, Version 2.0](LICENSE-APACHE)\n\nat your option.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpavi2410%2Fjot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpavi2410%2Fjot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpavi2410%2Fjot/lists"}