[
  {
    "description": "The cheat sheet of Jujutsu.",
    "languages": [
      "JavaScript",
      "CSS"
    ],
    "last_updated": "2026-09-13T22:53:02Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/jj-cheat-sheet.svg"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/jj-cheat-sheet/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/jj-cheat-sheet"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/jj-cheat-sheet"
      }
    ],
    "name": "jj-cheat-sheet",
    "owner": "tamada",
    "releases": [],
    "topics": [
      "cheatsheet",
      "jujutsu"
    ]
  },
  {
    "description": "My home-brew recipes.",
    "languages": [
      "Ruby",
      "Rust"
    ],
    "last_updated": "2026-10-12T00:18:23Z",
    "license": [
      {
        "name": "Creative Commons Zero v1.0 Universal",
        "spdx": "cc0-1.0",
        "url": "http://choosealicense.com/licenses/cc0-1.0/"
      }
    ],
    "links": [
      {
        "label": "repository",
        "url": "https://github.com/tamada/homebrew-tap"
      },
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/homebrew-tap.png"
      }
    ],
    "name": "homebrew-tap",
    "owner": "tamada",
    "releases": [],
    "topics": []
  },
  {
    "description": "Mou Seiseki Teisei ha Yadayo.",
    "languages": [
      "Dockerfile",
      "Just",
      "Rust"
    ],
    "last_updated": "2026-09-26T10:14:50Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/mosty.svg"
      },
      {
        "label": "container",
        "url": "https://quay.io/repository/tama5/mosty"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/mosty/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/mosty"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/mosty/"
      }
    ],
    "name": "mosty",
    "owner": "tamada",
    "releases": [
      {
        "description": "## mosty v0.1.0\n\n最初のリリースです。成績処理用の Excel ファイルで、シートをまたいだ参照が別の学生の行を指しているミス（1 行ずれなど）を検出します。\n\n### 使い方\n\n```sh\nmosty init grades.xlsx      # シートの構造を推定して mosty.grades.xlsx.json5 に書き出す\nmosty check grades.xlsx     # 設定ファイルに従って参照を検証する\n```\n\n`mosty init` が書き出した設定ファイル（学生証番号の列、氏名の列、学生の行の範囲）は、`mosty check` の前に確認し、推定が誤っていれば修正してください。\n設定ファイルがないまま `mosty check` を実行した場合は、`mosty init` を自動で実行してから検証します（`--no-init` で無効化できます）。\n\n### 主な機能\n\n- 参照元の行と参照先の行の学生証番号の不一致を検出します。\n- 1 つの学生の行から、複数の学生の行を含む範囲（`SUM(課題!E4:E8)` など）を参照していることを検出します。`VLOOKUP` などの検索関数の検索範囲は対象外です。\n- 同じシート内の学生証番号の重複、設定ファイルと Excel ファイルの食い違い（シートの追加・削除、学生表の外の学生証番号）を検出します。\n- 学生証番号は数値・文字列のどちらでも扱います。書式は正規表現で指定できます（既定は 7 桁の数字）。\n- 学生証番号が数式（`=名簿!A5` など）でも扱います。\n- 検証結果は `default`・`json`・`markdown` の形式で出力できます（`-F`）。\n- 対応形式は `.xlsx` と `.xlsm` です。\n\n### 互換性のない変更\n\n最初のリリースのため、ありません。\n\n## What's Changed\n* Reorganize the about page and update the Hugo theme by @tamada in https://github.com/tamada/mosty/pull/1\n* Add the mosty logo to the document site by @tamada in https://github.com/tamada/mosty/pull/2\n* Release v0.1.0 by @tamada in https://github.com/tamada/mosty/pull/3\n\n## New Contributors\n* @tamada made their first contribution in https://github.com/tamada/mosty/pull/1\n\n**Full Changelog**: https://github.com/tamada/mosty/commits/v0.1.0\n",
        "name": "Release v0.1.0",
        "release_date": "2026-09-25T11:06:26Z"
      }
    ],
    "topics": [
      "excel",
      "reference-verification"
    ]
  },
  {
    "description": "Pseudo-REST static API generator",
    "languages": [
      "Dockerfile",
      "Just",
      "Elvish",
      "Shell",
      "PowerShell"
    ],
    "last_updated": "2026-10-10T00:15:55Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/fauxrest.svg"
      },
      {
        "label": "docs",
        "url": "https://docs.rs/fauxrest/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/fauxrest"
      },
      {
        "label": "container",
        "url": "https://quay.io/repository/tama5/fauxrest"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/fauxrest/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/fauxrest"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/fauxrest"
      }
    ],
    "name": "fauxrest",
    "owner": "tamada",
    "releases": [
      {
        "description": "## What's Changed\n* test: cover numeric derive type preservation by @atharvafulay in https://github.com/tamada/fauxrest/pull/14\n* fix: reject $filter comparisons whose operand kinds cannot be evaluated by @tamada in https://github.com/tamada/fauxrest/pull/24\n* feat: derive template values from filtered data, and add $derive.exclude by @tamada in https://github.com/tamada/fauxrest/pull/25\n* fix: publish output only after the whole build succeeds by @tamada in https://github.com/tamada/fauxrest/pull/26\n* docs: correct the serializer configuration example by @tamada in https://github.com/tamada/fauxrest/pull/30\n* chore: drop the directives $emit replaced by @tamada in https://github.com/tamada/fauxrest/pull/31\n* fix: reject a $-prefixed key that is not a directive by @tamada in https://github.com/tamada/fauxrest/pull/35\n* feat: land $skip and the unknown-directive check on main by @tamada in https://github.com/tamada/fauxrest/pull/36\n* feat: write the whole API as one file with bundle by @tamada in https://github.com/tamada/fauxrest/pull/37\n* fix: send --help and --version to stdout with status 0 by @tamada in https://github.com/tamada/fauxrest/pull/39\n* Release v0.0.5 by @tamada in https://github.com/tamada/fauxrest/pull/40\n\n## New Contributors\n* @atharvafulay made their first contribution in https://github.com/tamada/fauxrest/pull/14\n\n**Full Changelog**: https://github.com/tamada/fauxrest/compare/v0.0.4...v0.0.5",
        "name": "Release v0.0.5",
        "release_date": "2026-08-05T06:24:37Z"
      }
    ],
    "topics": [
      "rest-api",
      "static-api",
      "static-api-generator"
    ]
  },
  {
    "description": "Simple options picker in CLI.",
    "languages": [
      "Rust"
    ],
    "last_updated": "2026-02-09T03:20:15Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "docs",
        "url": "https://docs.rs/pick-a-boo/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/pick-a-boo"
      },
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/pick-a-boo.png"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/pick-a-boo/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/pick-a-boo"
      }
    ],
    "name": "pick-a-boo",
    "owner": "tamada",
    "releases": [
      {
        "description": "- Add short labels to items (#9 , #10 ).\r\n- As a result, the macro became bloated, so it was separated into a different crate ([pick-a-boo-macros](https://crates.io/crates/pick-a-boo-macros)).\r\n  - This macro's crate is publicly available.\r\n- Subsequently, the version number increased due to changes like GitHub Actions scripts for automated releases, but the core functionality remains unchanged.\r\n\r\nThe binaries of `pick-a-boo` are not available on GitHub. \r\nPlease use `pick-a-boo` with `cargo`.",
        "name": "v0.1.6",
        "release_date": "2026-02-09T03:30:17Z"
      }
    ],
    "topics": [
      "library",
      "select-options",
      "terminal",
      "yes-or-no"
    ]
  },
  {
    "description": "Detects software theft by comparing birthmarks extracted from binaries",
    "languages": [
      "Rust",
      "Shell",
      "Java",
      "Python",
      "Just"
    ],
    "last_updated": "2026-10-08T09:11:00Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/oinkie.png"
      },
      {
        "label": "container",
        "url": "https://quay.io/repository/tama5/oinkie"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/oinkie/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/oinkie"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/oinkie/"
      }
    ],
    "name": "oinkie",
    "owner": "tamada",
    "releases": [
      {
        "description": "## Highlights\n\n- **Binaries for Windows, x86_64 and arm64** (#202). v0.8.0 shipped binaries for Linux and macOS only, though oinkie is built and tested on Windows. Each release now carries `oinkie-X.Y.Z_amd64_windows.zip` and `oinkie-X.Y.Z_arm64_windows.zip`, each built on a Windows runner of its own CPU and, like the native Linux and macOS builds, checked to serve MCP before it is uploaded. A zip rather than a tar.gz, so that Windows' Explorer opens it.\n- **The release binaries are built before a release, not first at it.** Their build moved into a workflow of its own, which a pull request changing it, the scripts it runs or `Cargo.toml` and `Cargo.lock` runs too, building every platform without uploading anything. A missing or broken platform now shows on the pull request rather than after the tag and the draft exist.\n\nNothing else changes from v0.8.0: no code, no options, no scores.\n\n## What's Changed\n* Ship Windows binaries for x86_64 and arm64, and build release binaries on pull requests by @tamada in https://github.com/tamada/oinkie/pull/203\n* Release v0.8.1 by @tamada in https://github.com/tamada/oinkie/pull/204\n\n\n**Full Changelog**: https://github.com/tamada/oinkie/compare/v0.8.0...v0.8.1\n",
        "name": "Release v0.8.1",
        "release_date": "2026-10-08T09:44:31Z"
      }
    ],
    "topics": [
      "birthmark-toolkit",
      "birthmarks",
      "plagiarism-detection",
      "software-theft-detection",
      "ghidra-pcode"
    ]
  },
  {
    "description": "Minimal and alternative ls implementation in Rust.",
    "languages": [
      "Rust",
      "Dockerfile",
      "Just"
    ],
    "last_updated": "2026-07-25T08:06:22Z",
    "license": [
      {
        "name": "Creative Commons Zero v1.0 Universal",
        "spdx": "cc0-1.0",
        "url": "http://choosealicense.com/licenses/cc0-1.0/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/lis.png"
      },
      {
        "label": "container",
        "url": "https://quay.io/repository/tama5/lis"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/lis/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/lis"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/lis"
      }
    ],
    "name": "lis",
    "owner": "tamada",
    "releases": [
      {
        "description": "## What's Changed\n* Improve tests and docs by @tamada in https://github.com/tamada/lis/pull/14\n* Gemini by @tamada in https://github.com/tamada/lis/pull/13\n* feat: add Containerfile and Justfile for Docker containerization by @tamada in https://github.com/tamada/lis/pull/16\n* feat: add documentation and configuration files for lis project by @tamada in https://github.com/tamada/lis/pull/15\n* Releases/v0.0.11 by @tamada in https://github.com/tamada/lis/pull/17\n\n\n**Full Changelog**: https://github.com/tamada/lis/compare/v0.0.10...v0.0.11",
        "name": "Release v0.0.11",
        "release_date": "2026-06-19T03:22:04Z"
      }
    ],
    "topics": [
      "filesystem",
      "list-files"
    ]
  },
  {
    "description": "A phonetic code encoder/decoder written in Rust",
    "languages": [
      "Shell",
      "Rust",
      "Dockerfile"
    ],
    "last_updated": "2026-02-20T04:36:31Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/spellout.svg"
      },
      {
        "label": "docs",
        "url": "https://docs.rs/spellout/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/spellout"
      },
      {
        "label": "container",
        "url": "https://ghcr.io/tamada/spellout"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/spellout/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/spellout"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/spellout/"
      }
    ],
    "name": "spellout",
    "owner": "tamada",
    "releases": [
      {
        "description": "## Commits\n- 67c9b83: Add permissions for id-token in publish_to_crates_io job (Haruaki Tamada) [#3](https://github.com/tamada/spellout/pull/3)",
        "name": "Release v0.1.1",
        "release_date": "2026-02-20T04:36:32Z"
      }
    ],
    "topics": [
      "encoder-decoder",
      "phonetic-code"
    ]
  },
  {
    "description": "Git Ignore Managenement System for Multiple Repositories.",
    "languages": [
      "Rust",
      "Dockerfile",
      "Just",
      "HTML"
    ],
    "last_updated": "2026-10-10T00:17:52Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/gixor.svg"
      },
      {
        "label": "docs",
        "url": "https://docs.rs/gixor/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/gixor"
      },
      {
        "label": "container",
        "url": "https://quay.io/repository/tama5/gixor"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/gixor/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/gixor"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/gixor/"
      }
    ],
    "name": "gixor",
    "owner": "tamada",
    "releases": [
      {
        "description": "## What's Changed\n* Release v0.5.2 by @tamada in https://github.com/tamada/gixor/pull/52\n\n\n**Full Changelog**: https://github.com/tamada/gixor/compare/v0.5.1...v0.5.2",
        "name": "Release v0.5.2",
        "release_date": "2026-08-08T11:44:53Z"
      }
    ],
    "topics": [
      "gitignore",
      "gitignore-generator",
      "cli",
      "command-line-tool",
      "git"
    ]
  },
  {
    "description": "A tool for extracting/archiving files and directories in several formats.",
    "languages": [
      "Rust",
      "Dockerfile",
      "Just",
      "Elvish",
      "Shell"
    ],
    "last_updated": "2026-10-12T00:13:25Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/totebag.jpg"
      },
      {
        "label": "docs",
        "url": "https://docs.rs/totebag/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/totebag"
      },
      {
        "label": "container",
        "url": "https://ghcr.io/tamada/totebag"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/totebag/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/totebag"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/totebag"
      }
    ],
    "name": "totebag",
    "owner": "tamada",
    "releases": [
      {
        "description": "## Highlights\n\n### totebag is now pure Rust, RAR included\n\nRAR extraction now uses [`rars`](https://crates.io/crates/rars), a pure Rust RAR implementation, instead of the C UnRAR library (#95). RAR archives (RAR 1.3 through RAR 7) can now be listed and extracted by every build, with no extra Cargo feature and no C toolchain. Together with the zstd change below, `totebag` no longer needs to compile or bundle any C library. Entry names that would escape the destination directory (`..`, absolute paths, drive prefixes) are rejected, and Windows-style `\\` separators in older archives are handled.\n\n`totebag` can now also **create** RAR archives: `totebag -o out.rar <files>` writes RAR5 (the format WinRAR 5 and later read). `--level` maps onto RAR's compression methods:\n\n| `--level` | RAR |\n|---|---|\n| 0 | store (no compression) |\n| 1-9 | RAR's 1-5 (fastest to best); the default 5 gives RAR's own default, 3 |\n\nUnix permissions and modification times are recorded, and empty directories are kept.\n\n### `-B, --base-dir`: store entries relative to a directory\n\n`totebag -B build/dist -o app.zip build/dist` stores `build/dist/app.js` as `app.js` (#108). The base directory is stripped before `-C/--rebase-dir` is prefixed, so `-B build/dist -C myapp` stores it as `myapp/app.js`. Paths are compared as absolute paths, so either side may be relative or absolute. If a target is outside the base directory, every such path is reported (`Error::OutsideBaseDir`) and nothing is written: no archive is created, and an existing one given with `--overwrite` keeps its contents. In the library, this is `ArchiveConfig::base_dir`.\n\n### `.tar.zst`: compression levels work again, in pure Rust\n\n`.tar.zst` archives are now compressed with [`structured-zstd`](https://crates.io/crates/structured-zstd), a pure Rust zstd implementation that supports every zstd level. `--level` now affects `.tar.zst` output again (#96):\n\n| `--level` | zstd |\n|---|---|\n| 0 | stored (no compression) |\n| 1-9 | zstd levels 3-22, mapped linearly (the default 5 is level 13) |\n\nIn v0.9.0, the default pure Rust backend (`ruzstd`) only implemented zstd's fastest level, so `--level` 1-9 all produced the same output, and the released binaries were affected too. This release fixes that without bringing back a C dependency. Extraction also uses `structured-zstd`. Archives written by `zstd(1)` extract as before, and archives written by totebag pass `zstd -t`.\n\n## Security\n\n- **Path traversal on extraction (#103).** In v0.9.0 and earlier, extracting a crafted archive could write files outside the destination directory: entry names containing `..`, absolute paths (`/tmp/...`) and Windows drive prefixes were joined onto the destination unchecked, for every format. Such entries are now refused with the new `Error::UnsafePath` and are not written; the other entries of the archive are still extracted, and `totebag` exits with an error. Every format is covered: zip, tar (and its compressed variants), 7z, cpio, ar, cab and lha here, and RAR through `rars` (#95). **Upgrade if you extract archives you did not create.**\n\n## Breaking changes\n\n- **The `zstd-native` feature has been removed** from both `totebag` and `totebag-cli` (#96). It switched to the C zstd library, which is no longer needed. Remove `--features zstd-native` from your build commands (and `\"zstd-native\"` from the `features` of your `Cargo.toml` dependency), or Cargo will report an unknown feature.\n- **The `rar` feature has been removed** from both `totebag` and `totebag-cli` (#95). RAR extraction is always available now, so drop `--features rar` (or `\"rar\"` from `features`) in the same way.\n- **`Error::FeatureDisabled` has been removed** from the library's `Error` enum (#95). It was only returned for RAR when the `rar` feature was off. Code that matches on it must drop that arm.\n- **`Error::UnsafePath(PathBuf)` has been added** to the `Error` enum (#103). `Error` is not `#[non_exhaustive]`, so an exhaustive `match` on it needs a new arm.\n- **`ArchiveConfig::path_in_archive` returns `Result<PathBuf>`** instead of `PathBuf` (#108), so that a path outside `base_dir` can be reported. **`Error::OutsideBaseDir(PathBuf)`** is added to the `Error` enum for it.\n- **`ToteArchiver::perform` takes `&mut BufWriter<File>` instead of `File`** (#106). This only affects code that implements `ToteArchiver` itself. `totebag::archive` now owns the buffered writer and flushes it after `perform` returns, so an implementation must finish any encoder it wraps the writer in, rather than rely on dropping it. Its `targets` are now `&[Target]` (#108): `totebag::archive` walks the targets and names every entry before it creates the destination, and passes each path together with its name in the archive (`Target::path`, `Target::dest_path`), so an archiver only writes them.\n\n## Bug fixes\n\n- `cargo install totebag-cli` installed the command as `totebag-cli`, while the release binaries, Homebrew and the Docker image call it `totebag`. It is now `totebag` everywhere (#124). If you installed an earlier version with Cargo, run `cargo uninstall totebag-cli` before installing this one, or remove the leftover `~/.cargo/bin/totebag-cli`.\n- Archiving: a target that does not exist was skipped silently, so `totebag -o a.zip missing_dir` wrote an empty archive and exited successfully, and a misspelled target among others was simply missing from the archive. Every missing target is now reported as `<path>: File not found`, and nothing is written; an existing archive given with `--overwrite` keeps its contents (#52).\n- Archiving: per-file errors were collected and then dropped by the zip, cab and cpio archivers whenever the archive itself was finished successfully, so a file that could not be read was silently missing from a `.zip`, `.cab` or `.cpio` that was reported as a success. They are now returned, like the other formats already did (#108).\n- Archiving: write errors at the end of an archive were ignored. The gzip, bzip2 and xz encoders wrote their final block and trailer when they were dropped, which discards errors, so a full disk could leave a truncated `.tar.gz` / `.tar.bz2` / `.tar.xz` reported as a success. The encoders are now finished explicitly, and the buffered output is flushed explicitly, so these errors are returned (#106).\n- ar: errors while extracting were collected and then dropped, so extraction reported success. They are now returned (#103).\n- cab: entry names use `\\` as the separator, so `dir\\file.txt` was extracted as one file with a backslash in its name on Unix. It is now extracted as `dir/file.txt` (#103).\n- 7z: an error in one block no longer abandons the blocks after it, and an entry with an unsafe name is skipped without stopping the rest of its block (#103).\n- tar: entries whose path is longer than 100 bytes (stored with GNU long names / PAX) were listed and extracted under a name truncated to 100 bytes. Extraction then failed or wrote the file to the wrong path. Both listing and extraction now read the full name.\n- Non-UTF-8 paths no longer cause a panic when an error message is displayed or when the format is detected from the file extension (#98, #102, thanks @nightcityblade).\n- Shell completion generation no longer panics on a destination without a parent directory (#99, #101, thanks @nightcityblade).\n- `totebag --help` no longer shows `[default: 5]` twice for `--level` (#97, #100, thanks @Jah-yee).\n\n## Packaging\n\n- The Docker image (`quay.io/tama5/totebag`) is built on Debian 13 (trixie) instead of Debian 11, whose support has ended, and carries the standard OCI labels (source, version, revision, licenses, ...) (#120).\n- The shell completions shipped in the release archives are regenerated and include `--rebase-dir` and `-B/--base-dir`. The fish, elvish and PowerShell files are now named `totebag.fish`, `totebag.elv` and `totebag.ps1`; fish only loads `totebag.fish`, so fish completion now works, including through Homebrew (#122).\n\n## Performance\n\n- Archive I/O is buffered (#106). Archiving writes through a `BufWriter`, and extraction and listing read the archive through a `BufReader` for tar (and every compressed tar), zip, 7z, cpio, ar, cab and lha. Formats that read or write many small headers no longer issue a system call for each one. RAR does its own I/O and is unchanged.\n\n  Measured with 5,000 files of 2 KiB on macOS (release builds, best of three runs):\n\n  | Format | Archive (v0.9 → v0.10) | Extract (v0.9 → v0.10) |\n  |---|---|---|\n  | tar | 0.17 s → 0.15 s | 0.49 s → 0.50 s |\n  | cpio | 0.33 s → 0.16 s | 0.44 s → 0.13 s |\n  | ar | 0.53 s → 0.15 s | 0.39 s → 0.38 s |\n\n  Extracting tar and ar barely changes, because creating the 5,000 files dominates the time.\n\n## Dependencies\n\n- `kpea` (cpio) 0.2.5 → 0.4.0 (#87, #104).\n- `ruzstd`, the optional `zstd` (C), and `tempfile` were removed; `structured-zstd` 0.0.59 was added (#96).\n- `unrar` (C UnRAR) was replaced by `rars` 0.10 (#95). Every dependency is now pure Rust.\n- The lower bound of `time` is raised from 0.3.44 to 0.3.47, the version `zip` 8.6 already requires. Every requirement is now the lowest version that builds and passes the tests, and CI keeps it that way (#116).\n\n## Internal\n\n- `Error::error_or` is now implemented in terms of `Error::error_or_else` (#104).\n- Extractors create parent directories through one shared helper, which `totebag::archive` uses for the destination directory too (#103).\n- `testdata/unsafe/` holds committed archives with unsafe entry names, together with the script that generates them (#103).\n- The archivers share one walk of the targets (`walk_targets`) instead of seven copies of the same loop (#117), and the code smells SonarQube Cloud reported are cleared (#114).\n\n## CI\n\n- A `minimal-versions` job resolves every direct dependency to the lowest version its requirement allows, and builds and tests at those versions (#116).\n- Dependabot opens a weekly pull request for Cargo dependencies, only for releases that the current requirements do not already allow (`versioning-strategy: increase-if-necessary`) (#116).\n- The cross-compile action no longer takes a `features` input; release binaries are built with the default features, which now include RAR (#95).\n- The release-published notification now fires; the release is published with the GitHub App token instead of `GITHUB_TOKEN` (#94).\n- SonarQube Cloud analyses every push to `main` and every pull request, with coverage and Clippy results imported (#110, #111). Coveralls stays in use.\n- The release description starts with `.github/release-notes/vX.Y.Z.md` when that file exists, followed by the generated list of pull requests (#123).\n\n\n## What's Changed\n* fix: handle completion paths without parents by @nightcityblade in https://github.com/tamada/totebag/pull/101\n* fix(lib): handle non-UTF-8 paths without panicking by @nightcityblade in https://github.com/tamada/totebag/pull/102\n* fix(cli): remove duplicate [default: 5] in --level help text by @Jah-yee in https://github.com/tamada/totebag/pull/100\n* ci: make the release-published notification actually fire by @tamada in https://github.com/tamada/totebag/pull/94\n* build: upgrade kpea (cpio) from 0.2.5 to 0.4.0 by @tamada in https://github.com/tamada/totebag/pull/104\n* build: replace ruzstd and zstd-native with structured-zstd by @tamada in https://github.com/tamada/totebag/pull/105\n* build: replace unrar with the pure Rust rars, and create RAR archives by @tamada in https://github.com/tamada/totebag/pull/107\n* fix: refuse archive entries that would be extracted outside the destination by @tamada in https://github.com/tamada/totebag/pull/109\n* ci: add SonarQube Cloud analysis by @tamada in https://github.com/tamada/totebag/pull/111\n* perf: buffer archive I/O and report errors at the end of an archive by @tamada in https://github.com/tamada/totebag/pull/112\n* feat: add --base-dir to store entries relative to a directory by @tamada in https://github.com/tamada/totebag/pull/113\n* refactor: clear the code smells SonarQube Cloud reported by @tamada in https://github.com/tamada/totebag/pull/115\n* refactor: walk the archive targets once, before creating the archive by @tamada in https://github.com/tamada/totebag/pull/117\n* fix: report missing targets in archive mode instead of ignoring them by @tamada in https://github.com/tamada/totebag/pull/118\n* build: make dependency lower bounds accurate, check them in CI, and add Dependabot by @tamada in https://github.com/tamada/totebag/pull/119\n* build: fix the container image build, move it to Debian 13, and fill its labels by @tamada in https://github.com/tamada/totebag/pull/126\n* docs: add the SonarQube badge to the README template by @tamada in https://github.com/tamada/totebag/pull/127\n* fix: regenerate the shell completions, with the names shells load by @tamada in https://github.com/tamada/totebag/pull/128\n* ci: start the release description with the hand-written notes by @tamada in https://github.com/tamada/totebag/pull/129\n* docs: sync usage help and add cargo install; name the command totebag by @tamada in https://github.com/tamada/totebag/pull/130\n* Release v0.10.0 by @tamada in https://github.com/tamada/totebag/pull/131\n* ci: pin cargo-zigbuild 0.23.3 and cross-compile release branches before merging by @tamada in https://github.com/tamada/totebag/pull/132\n* Release v0.10.0 by @tamada in https://github.com/tamada/totebag/pull/133\n\n## New Contributors\n* @nightcityblade made their first contribution in https://github.com/tamada/totebag/pull/101\n* @Jah-yee made their first contribution in https://github.com/tamada/totebag/pull/100\n\n**Full Changelog**: https://github.com/tamada/totebag/compare/v0.9.0...v0.10.0",
        "name": "Release v0.10.0",
        "release_date": "2026-10-12T00:17:14Z"
      }
    ],
    "topics": [
      "archiver",
      "command-line-utilities",
      "compressor",
      "decompressor",
      "unarchiver"
    ]
  },
  {
    "description": "Detecting the build tools in use.",
    "languages": [
      "Rust",
      "Dockerfile",
      "HTML",
      "CSS",
      "Pkl"
    ],
    "last_updated": "2026-07-20T06:40:13Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/btmeister.svg"
      },
      {
        "label": "docs",
        "url": "https://docs.rs/btmeister/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/btmeister"
      },
      {
        "label": "container",
        "url": "https://ghcr.io/tamada/btmeister"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/btmeister/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/btmeister"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/btmeister"
      }
    ],
    "name": "btmeister",
    "owner": "tamada",
    "releases": [
      {
        "description": "",
        "name": "Release v0.7.4",
        "release_date": "2025-01-31T11:47:39Z"
      }
    ],
    "topics": [
      "build-tool",
      "project-analysis"
    ]
  },
  {
    "description": "Heatmap generator.",
    "languages": [
      "Shell",
      "Dockerfile",
      "Rust"
    ],
    "last_updated": "2026-07-25T08:08:04Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/heatman.svg"
      },
      {
        "label": "docs",
        "url": "https://docs.rs/heatman/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/heatman"
      },
      {
        "label": "container",
        "url": "https://ghcr.io/tamada/heatman"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/heatman/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/heatman"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/heatman"
      }
    ],
    "name": "heatman",
    "owner": "tamada",
    "releases": [
      {
        "description": "",
        "name": "Release v0.1.1",
        "release_date": "2026-06-19T07:09:27Z"
      }
    ],
    "topics": [
      "command-line-utilities",
      "csv",
      "data-visualization",
      "heatmap"
    ]
  },
  {
    "description": "Small Object Programming Checker.",
    "languages": [
      "Java",
      "HTML",
      "Shell",
      "Makefile",
      "Dockerfile"
    ],
    "last_updated": "2026-07-20T06:41:06Z",
    "license": [
      {
        "name": "Apache License 2.0",
        "spdx": "apache-2.0",
        "url": "http://choosealicense.com/licenses/apache-2.0/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/9rules.svg"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/9rules/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/9rules"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/9rules/"
      }
    ],
    "name": "9rules",
    "owner": "tamada",
    "releases": [
      {
        "description": "",
        "name": "v1.1.1",
        "release_date": "2020-09-23T07:22:55Z"
      }
    ],
    "topics": [
      "java8",
      "code-analysis",
      "code-review",
      "code-quality"
    ]
  },
  {
    "description": "peripheral utility commands for the shell.",
    "languages": [
      "Dockerfile",
      "Makefile",
      "Go",
      "HTML",
      "CSS"
    ],
    "last_updated": "2023-08-05T08:56:35Z",
    "license": [
      {
        "name": "MIT License",
        "spdx": "mit",
        "url": "http://choosealicense.com/licenses/mit/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/peripherals.svg"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/peripherals/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/peripherals"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/peripherals"
      }
    ],
    "name": "peripherals",
    "owner": "tamada",
    "releases": [
      {
        "description": "",
        "name": "Release v1.0.1",
        "release_date": "2023-08-05T08:56:35Z"
      }
    ],
    "topics": []
  },
  {
    "description": "Java birthmark toolkit, detecting the software theft by native characteristics of the programs.",
    "languages": [
      "Java",
      "HTML",
      "JavaScript",
      "CSS",
      "Dockerfile"
    ],
    "last_updated": "2026-05-08T17:53:32Z",
    "license": [
      {
        "name": "Apache License 2.0",
        "spdx": "apache-2.0",
        "url": "http://choosealicense.com/licenses/apache-2.0/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/pochi.png"
      },
      {
        "label": "container",
        "url": "https://ghcr.io/tamada/pochi"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/pochi/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/pochi"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/pochi"
      }
    ],
    "name": "pochi",
    "owner": "tamada",
    "releases": [
      {
        "description": "",
        "name": "Release v2.6.0",
        "release_date": "2021-12-13T05:24:16Z"
      }
    ],
    "topics": [
      "birthmarks",
      "plagiarism-detection",
      "software-theft-detection",
      "java9module",
      "birthmark-toolkit"
    ]
  },
  {
    "description": "get next/previous sibling directory name.",
    "languages": [
      "Shell",
      "Rust",
      "Just",
      "AppleScript",
      "Elvish"
    ],
    "last_updated": "2026-10-09T05:20:08Z",
    "license": [
      {
        "name": "Do What The F*ck You Want To Public License",
        "spdx": "wtfpl",
        "url": "http://choosealicense.com/licenses/wtfpl/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/sibling.png"
      },
      {
        "label": "docs",
        "url": "https://docs.rs/sibling/latest"
      },
      {
        "label": "registry",
        "url": "https://crates.io/crates/sibling"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/sibling/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/sibling"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/sibling/"
      }
    ],
    "name": "sibling",
    "owner": "tamada",
    "releases": [
      {
        "description": "## Bug Fixes\n- build the document site with the Hugo which the theme asks for [#47](https://github.com/tamada/sibling/pull/47) ([Haruaki Tamada](https://github.com/tamada/sibling/commit/37955eb3e39191c6db73078eab6aa2aefaa62d71))",
        "name": "Release v3.0.0",
        "release_date": "2026-08-07T04:51:08Z"
      }
    ],
    "topics": [
      "directory-traversal",
      "utility",
      "shell"
    ]
  },
  {
    "description": "another implementation of wc (word count) accepting archives, directories, and file lists.",
    "languages": [
      "Makefile",
      "Go",
      "Dockerfile",
      "Shell"
    ],
    "last_updated": "2026-07-20T06:39:06Z",
    "license": [
      {
        "name": "Apache License 2.0",
        "spdx": "apache-2.0",
        "url": "http://choosealicense.com/licenses/apache-2.0/"
      }
    ],
    "links": [
      {
        "label": "logo",
        "url": "https://tamada.github.io/api/assets/wildcat.svg"
      },
      {
        "label": "container",
        "url": "https://ghcr.io/tamada/wildcat"
      },
      {
        "label": "sbom",
        "url": "https://api.github.com/repos/tamada/wildcat/dependency-graph/sbom"
      },
      {
        "label": "repository",
        "url": "https://github.com/tamada/wildcat"
      },
      {
        "label": "www",
        "url": "https://tamada.github.io/wildcat"
      }
    ],
    "name": "wildcat",
    "owner": "tamada",
    "releases": [
      {
        "description": "* show progress bar (#30),\r\n* do not read the hidden files by the default (#32),\r\n* show entry count in the total line (#33),\r\n* fix the bug fails to open the directory contains the space on the PowerShell, Windows (#34), and\r\n* change order of options in the help message.",
        "name": "v1.2.0",
        "release_date": "2021-04-28T06:47:01Z"
      }
    ],
    "topics": [
      "word-count",
      "golang",
      "rest-api",
      "docker",
      "cli-app"
    ]
  }
]