{"id":28797692,"url":"https://github.com/rahji/packingslipper","last_synced_at":"2026-04-30T07:39:48.861Z","repository":{"id":296615984,"uuid":"994055659","full_name":"rahji/packingslipper","owner":"rahji","description":"CLI for creating a 2\"x7\" PDF packing slip from a Shopify order","archived":false,"fork":false,"pushed_at":"2025-06-01T05:20:56.000Z","size":80,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-01T09:45:23.268Z","etag":null,"topics":["cli","shipping","shopify","shopify-cli"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rahji.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2025-06-01T05:16:08.000Z","updated_at":"2025-06-01T05:20:59.000Z","dependencies_parsed_at":"2025-06-01T09:45:50.640Z","dependency_job_id":"8f454640-c63b-4163-bbc4-336d69d28565","html_url":"https://github.com/rahji/packingslipper","commit_stats":null,"previous_names":["rahji/packingslipper"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rahji/packingslipper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahji%2Fpackingslipper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahji%2Fpackingslipper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahji%2Fpackingslipper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahji%2Fpackingslipper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rahji","download_url":"https://codeload.github.com/rahji/packingslipper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rahji%2Fpackingslipper/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260491142,"owners_count":23017181,"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":["cli","shipping","shopify","shopify-cli"],"created_at":"2025-06-18T05:00:37.229Z","updated_at":"2026-04-30T07:39:48.855Z","avatar_url":"https://github.com/rahji.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PackingSlipper\n\nPackingSlipper is a command-line tool for creating a PDF packing slip from a Shopify order.\n\nYou probably want to use\n[Shopify's instructions for creating custom CSS for your packing slips](https://help.shopify.com/en/manual/fulfillment/managing-orders/printing-orders/packing-slips/customizing-packing-slips)\ninstead of using this. I used my own custom CSS for years so that I could print packing slips on 2x7 Dymo labels\n(which I have way too many of since I started using a 4x6 label printer), but it seems to have started creating\npage breaks in the PDFs that it creates. So I made this. It creates a single packing slip based on the most recent\norder, by default.\n\n## Installing\n\n1. [Get Go](https://go.dev/doc/install)\n2. Run `go install github.com/rahji/packingslipper@latest`\n\n*I would normally create binaries so you can download and run it without installing Go, but I don't expect anyone\nto use this. And if they do, they'll likely want to change something in the code. This was really made just to\nsolve my specific problem*\n\n## Configuration\n\nYou'll need to create a [Shopify Custom App](https://help.shopify.com/en/manual/apps/app-types#custom-apps) for your\nstore and give it permission to view orders. Note the API token that you are given.\n\n### Secrets\n\nThe secrets configuration for this project is a bit overkill, but the whole thing is really a learning exercise anyway.\nSOPS is a pretty simple tool for encrypting files. Age is a modern PGP alternative for doing the actual encryption. And\nthe ~~go.mozilla.org/sops/v3/decrypt~~ **github.com/getsops/sops/v3** package (never use that mozilla one!) provides an easy way to use those encrypted files inside a Go program.\n\nThe secrets for this program are the token from above and your Shopify shop name (as shown at the beginning of your Shopify admin site URL).\nThese secrets are stored in an encrypted YAML file. Create the YAML file and encrypt it using SOPS. You'll probably\nneed to [install SOPS](https://getsops.io/) first. And if you want to use Age for the encryption, as I did, you'll need to\n[install Age](https://github.com/FiloSottile/age) and generate a key pair:\n\n```bash\nmkdir -p ~/.config/sops/age\nage-keygen -o ~/.config/sops/age/keys.txt\nchmod 700 ~/.config/sops/age/keys.txt\n````\n\nNote: If you store your key file in a non-standard directory then you'll want to set an environment variable with its\nlocation: `export SOPS_AGE_KEY_FILE=/path/to/your/age-key.txt`\n\nCreate a `.sops.yaml` file, so SOPS knows what your Age public key is. (It was shown to you by `age-keygen`.)\n\n```yaml\ncreation_rules:\n  - age: \u003e-\n      YOUR_PUBLIC_AGE_KEY\n```\n\nCreate an unencrypted file called `secrets.enc.yaml`:\n\n```yaml\napi:\n  token: \"shpat_...\"\n  shop: \"your-shop-name\"\n```\n\nThen encrypt it, in place: `sops -e -i secrets.enc.yaml`\n\n### Other Config\n\nEdit the included `configuration.yaml` file, according to your needs.\n\n## Usage\n\nOpen your terminal application and type `packingslipper`\n\nThe program accepts these flags:\n\n| Flag | Default | Description |\n| ---- | ------- | ----------- |\n| outfile | packingslip.pdf | Output PDF filename |\n| offset | 0 | How far back to jump from the most recent order |\n| config | configuration.yaml | Configuration YAML filename (default: ~/.config/packingslipper/configuration.yaml) |\n| secrets | secrets.enc.yaml | Encrypted secrets YAML filename (default: ~/.config/packingslipper/secrets.enc.yaml) |\n| verbose | false | Display extra information on STDOUT |\n\n## Issues\n\nBecause of the font that I am using, addresses with characters from other languages are not going to work. I tried\nfonts that provide those character sets, but then I went down a rathole of having the program make a guess at\nthe language and substitute the correct font. Unfortunately, it seems as though it's not so easy to correctly\ndetermine whether text is Chinese or Japanese (which seems insane to me).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frahji%2Fpackingslipper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frahji%2Fpackingslipper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frahji%2Fpackingslipper/lists"}