{"id":15622607,"url":"https://github.com/frioux/leatherman","last_synced_at":"2026-04-08T22:01:09.953Z","repository":{"id":28441464,"uuid":"116720282","full_name":"frioux/leatherman","owner":"frioux","description":"Handy multitool that happens to be mostly Go","archived":false,"fork":false,"pushed_at":"2025-10-13T13:20:45.000Z","size":1350,"stargazers_count":70,"open_issues_count":10,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-10-26T09:33:04.733Z","etag":null,"topics":["golang","hacktoberfest","tool"],"latest_commit_sha":null,"homepage":"","language":"Go","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/frioux.png","metadata":{"files":{"readme":"README.mdwn","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-01-08T19:45:02.000Z","updated_at":"2025-04-07T13:58:29.000Z","dependencies_parsed_at":"2023-12-19T02:32:57.244Z","dependency_job_id":"42ef0eaf-e64d-460b-b7a5-7c0e8ce22dd0","html_url":"https://github.com/frioux/leatherman","commit_stats":{"total_commits":969,"total_committers":8,"mean_commits":121.125,"dds":0.3384932920536635,"last_synced_commit":"3e30898825ad3af225946258ab9d69d8cc304835"},"previous_names":[],"tags_count":478,"template":false,"template_full_name":null,"purl":"pkg:github/frioux/leatherman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frioux%2Fleatherman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frioux%2Fleatherman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frioux%2Fleatherman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frioux%2Fleatherman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frioux","download_url":"https://codeload.github.com/frioux/leatherman/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frioux%2Fleatherman/sbom","scorecard":{"id":411651,"data":{"date":"2025-08-11","repo":{"name":"github.com/frioux/leatherman","commit":"de670f8c4afbb3200441d42b43d2f02c1750c742"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":-1,"reason":"Found no human activity in the last 30 changesets","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/cicd.yml:4","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:107: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/cicd.yml:85: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/cicd.yml:91: update your workflow using https://app.stepsecurity.io/secureworkflow/frioux/leatherman/cicd.yml/main?enable=pin","Info:   0 out of  12 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: GoBuiltInFuzzer integration found: internal/notes/west/fuzz_test.go:13"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact untagged-451448a39895ad8e069a922d11f250934a2b7e20 not signed: https://api.github.com/repos/frioux/leatherman/releases/94520097","Warn: release artifact untagged-adcaf1dbe5771209301b809c6cb80abca0fc64c9 not signed: https://api.github.com/repos/frioux/leatherman/releases/94459979","Warn: release artifact untagged-458944b6b48c08e180888ac2bb54eb5a7b845c42 not signed: https://api.github.com/repos/frioux/leatherman/releases/94459549","Warn: release artifact untagged-1ce9328705465d86e881edef2b4d0227e5c82415 not signed: https://api.github.com/repos/frioux/leatherman/releases/94480559","Warn: release artifact untagged-9c617f77a9c8ca7d2a16d44429840dccfa14c80a not signed: https://api.github.com/repos/frioux/leatherman/releases/87186692","Warn: release artifact untagged-451448a39895ad8e069a922d11f250934a2b7e20 does not have provenance: https://api.github.com/repos/frioux/leatherman/releases/94520097","Warn: release artifact untagged-adcaf1dbe5771209301b809c6cb80abca0fc64c9 does not have provenance: https://api.github.com/repos/frioux/leatherman/releases/94459979","Warn: release artifact untagged-458944b6b48c08e180888ac2bb54eb5a7b845c42 does not have provenance: https://api.github.com/repos/frioux/leatherman/releases/94459549","Warn: release artifact untagged-1ce9328705465d86e881edef2b4d0227e5c82415 does not have provenance: https://api.github.com/repos/frioux/leatherman/releases/94480559","Warn: release artifact untagged-9c617f77a9c8ca7d2a16d44429840dccfa14c80a does not have provenance: https://api.github.com/repos/frioux/leatherman/releases/87186692"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":7,"reason":"3 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T22:51:02.234Z","repository_id":28441464,"created_at":"2025-08-18T22:51:02.234Z","updated_at":"2025-08-18T22:51:02.234Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31575755,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"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":["golang","hacktoberfest","tool"],"created_at":"2024-10-03T09:54:47.122Z","updated_at":"2026-04-08T22:01:09.947Z","avatar_url":"https://github.com/frioux.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- Code generated by maint/generate-README. DO NOT EDIT. --\u003e\n# Leatherman - fREW's favorite multitool\n\nThis is a little project simply to make trivial tools in Go effortless for my\npersonal usage.  These tools are almost surely of low utility to most people,\nbut may be instructive nonetheless.\n\n[I have CI/CD to build this into a single\nbinary](https://github.com/frioux/leatherman/blob/master/.travis.yml) and [an\n`explode` tool that builds\nsymlinks](https://github.com/frioux/leatherman/blob/master/explode.go) for each\ntool in the busybox style.\n\n[I have automation in my\ndotfiles](https://github.com/frioux/dotfiles/blob/bef8303c19e2cefac7dfbec420ad8d45b95415b8/install.sh#L133-L141)\nto pull the latest binary at install time and run the `explode` tool.\n\n## Installation\n\nHere's a copy pasteable script to install the leatherman on OSX or Linux:\n\n``` bash\nSUFFIX=\"\"\nif [ \"$(uname -s)\" = \"Darwin\" ]; then\n  if [ \"$(uname -m)\" = \"arm64\" ]; then\n    SUFFIX=\".mac-arm64\"\n  else\n    SUFFIX=\".mac\"\n  fi\nelif [ \"$(uname -m)\" = \"armv7l\" ]; then\n  SUFFIX=\".arm\"\nfi\nLMURL=\"$(curl -s https://api.github.com/repos/frioux/leatherman/releases/latest |\n   grep browser_download_url |\n   cut -d '\"' -f 4 |\n   grep -F leatherman${SUFFIX}.xz )\"\nmkdir -p ~/bin\ncurl -sL \"$LMURL\" \u003e ~/bin/leatherman.xz\nxz -d -f ~/bin/leatherman.xz\nchmod +x ~/bin/leatherman\n~/bin/leatherman explode\n```\n\nThis asssumes that `~/bin` is in your path.  The `explode` command will create a\nsymlink for each of the tools listed below.\n\n## Usage\n\nEach tool takes different args, but to run a tool you can either use a symlink\n(presumably created by `explode`):\n\n``` bash\n$ echo \"---\\nfoo: 1\" | yaml2json\n{\"foo\":1}\n```\n\nor use it as a subcommand:\n\n``` bash\necho \"---\\nfoo: 1\" | leatherman yaml2json\n{\"foo\":1}\n```\n\n## Tools\n\n\n### allpurpose\n\n * `alluni`: Prints all unicode character names ([internal/tool/allpurpose/uni/alluni.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/uni/alluni.md))\n * `clocks`: Shows my personal, digital, wall of clocks ([internal/tool/allpurpose/clocks/clocks.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/clocks/clocks.md))\n * `csv2json`: Reads CSV on stdin and writes JSON on stdout ([internal/tool/allpurpose/csv/csv2json.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/csv/csv2json.md))\n * `csv2md`: Reads CSV on stdin and writes Markdown on stdout ([internal/tool/allpurpose/csv/csv2md.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/csv/csv2md.md))\n * `debounce`: Run debounces input from stdin to stdout ([internal/tool/allpurpose/debounce/debounce.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/debounce/debounce.md))\n * `dump-mozlz4`: Dumps the contents of a `mozlz4` (aka `jsonlz4`) file. ([internal/tool/allpurpose/dumpmozlz4/dump-mozlz4.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/dumpmozlz4/dump-mozlz4.md))\n * `expand-url`: Converts links in text to markdown links. ([internal/tool/allpurpose/expandurl/expand-url.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/expandurl/expand-url.md))\n * `fn`: Creates persistent functions by generating scripts. ([internal/tool/allpurpose/fn/fn.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/fn/fn.md))\n * `group-by-date`: Creates time series data by counting lines and grouping them by a given date format. ([internal/tool/allpurpose/groupbydate/group-by-date.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/groupbydate/group-by-date.md))\n * `minotaur`: Watches directories and runs a command when files change. ([internal/tool/allpurpose/minotaur/minotaur.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/minotaur/minotaur.md))\n * `name2rune`: Prints characters based on name. ([internal/tool/allpurpose/uni/name2rune.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/uni/name2rune.md))\n * `netrc-password`: Prints password for a hostname, login pair. ([internal/tool/allpurpose/netrcpassword/netrc-password.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/netrcpassword/netrc-password.md))\n * `pomotimer`: Conveniently counts down a duration. ([internal/tool/allpurpose/pomotimer/pomotimer.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/pomotimer/pomotimer.md))\n * `replace-unzip`: Does what `unzip` does more safely. ([internal/tool/allpurpose/replaceunzip/replace-unzip.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/replaceunzip/replace-unzip.md))\n * `srv`: Serves a directory over http, automatically refreshing when files change. ([internal/tool/allpurpose/srv/srv.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/srv/srv.md))\n * `toml2json`: Reads TOML on stdin and writes JSON on stdout. ([internal/tool/allpurpose/toml/toml2json.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/toml/toml2json.md))\n * `uni`: Describes unicode characters. ([internal/tool/allpurpose/uni/uni.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/uni/uni.md))\n * `yaml2json`: Reads YAML on stdin and writes JSON on stdout. ([internal/tool/allpurpose/yaml/yaml2json.md](https://github.com/frioux/leatherman/blob/main/internal/tool/allpurpose/yaml/yaml2json.md))\n\n### chat\n\n * `auto-emote`: Reacts to discord messages with vaguely related emoji. ([internal/tool/chat/automoji/auto-emote.md](https://github.com/frioux/leatherman/blob/main/internal/tool/chat/automoji/auto-emote.md))\n * `slack-deaddrop`: Sends messages to a slack channel. ([internal/tool/chat/slack/slack-deaddrop.md](https://github.com/frioux/leatherman/blob/main/internal/tool/chat/slack/slack-deaddrop.md))\n * `slack-open`: Opens a channel, group message, or direct message by name. ([internal/tool/chat/slack/slack-open.md](https://github.com/frioux/leatherman/blob/main/internal/tool/chat/slack/slack-open.md))\n * `slack-status`: Sets slack status. ([internal/tool/chat/slack/slack-status.md](https://github.com/frioux/leatherman/blob/main/internal/tool/chat/slack/slack-status.md))\n\n### leatherman\n\n * `update`: Installs new version of leatherman if one exists. ([internal/tool/leatherman/update/update.md](https://github.com/frioux/leatherman/blob/main/internal/tool/leatherman/update/update.md))\n\n### misc\n\n * `backlight`: Modifies screen brightness. ([internal/tool/misc/backlight/backlight.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/backlight/backlight.md))\n * `draw`: Draws images with lua. ([internal/tool/misc/img/draw.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/img/draw.md))\n * `export-bamboohr`: Exports company directory as JSON. ([internal/tool/misc/bamboo/export-bamboohr.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/bamboo/export-bamboohr.md))\n * `media-remote`: `media-remote` control media players on Linux. ([internal/tool/misc/desktop/media-remote.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/desktop/media-remote.md))\n * `prepend-hist`: Combines a history file and stdin. ([internal/tool/misc/prependhist/prepend-hist.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/prependhist/prepend-hist.md))\n * `status`: Serves information about host machine. ([internal/tool/misc/status/status.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/status/status.md))\n * `steamsrv`: Steamsrv renders steam screenshots and the steam log (what games you played and when) over http. ([internal/tool/misc/steamsrv/steamsrv.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/steamsrv/steamsrv.md))\n * `twilio`: Makes callbacks like twilio. ([internal/tool/misc/twilio/twilio.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/twilio/twilio.md))\n * `wuphf`: Sends notifications on lots (2) of platforms. ([internal/tool/misc/wuphf/wuphf.md](https://github.com/frioux/leatherman/blob/main/internal/tool/misc/wuphf/wuphf.md))\n\n### notes\n\n * `amygdala`: Automated assistant. ([internal/tool/notes/amygdala/amygdala.md](https://github.com/frioux/leatherman/blob/main/internal/tool/notes/amygdala/amygdala.md))\n * `brainstem`: Interacts with amygdala without using any server components. ([internal/tool/notes/brainstem/brainstem.md](https://github.com/frioux/leatherman/blob/main/internal/tool/notes/brainstem/brainstem.md))\n * `notes`: Serves my notes from disk or Dropbox. ([internal/tool/notes/now/notes.md](https://github.com/frioux/leatherman/blob/main/internal/tool/notes/now/notes.md))\n * `proj`: Integrates my various project management tools. ([internal/tool/notes/proj/proj.md](https://github.com/frioux/leatherman/blob/main/internal/tool/notes/proj/proj.md))\n * `zine`: Read only view of my notes via the filesystem. ([internal/tool/notes/zine/zine.md](https://github.com/frioux/leatherman/blob/main/internal/tool/notes/zine/zine.md))\n\n## Debugging\n\nIn an effort to make debugging simpler, I've created three ways to see what\n`leatherman` is doing:\n\n### Tracing\n\n`LMTRACE=$somefile` will write an execution trace to `$somefile`; look at that with `go tool trace $somefile`\n\nSince so many of the tools are short lived my assumption is that the execution\ntrace will be the most useful.\n\n### Profiling\n\n`LMPROF=$somefile` will write a cpu profile to `$somefile`; look at that with `go tool pprof -http localhost:10123 $somefile`\n\nIf you have a long running tool, the pprof http endpoint is exposed on\n`localhost:6060/debug/pprof` but picks a random port if that port is in use; the\nport can be overridden by setting `LMHTTPPROF=$someport`.\n\n## Auxiliary Tools\n\nSome tools are annoying to have in the main leatherman tool.  Maybe they pull\nin deps that are huge or need cgo, but in any case I try to keep them separate.\nFor now, these tools are under `leatherman/cmd` and must be built and run\nseparately.  At some point I may come up with a policy around building or naming these,\nbut for now they are simply extra tools.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrioux%2Fleatherman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrioux%2Fleatherman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrioux%2Fleatherman/lists"}