{"id":26404126,"url":"https://github.com/gatlenculp/gatpack","last_synced_at":"2025-03-17T16:20:34.276Z","repository":{"id":276232158,"uuid":"927510966","full_name":"GatlenCulp/gatpack","owner":"GatlenCulp","description":"A PDF and website templating tool","archived":false,"fork":false,"pushed_at":"2025-03-16T22:33:40.000Z","size":6101,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-16T23:24:39.792Z","etag":null,"topics":["jinja","latex","latex-template","template","typer"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/gatpack/","language":"Python","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/GatlenCulp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"docs/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"docs/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-05T04:30:40.000Z","updated_at":"2025-03-16T22:33:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"bc524238-050b-432a-803b-4b5a2825eb68","html_url":"https://github.com/GatlenCulp/gatpack","commit_stats":null,"previous_names":["gatlenculp/gatpack"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatlenCulp%2Fgatpack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatlenCulp%2Fgatpack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatlenCulp%2Fgatpack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GatlenCulp%2Fgatpack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GatlenCulp","download_url":"https://codeload.github.com/GatlenCulp/gatpack/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244066191,"owners_count":20392407,"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":["jinja","latex","latex-template","template","typer"],"created_at":"2025-03-17T16:20:33.474Z","updated_at":"2025-03-17T16:20:34.244Z","avatar_url":"https://github.com/GatlenCulp.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003ca href=\"https://github.com/GatlenCulp/gatpack\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/GatlenCulp/gatpack/main/docs/images/logo.png\" alt=\"Logo\" width=\"100\" height=\"100\"\u003e\n  \u003c/a\u003e\n\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eGatPack\u003c/h1\u003e\n\n\u003ca href=\"#about\"\u003e\u003cstrong\u003eExplore the docs »\u003c/strong\u003e\u003c/a\u003e\n\u003cbr /\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/GatlenCulp/gatpack/main/docs/images/gatpack-cli.png\" title=\"Home Page\" width=\"500px\"\u003e\n\u003cbr /\u003e\n\u003ca href=\"https://github.com/GatlenCulp/gatpack/issues/new?assignees=\u0026labels=bug\u0026template=01_BUG_REPORT.md\u0026title=bug%3A+\"\u003eReport a Bug\u003c/a\u003e\n·\n\u003ca href=\"https://github.com/GatlenCulp/gatpack/issues/new?assignees=\u0026labels=enhancement\u0026template=02_FEATURE_REQUEST.md\u0026title=feat%3A+\"\u003eRequest a Feature\u003c/a\u003e\n.\n\u003ca href=\"https://github.com//gatpack/issues/new?assignees=\u0026labels=question\u0026template=04_SUPPORT_QUESTION.md\u0026title=support%3A+\"\u003eAsk a Question\u003c/a\u003e\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cbr /\u003e\n\n[![Project license](https://img.shields.io/github/license/GatlenCulp/gatpack?style=flat-square)](LICENSE) [![Pull Requests welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg?style=flat-square)](https://github.com/GatlenCulp/gatpack/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) [![code with love by ](https://img.shields.io/badge/%3C%2F%3E%20with%20%E2%99%A5%20by-GatlenCulp-ff1414.svg?style=flat-square)](https://github.com/GatlenCulp)\n\n![Uses the Cookiecutter Data Science project template, GOTem style](https://img.shields.io/badge/GOTem-Project%20Instance-328F97?logo=cookiecutter) ![PyPI - Version](https://img.shields.io/pypi/v/gatpack?style=flat) [![tests](https://github.com/GatlenCulp/gatlens-opinionated-template/actions/workflows/tests.yml/badge.svg)](https://github.com/GatlenCulp/gatpack/actions/workflows/tests.yml) [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv) ![GitHub stars](https://img.shields.io/github/stars/gatlenculp/gatpack?style=social)\n\n\u003ch3\u003e⚡️ Quick Install\u003c/h3\u003e\n\n```bash\ncurl -LsSf https://raw.githubusercontent.com/GatlenCulp/gatpack/main/install.sh | sh\n```\n\n\u003c/div\u003e\n\n______________________________________________________________________\n\n## About\n\nGatPack is a CLI and Python API for automating LaTeX and PDF document generation using [Jinja templating](https://jinja.palletsprojects.com/en/stable/api/). This was originally developed for creating professional looking packets for AI safety coursework at [MIT AI Alignment](https://aialignment.mit.edu).\n\n\u003cdetails\u003e\n\u003csummary\u003eScreenshots\u003c/summary\u003e\n\u003cbr\u003e\n\n|                                                               CLI                                                                |                                                       Generated Cover Page                                                       |                                                         Pre-Rendered Cover Page                                                          |\n| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: |\n| \u003cimg src=\"https://raw.githubusercontent.com/GatlenCulp/gatpack/main/docs/images/gatpack-cli.png\" title=\"Home Page\" width=\"100%\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/GatlenCulp/gatpack/main/docs/images/cover-page.png\" title=\"Login Page\" width=\"100%\"\u003e | \u003cimg src=\"https://raw.githubusercontent.com/GatlenCulp/gatpack/main/docs/images/latex-jinja-pretty.png\" title=\"Login Page\" width=\"100%\"\u003e |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eBuilt With\u003c/summary\u003e\n\u003cbr\u003e\n\n- Typer (For the CLI)\n- LaTeX (For creating documents from text)\n- Jinja (For templating and placeholders)\n- Pydantic (For specifying the config file schema)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSee who is using\u003c/summary\u003e\n\u003cbr\u003e\n\n- [MIT AI Alignment (MAIA)](https://aialignment.mit.edu/)\n- [AI Safety Student Team (AISST)](https://haist.ai/) at Harvard\n- [Columbia AI Alignment Club (CAIAC)](https://www.cualignment.org/)\n\nLet us know if your team is using it an how!\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eTable of Contents\u003c/summary\u003e\n\u003cbr\u003e\n\n\u003c!-- @import \"[TOC]\" {cmd=\"toc\" depthFrom=1 depthTo=6 orderedList=false} --\u003e\n\n\u003c!-- code_chunk_output --\u003e\n\n- [About](#about)\n- [Getting Started](#getting-started)\n  - [00 Requirements](#00-requirements)\n  - [01 Install GatPack](#01-install-gatpack)\n  - [02 Initialize your project (`gatpack init`)](#02-initialize-your-project-gatpack-init)\n  - [03 Build the Example project](#03-build-the-example-project)\n- [Usage](#usage)\n  - [01 CLI Help](#01-cli-help)\n  - [02 LaTeX-Modified Jinja](#02-latex-modified-jinja)\n  - [04 Going Beyond LaTeX \u0026 PDFs](#04-going-beyond-latex--pdfs)\n  - [05 Understand the Compose File (`compose.gatpack.json`)](#05-understand-the-compose-file-composegatpackjson)\n    - [05.01 The `context` object](#0501-the-context-object)\n    - [05.02 The `pipelines` list](#0502-the-pipelines-list)\n\n\u003c!-- /code_chunk_output --\u003e\n\n\u003c/details\u003e\n\n______________________________________________________________________\n\n## Getting Started\n\n_Note: Parts 00 and 01 can be skipped if the quick install above worked._\n\n### 00 Requirements\n\n- LaTeX (`pdflatex` specifically, see more instructions on installing below)\n- Python 3.10+\n- Text Editor (Ex: VSCode)\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eInstalling Requirements\u003c/b\u003e\u003c/summary\u003e\n\u003cbr /\u003e\n\n**00.01 installing python**\n\nPython can be installed from the [Python downloads page](https://www.python.org/downloads/), or if you have `brew` on macOS:\n\n```bash\nbrew install python\n```\n\n**00.02 pdflatex requirement**\n\nTo use `gatpack build` which will convert a LaTeX document to a PDF, you will need `pdflatex` to be available on your path. You can check for this with\n\n```bash\npdflatex --verison\n```\n\nIf this command isn't found, then you need to install a LaTeX compiler to your machine.\n\nFor mac you can install [MacTeX](https://www.tug.org/mactex/mactex-download.html). Using Homebrew:\n\n```bash\nbrew install --cask mactex\n```\n\n_Note: Eventually this LaTeX requirement will be removed_\n\n\u003c!-- I should take a look at this: https://pypi.org/project/pdflatex/ --\u003e\n\n**00.03 text editor requirement**\n\nAny text editor will do but you should probably choose something with JSON syntax highlighting such as VSCode.\n\n\u003cbr /\u003e\n\u003c/details\u003e\n\n### 01 Install GatPack\n\n[Gatpack is a Python package](https://pypi.org/project/gatpack/) that can easily be installed from your favorite package manager\n\n**Using uv (Recommended)**\n\n[uv](https://docs.astral.sh/uv/getting-started/installation/) is a fast, reliable Python package installer and resolver:\n\n```bash\nuv tool install gatpack\n```\n\n_Note: Make sure you run `uv tool update-shell`, otherwise uv tools won't be in your PATH_\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eAlternative Installation Methods\u003c/b\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\n**Using pipx**\n\nIdeal for CLI applications that you want isolated from your system:\n\n```bash\npipx install gatpack\n```\n\n**Using pip with a virtual environment**\n\n```bash\n# Create and activate a virtual environment first\npython -m venv .venv\nsource .venv/bin/activate  # On Windows: .venv\\Scripts\\activate\n\n# Then install within the virtual environment\npip install gatpack\n```\n\n**Using conda**\n\n```bash\n# Create a conda environment\nconda create -n gatpack-env python=3.12\nconda activate gatpack-env\n\n# Install gatpack\npip install gatpack\n```\n\n\u003c/details\u003e\n\nYou can verify the installation by running:\n\n```bash\ngatpack --help\n```\n\n### 02 Initialize your project (`gatpack init`)\n\ncd into the directory you would like to create your example project [(source code)](https://github.com/GatlenCulp/cookiecutter-gatpack) and run:\n\n```bash\ngatpack init\n```\n\n### 03 Build the Example project\n\nThe example compose file comes with one preset pipeline called `reading-packet` which contains the instructions to build a packet with a cover, readings, and a final page with additional readings.\n\n```bash\ngatpack compose reading-packet --overwrite\n```\n\nWhen finished, you should have an `output/output.pdf` file.\n\n______________________________________________________________________\n\n## Usage\n\n### 01 CLI Help\n\nThe CLI commands are NOT documented in any dedicated page. Instead commands are documented from within the CLI itself. `gatpack --help` will provide usage information. `gatpack COMMAND --help` will provide usage information on subcommands.\n\n![GatPack CLI](docs/images/gatpack-cli.png)\n\n\u003c!-- \u003cimg src=\"docs/images/gatpack-cli.png\" title=\"Home Page\" width=\"500px\"\u003e --\u003e\n\n### 02 LaTeX-Modified Jinja\n\nThe [Jinja placeholders for LaTeX were modified](https://jinja.palletsprojects.com/en/stable/templates/#line-statements) to ensure compatability and a good user experience:\n\n| Function                                                                                                             | LaTeX-Modified              | Standard                  | Usage                                    |\n| -------------------------------------------------------------------------------------------------------------------- | --------------------------- | ------------------------- | ---------------------------------------- |\n| [Expresssions \u0026 Variables](https://jinja.palletsprojects.com/en/stable/templates/#variables)                         | `\\VAR{variable_name}`       | `{{ variable_name }}`     | Insert a variable value                  |\n| [Statements \u0026 Control Structures](https://jinja.palletsprojects.com/en/stable/templates/#list-of-control-structures) | `\\BLOCK{for item in items}` | `{% for item in items %}` | Control structures (loops, conditionals) |\n| [Comments](https://jinja.palletsprojects.com/en/stable/templates/#comments)                                          | `\\#{comment text}`          | `{# comment text #}`      | Add template comments                    |\n| [Line Statements](https://jinja.palletsprojects.com/en/stable/templates/#comments)                                   | `%-`                        | `#`                       | Single line statements                   |\n| [Line Comment](https://jinja.palletsprojects.com/en/stable/templates/#line-statements)                               | `%#`                        | `##`                      | Single line comments                     |\n\n[See the Jinja API for more information](https://jinja.palletsprojects.com/en/stable/api/). Apart from the delimeter syntax, everything should work the same. These placeholders will be filled in with variable assignments made from your `compose.gatpack.json`'s `context` object when you run `gatpack infer` (ex: `gatpack infer --from example.jinja.tex --to example.tex`).\n\n\u003cdetails\u003e\n\u003csummary\u003e Why this Modification is Needed \u003c/summary\u003e\n\u003cbr /\u003e\n\nStandard Jinja placeholders: `{{ variable_name }}`, `{% for item in items %} {% endfor %}`, etc. don't play well with LaTeX. It becomes very difficult to view your LaTeX template since you run into syntax errors and some LaTeX syntax conflicts with Jinja tags, leading to errors from both systems.\n\n\u003cdiv style=\"display: flex; gap: 20px; align-items: center;\"\u003e\n    \u003cdiv\u003e\n        \u003cp\u003e\u003cstrong\u003eStandard Jinja:\u003c/strong\u003e\u003c/p\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/GatlenCulp/gatpack/main/docs/images/latex-jinja-ugly.png\" title=\"Ugly Latex Jinja\" width=\"300px\"\u003e\n    \u003c/div\u003e\n    \u003cdiv\u003e\n        \u003cp\u003e\u003cstrong\u003eLaTeX-Adapted Jinja:\u003c/strong\u003e\u003c/p\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/GatlenCulp/gatpack/main/docs/images/latex-jinja-pretty.png\" title=\"Pretty Latex Jinja\" width=\"300px\"\u003e\n    \u003c/div\u003e\n\u003c/div\u003e\n\nThe Jinja placeholders above are meant to fix this issue.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003eGet placeholder highlighting in your LaTeX document \u003c/summary\u003e\n\u003c/br\u003e\n\n```tex\n% Define Jinja placeholder commands for better editor visualization\n\\usepackage{xcolor}\n\\definecolor{jinjaColor}{HTML}{7B68EE}  % Medium slate blue color for Jinja\n\\definecolor{jinjaVarBg}{HTML}{E6E6FA}    % Light lavender for variables\n\\definecolor{jinjaBlockBg}{HTML}{FFE4E1}  % Misty rose for blocks\n\\definecolor{jinjaCommentBg}{HTML}{E0FFFF}  % Light cyan for comments\n\\newcommand{\\VAR}[1]{\\colorbox{jinjaVarBg}{\\detokenize{#1}}}\n\\newcommand{\\BLOCK}[1]{\\colorbox{jinjaBlockBg}{\\detokenize{#1}}}\n\\newcommand{\\COMMENT}[1]{\\colorbox{jinjaCommentBg}{\\detokenize{#1}}}\n```\n\n\u003c/details\u003e\n\n\u003c!-- ### 03 Usage Examples\n\n- You want to combine multiple files into a packet: `pdfs/document1.pdf`, `pdfs/document2.pdf`, and `pdfs/document3.pdf`. This makes printing and stapling multiple copies easier: `gatpack combine pdfs/*.pdf packet.pdf`\n\n- You want to build and reuse a LaTeX template for an invoice: `invoice.jinja.tex`. To do this, render your template using Jinja placeholders into `invoice.tex` using the assignments from `compose.gatpack.json` then build your invoice to a pdf `invoice.pdf`:\n\n  ```bash\n  gatpack --from invoice.jinja.tex --to invoice.pdf\n  ``` --\u003e\n\n### 04 Going Beyond LaTeX \u0026 PDFs\n\nIf you need more than just LaTeX and PDFs, it's recommended that you check out [pandoc](https://pandoc.org/index.html) -- a software that can convert most files from one format to another (Ex: LaTeX to Markdown, HTML, etc.). It of course doesn't work quite as well as natively writing the document in that language, but I generally recommend it.\n\n### 05 Understand the Compose File (`compose.gatpack.json`)\n\nHere is the `compose.gatpack.json` file that comes with the sample `gatpack init` project:\n\n```json\n{\n  \"$schema\": \"https://raw.githubusercontent.com/GatlenCulp/gatpack/refs/heads/feature/compose-actions/gatpack/schema/json/GatPackCompose.schema.json\",\n  \"name\": \"Intro Fellowship Reading Packet\",\n  \"description\": \"Packet for CAIAC's Spring 2025 Intro Fellowship\",\n  \"version\": \"1.0\",\n  \"context\": {\n    \"program_long_name\": \"Intro Fellowship\",\n    \"time_period\": \"Spring 2025\",\n    \"chron_info\": \"WEEK 0\",\n    \"title\": \"Introduction to machine learning\",\n    \"subtitle\": \"READINGS\",\n    \"primary_color\": \"0B0D63\",\n    \"primary_color_faded\": \"789BD6\",\n    \"core_readings\": [\n      {\n        \"title\": \"Neural Networks\",\n        \"read_on_device\": true,\n        \"subsection\": \"Chapters 1-6\",\n        \"author\": \"3Blue1Brown\",\n        \"year\": 2024,\n        \"url\": \"https://youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi\u0026feature=shared\",\n        \"thumbnail_path\": \"\"\n      }\n    ],\n    \"further_readings\": [\n      {\n        \"title\": \"A short introduction to machine learning\",\n        \"subsection\": \"\",\n        \"author\": \"Ngo\",\n        \"year\": 2021,\n        \"url\": \"https://www.alignmentforum.org/posts/qE73pqxAZmeACsAdF/a-short-introduction-to-machine-learning\",\n        \"thumbnail_path\": \"\"\n      },\n      // ... More readings\n      {\n        \"title\": \"A (long) peek into reinforcement learning\",\n        \"subsection\": \"\",\n        \"author\": \"Weng\",\n        \"year\": 2018,\n        \"url\": \"https://lilianweng.github.io/posts/2018-02-19-rl-overview/\",\n        \"thumbnail_path\": \"\"\n      }\n    ]\n  },\n  \"pipelines\": [\n    {\n      \"description\": \"Create the full reading packet.\",\n      \"id\": \"reading-packet\",\n      \"steps\": [\n        {\n          \"name\": \"Render cover page\",\n          \"from\": \"cover/cover.jinja.tex\",\n          \"to\": \"cover/cover.pdf\"\n        },\n        // ... More Steps ...\n        {\n          \"name\": \"Combine all readings into packet.pdf\",\n          \"combine\": [\n            \"cover/cover.pdf\",\n            \"device_readings/device_readings.pdf\",\n            \"further_readings/further_readings.pdf\"\n          ],\n          \"to\": \"output/packet.pdf\"\n        }\n      ]\n    }\n  ]\n}\n```\n\n#### 05.01 The `context` object\n\nThe `context` object contains variable assignments used to fill in Jinja placeholders.\n\n```json\n\"context\": {\n  \"program_long_name\": \"Intro Fellowship\",\n  \"time_period\": \"Spring 2025\",\n  \"chron_info\": \"WEEK 0\",\n  \"title\": \"Introduction to machine learning\",\n  \"subtitle\": \"READINGS\",\n  \"primary_color\": \"0B0D63\",\n  \"primary_color_faded\": \"789BD6\",\n  // ...\n}\n```\n\n#### 05.02 The `pipelines` list\n\nThe `pipelines` list contains sequential steps. Each `pipeline` requires and is referred to by an `id` key\n\n```json\n\"pipelines\": [\n  {\n    // Required ID to refer to the pipeline\n    \"id\": \"reading-packet\",\n    // Optional description\n    \"description\": \"Create the full reading packet.\",\n    // Steps that define the pipeline operations\n    \"steps\": [\n      {\n        \"name\": \"Render cover page\",\n        \"from\": \"cover/cover.jinja.tex\",\n        \"to\": \"cover/cover.pdf\"\n      },\n      //... More pipeline steps ...,\n      {\n        \"name\": \"Combine all readings into packet.pdf\",\n        \"combine\": [\n          \"cover/cover.pdf\",\n          \"device_readings/device_readings.pdf\",\n          \"further_readings/further_readings.pdf\"\n        ],\n        \"to\": \"output/packet.pdf\"\n      }\n    ]\n  }\n]\n```\n\nAdditionally, `pipelines` defines a single `pipeline`: a sequential set of steps to perform for some operation. Running `gatpack compose` in the same directory as your `compose.gatpack.json` file will show all available pipelines.\n\nEach step in a pipeline must contain a `name` key. The only two operations supported in steps now are: `gatpack infer` and `gatpack combine`\n\n```json\n// Gatpack Infer Example Step\n{\n  \"name\": \"Render cover page\",\n  // File to convert (*.tex or *.jinja.tex file)\n  \"from\": \"cover/cover.jinja.tex\",\n  // File to save to\n  \"to\": \"cover/cover.pdf\"\n}\n```\n\n```json\n// Gatpack Combine Example Step\n{\n  \"name\": \"Combine all readings into packet.pdf\",\n  // List of PDFs to combine\n  \"combine\": [\n    \"cover/cover.pdf\",\n    \"device_readings/device_readings.pdf\",\n    \"further_readings/further_readings.pdf\"\n  ],\n  // Location to save combined PDF to\n  \"to\": \"output/packet.pdf\"\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgatlenculp%2Fgatpack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgatlenculp%2Fgatpack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgatlenculp%2Fgatpack/lists"}