{"id":26395670,"url":"https://github.com/tamada/pochi","last_synced_at":"2026-03-02T03:36:48.755Z","repository":{"id":17983213,"uuid":"82773287","full_name":"tamada/pochi","owner":"tamada","description":"Java birthmark toolkit, detecting the software theft by native characteristics of the programs.","archived":false,"fork":false,"pushed_at":"2025-06-27T15:29:59.000Z","size":34093,"stargazers_count":3,"open_issues_count":7,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-13T22:59:29.994Z","etag":null,"topics":["birthmark-toolkit","birthmarks","java9module","plagiarism-detection","software-theft-detection"],"latest_commit_sha":null,"homepage":"https://tamada.github.io/pochi","language":"Java","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/tamada.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2017-02-22T07:18:34.000Z","updated_at":"2021-12-13T05:22:49.000Z","dependencies_parsed_at":"2025-07-01T02:45:19.544Z","dependency_job_id":null,"html_url":"https://github.com/tamada/pochi","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/tamada/pochi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamada%2Fpochi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamada%2Fpochi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamada%2Fpochi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamada%2Fpochi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tamada","download_url":"https://codeload.github.com/tamada/pochi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamada%2Fpochi/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265561002,"owners_count":23788292,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["birthmark-toolkit","birthmarks","java9module","plagiarism-detection","software-theft-detection"],"created_at":"2025-03-17T11:18:56.760Z","updated_at":"2026-03-02T03:36:48.727Z","avatar_url":"https://github.com/tamada.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# :dog: pochi\n\n[![build](https://github.com/tamada/pochi/workflows/build/badge.svg)](https://github.com/tamada/pochi/actions?query=workflow%3Abuild)\n[![Coverage Status](https://coveralls.io/repos/github/tamada/pochi/badge.svg?branch=main)](https://coveralls.io/github/tamada/pochi?branch=main)\n[![codebeat badge](https://codebeat.co/badges/8e8c5e70-cb07-4f58-941c-3ddb64f3c059)](https://codebeat.co/projects/github-com-tamada-pochi-main)\n\n[![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)](https://github.com/tamada/pochi/blob/master/LICENSE)\n[![Version](https://img.shields.io/badge/Version-2.6.0-green.svg)](https://github.com/tamada/pochi/releases/tag/v2.6.0)\n[![DOI](https://img.shields.io/badge/DOI-10.5281/zenodo.4271132-green.svg)](https://zenodo.org/badge/latestdoi/82773287)\n\n[![Javadoc](https://img.shields.io/badge/Javadoc-v2.6.0-blue?logo=java)](https://tamada.github.io/pochi/apidocs)\n[![Docker](https://img.shields.io/badge/Docker-ghcr.io%2Ftamada%2Fpochi%3A2.6.0-blue?logo=docker)](https://github.com/users/tamada/packages/container/package/pochi)\n[![GitHub Discussion](https://img.shields.io/badge/GitHub-Discussions-blue?logo=github)](https://github.com/tamada/pochi/discussions)\n\nDetecting the software theft, the birthmark toolkit for the JVM platform.\n\n**pochi** is the birthmarking toolkit for the JVM platform.\nThe birthmarks are the native characteristics extracted from executable programs.\nThen, we compare them and computes the similarities.\nThe resultant similarities shows the copy relation possibilities between two programs.\n\n## :bookmark: Table of Contents in the Web page of pochi\n\n* [:books: Birthmarks](https://tamada.github.io/pochi/birthmarks)\n  - [:green_book: Definition of Birthmarks](https://tamada.github.io/pochi/birthmarks#-definition-of-birthmarks)\n  - [:blue_book: Types of Birthmarks](https://tamada.github.io/pochi/birthmarks#-types-of-birthmarks)\n  - [:orange_book: Similarities](https://tamada.github.io/pochi/birthmarks#-similarities)\n  - [:closed_book: Theft detection process by birthmarks](https://tamada.github.io/pochi/birthmarks#-theft-detection-process-by-birthmarks)\n* :newspaper: What is **pochi**\n  - [:key: Key idea](https://tamada.github.io/pochi/description#-key-idea)\n  - :fork_and_knife: Usage\n    - [:runner: CLI Interface](https://tamada.github.io/pochi/description#-cli-interface)\n    - [:whale: Docker](https://tamada.github.io/pochi/description#-docker)\n  - [:swimmer: The birthmarking flow](https://tamada.github.io/pochi/description#-the-birthmarking-flow)\n* :anchor: Install\n  - [:beer: Homebrew](https://tamada.github.io/pochi/install#-homebrew)\n  - [:muscle: Compiling pochi yourself](https://tamada.github.io/pochi/install#-compiling-pochi-yourself)\n  - [:package: Maven repository](https://tamada.github.io/pochi/install#-maven-repository)\n  - :briefcase: Requirements\n    - [:pouch: Modules](https://tamada.github.io/pochi/install#-modules)\n* :ant: Examples\n  - [:one: `printing_args.groovy`](https://tamada.github.io/pochi/examples#1-printing_argsgroovy)\n  - [:two: `printing_pochi_info.groovy`](https://tamada.github.io/pochi/examples#2-printing_pochi_infogroovy)\n  - [:three: `extracting_birthmarks.groovy`](https://tamada.github.io/pochi/examples#3-extracting_birthmarksgroovy)\n  - [:four: `filtering_source.groovy`](https://tamada.github.io/pochi/examples#4-filtering_sourcegroovy)\n  - [:five: `comparing_birthmarks.groovy`](https://tamada.github.io/pochi/examples#5-comparing_birthmarksgroovy)\n  - [:six: `comparing_birthmarks_with_specified_pair_matcher.groovy`](https://tamada.github.io/pochi/examples#6-comparing_birthmarks_with_specified_pair_matchergroovy)\n  - [:seven: `registering_new_extractor.groovy`](https://tamada.github.io/pochi/examples#6-registering_new_extractorgroovy)\n* :smile: About\n  - [:scroll: License](https://tamada.github.io/pochi/about#-license)\n  - [:man_office_worker: Developers :woman_office_worker:](https://tamada.github.io/pochi/about#-developers-)\n  - [:question: Icon of pochi](https://tamada.github.io/pochi/about#-icon-of-pochi)\n  - :surfer: References\n    - [:basketball: Surveys](https://tamada.github.io/pochi/about#-surveys)\n    - [:soccer: Articles of supported birthmark types](https://tamada.github.io/pochi/about#-articles-of-supported-birthmark-types)\n    - [:tennis: Articles by H. Tamada](https://tamada.github.io/pochi/about#-articles-by-h-tamada)\n* [:smile_cat: API document](https://tamada.github.io/pochi/apidocs)\n\n### :runner: CLI Interface\n\n```sh\npochi [OPTIONS] [SCRIPT_FILE [ARGV...]]\nOPTIONS\n    -c, --classpath \u003cCLASSPATH\u003e      specifies the classpaths for Groovy (JVM) separated with colon (:).\n    -C, --config \u003cCONFIG_FILE\u003e       specifies the configuration file.\n    -e, --expression \u003cEXPRESSION\u003e    specifies one line script.\n    -w, --working-dir \u003cDIR\u003e          specifies the working directory.\n    -v, --verbose                    sets as verbose mode.\n\n    -h, --help                       prints this message.\nSCRIPT_FILE [ARGV...]\n    Groovy script file name and its arguments.\n    If no script files and no expression were given, pochi runs on interactive mode.\n```\n\n#### Script file\n\nThe script files are parsed by the Groovy.\nFor more detail, see [:ant: Examples](https://tamada.github.io/pochi/examples).\n\n### :whale: Docker\n\nContainer images of **pochi** for Docker are:\n\n* [`ghcr.io/tamada/pochi`](https://github.com/users/tamada/packages/container/package/pochi)\n    * `2.6.0`, `latest`\n    * `2.5.2`\n    * `2.5.1`\n    * `2.5.0`\n    * `2.4.6`\n    * `2.4.0`\n    * `2.3.24`\n    * `2.3.23`\n    * `2.3.21`\n    * `2.3.19`\n    * `2.3.18`\n    * `2.3.17`\n    * `2.3.16`\n    * `2.3.10`\n    * `2.3.2`\n    * `2.3.1`\n    * `2.3.0`\n    * `2.2.0`\n    * `2.1.0`\n    * `2.0.0`\n        * accept only `.groovy` script files.\n    * `1.0.0`\n        * accept only `.js` script files.\n\n[![Docker](https://img.shields.io/badge/Docker-ghcir.io%2Ftamada%2Fpochi%3A2.6.0-blue?logo=docker)](https://github.com/users/tamada/packages/container/package/pochi)\n\nTo run **pochi** on Docker container OS, type the following commands.\n\n```sh\n$ docker run --rm -it -v \"$PWD\":/home/pochi ghcr.io/tamada/pochi:latest [OPTIONS] [SCRIPT [ARGV...]]\n```\n\n* `OPTIONS`: the options for **pochi**.\n* `[SCRIPT [ARGV...]]`: script file for **pochi**.\n* `--rm`: remove the container after running.\n* `-it`: interactive and tty mode.\n* `-v \"$PWD\":/home/pochi`: share volume `$PWD` in host OS to `/home/pochi` in the container OS.\n  * `$PWD` must be the absolute path.\n\n`ghcr.io/tamada/pochi` does not include groovy interactive shell environment.\nTherefore, it does not work on interactive mode.\nIf want to run `pochi` on the interactive mode, use `ghcr.io/tamada/pochi-groovysh` image instead.\n\n#### Environments in the docker container\n\n* `USER`: `pochi`\n* `WORKDIR`: `/home/pochi`\n* `JAVA_HOME`: `/opt/java` (symbolic link from `/opt/openjdk-11-minimal`)\n  * This Java runtime environment do not include unnecessary modules.\n* `GROOVY_HOME`: `/opt/groovy` (symbolic link from `/opt/groovy-**3.0.9**`)\n* `POCHI_HOME`: `/opt/pochi` (symbolic link from `/opt/pochi-2.0.0`)\n\n## Discussion\n\n[![GitHub Discussion](https://img.shields.io/badge/GitHub-Discussions-blue?logo=github)](https://github.com/tamada/pochi/discussions)\n\nIf you have any problems or suggestions on pochi, please post the messages to the [GitHub Discussions](https://github.com/tamada/pochi/discussions).\n\n## Maven repository\n\nCopy and paste the following snippet into your `pom.xml`.\n\n```xml\n\u003crepositories\u003e\n  \u003crepository\u003e\n    \u003cid\u003etamada_github\u003c/id\u003e\n    \u003cname\u003eApache Maven Packages of tamada\u003c/name\u003e\n    \u003curl\u003ehttps://tamada.github.io/maven\u003c/url\u003e\n  \u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\nThen, add the dependencies of your `pom.xml`.\n\n| groupId            | artifactId   | version |\n|--------------------|--------------|---------|\n|`jp.cafebabe.pochi` | `kunai2`     | `2.6.0` |\n|`jp.cafebabe.pochi` | `pochi-core` | `2.6.0` |\n|`jp.cafebabe.pochi` | `pochi-api`  | `2.6.0` |\n|`jp.cafebabe.pochi` | `pochi-cmd`  | `2.6.0` |\n\n## Modules\n\n**pochi** provides the following modules, and the dependant modules are shown below.\n\n* `jp.cafebabe.kunai`\n    * `org.objectweb.asm`\n    * `jdk.zipfs`\n* `jp.cafebabe.birthmarks`\n    * `java.logging`\n    * `io.vavr`\n    * `com.fasterxml.jackson.databind`\n    * `jp.cafebabe.kunai`\n* `jp.cafebabe.pochi`\n    * `java.logging`\n    * `jp.cafebabe.birthmarks`\n* `jp.cafebabe.pochicmd`\n    * `info.picocli`\n    * `java.scripting`\n  \n![Module graph](https://github.com/tamada/pochi/raw/main/site/static/images/module-graph.svg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftamada%2Fpochi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftamada%2Fpochi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftamada%2Fpochi/lists"}