{"id":51368321,"url":"https://github.com/jmagly/pagenary","last_synced_at":"2026-07-03T04:00:43.616Z","repository":{"id":360374326,"uuid":"1064372825","full_name":"jmagly/pagenary","owner":"jmagly","description":"Multi-tenant documentation publishing platform — turn one shared template catalog into many branded, zero-dependency static documentation sites.","archived":false,"fork":false,"pushed_at":"2026-07-03T02:11:10.000Z","size":2513,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-03T04:00:18.505Z","etag":null,"topics":["docs-as-code","documentation","documentation-generator","documentation-tool","markdown","monorepo","multi-tenant","single-page-app","ssg","static-site","static-site-generator","white-label"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/@pagenary/publisher","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmagly.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing/releasing.md","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-09-26T00:09:34.000Z","updated_at":"2026-07-03T02:10:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jmagly/pagenary","commit_stats":null,"previous_names":["jmagly/pagenary"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/jmagly/pagenary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmagly%2Fpagenary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmagly%2Fpagenary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmagly%2Fpagenary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmagly%2Fpagenary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmagly","download_url":"https://codeload.github.com/jmagly/pagenary/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmagly%2Fpagenary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35071462,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["docs-as-code","documentation","documentation-generator","documentation-tool","markdown","monorepo","multi-tenant","single-page-app","ssg","static-site","static-site-generator","white-label"],"created_at":"2026-07-03T04:00:19.728Z","updated_at":"2026-07-03T04:00:43.597Z","avatar_url":"https://github.com/jmagly.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Pagenary\n\n**Where documentation takes shape.**\n\nPagenary turns a folder of Markdown in a git repo into a fast, searchable, SEO-ready documentation site you host yourself — for next to nothing. Write your docs, run one tool, and deploy the static output to any free static host (GitHub/Gitea Pages, Netlify, Cloudflare Pages, S3, a CDN, or your own box). No server, no database, no monthly SaaS bill — just the things you'd expect from a paid docs platform: command-palette search with ranking, theming and branding, Mermaid diagrams, syntax highlighting, SEO, and one-click export.\n\nIt's a great fit if you're shipping a project, an app, or a side project and want real docs without the overhead. And when you outgrow one site, the same tool publishes many from a shared template catalog — so it scales from a weekend project to a multi-product portal without changing tools.\n\nBuilt with [AIWG](https://aiwg.io), the multi-agent AI framework used to plan,\naudit, and ship this project.\n\n```bash\nnpm install --save-dev @pagenary/publisher   # add Pagenary to your project\nnpx pagenary build my-docs           # build your docs tenant\nnpx pagenary serve                           # serve on http://localhost:5173\n```\n\n[![npm version](https://img.shields.io/npm/v/@pagenary/publisher?label=npm\u0026color=CB3837\u0026logo=npm\u0026style=flat-square)](https://www.npmjs.com/package/@pagenary/publisher)\n[![npm downloads](https://img.shields.io/npm/dm/@pagenary/publisher?color=CB3837\u0026logo=npm\u0026style=flat-square)](https://www.npmjs.com/package/@pagenary/publisher)\n[![Docs](https://img.shields.io/badge/docs-docs.pagenary.com-22d3ee?style=flat-square\u0026logo=readthedocs\u0026logoColor=white)](https://docs.pagenary.com)\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg?style=flat-square)](LICENSE)\n[![Node Version](https://img.shields.io/badge/node-%E2%89%A516.0.0-brightgreen?style=flat-square\u0026logo=node.js)](https://nodejs.org)\n[![Search: @fortemi/core](https://img.shields.io/npm/v/@fortemi/core?label=search%20%C2%B7%20%40fortemi%2Fcore\u0026color=CB3837\u0026logo=npm\u0026style=flat-square)](https://www.npmjs.com/package/@fortemi/core)\n[![Built with AIWG](https://img.shields.io/npm/v/aiwg?label=built%20with%20%C2%B7%20aiwg\u0026color=7c3aed\u0026logo=npm\u0026style=flat-square)](https://www.npmjs.com/package/aiwg)\n\n[**Docs Site**](https://docs.pagenary.com) · [**Quick Start**](#quick-start) · [**Features**](#features) · [**Architecture**](#architecture) · [**Documentation**](#documentation)\n\n\u003c/div\u003e\n\n---\n\n## What Pagenary Is\n\nPagenary is a static site generator for documentation. The core application is the **publisher** (`apps/publisher/`): point it at your content (Markdown, HTML, or JS) plus a small config file, and it produces a self-contained docs site with search, navigation, theming, and SEO built in. The same engine scales to many sites through a shared template/tenant model, so one repository can publish anywhere from a single site to a dozen.\n\nEach published bundle is a static single-page app — hash-based routing (`#/page-id`), no server-side rendering, no runtime dependencies. You build it once and host the output anywhere that serves files. Asset and module URLs resolve through a per-tenant `\u003cbase\u003e`, so the same bundle works whether a tenant is served at its own domain root **or** mounted under a subpath of a shared host. Tenants share the template catalog but keep isolated content, branding, navigation, and domains, so a single repository can publish a dozen distinct documentation sites — each with real ranked search and SEO-ready output, not just static pages.\n\n## Building Blocks\n\nPagenary is composed from a small set of plain inputs:\n\n- **Templates** — the shared section catalog (`welcome`, `guide`, `reference`, `tutorial`, …) that defines how each page type renders\n- **Tenants** — a named publication with its own content, branding, and navigation, defined under `tenants/\u003ctenant-id\u003e/`\n- **Content** — Markdown (`.md`), HTML (`.html`), or JS modules (`.js`) that supply each tenant's pages\n- **Manifests** — per-tenant navigation structure and section metadata\n- **Overrides** — post-build file replacements for tenant-specific customization\n\nNothing is bundled at runtime. The build resolves templates + content + config into static `dist/\u003ctenant-id\u003e/` output the browser reads directly.\n\n## Why It Compounds\n\nThe leverage comes from the template/tenant split:\n\n- One template improvement (better search, a new page category, an accessibility fix) propagates to **every tenant** on the next build.\n- One tenant is a thin layer — content, a config file, a manifest — over the shared catalog, so standing up a new branded site is cheap.\n- Branding, theming, and navigation are **data, not code**: a tenant changes its look through `config.json`, not by forking the generator.\n- Builds are **Git-aware and incremental**, so a large multi-tenant repository rebuilds only what changed.\n\nThe result is that the marginal cost of an additional documentation site trends toward the cost of its content alone.\n\n## What Pagenary Is Not\n\n- **Not a hosted service.** Pagenary produces static files. You own hosting — any static host, CDN, or the bundled Caddy setup works.\n- **Not a runtime framework.** The published output has zero runtime dependencies. There is no server to run and nothing to import into a consuming app.\n- **Not a headless CMS.** Content lives as files (Markdown/HTML/JS) in the repository, versioned with everything else — not in a database behind an API.\n\n## Who It's For\n\nDevelopers and app makers who want real documentation for a project without standing up — or paying for — a hosted docs platform: solo devs, indie hackers, and small teams shipping fast. You get a searchable, SEO-ready site from a git repo and a free static host.\n\nIt scales up cleanly, too: teams publishing **many** sites from shared conventions — white-label SaaS docs, multi-product portals, agency-managed client docs — use the same template/tenant model to keep them consistent without maintaining each one by hand.\n\n---\n\n## What Problems Does Pagenary Solve?\n\nMaintaining several documentation sites by hand has three recurring failure modes:\n\n### 1. Drift Between Sites\n\nEach site is edited independently, so structure, navigation, and styling diverge over time. A fix applied to one portal never reaches the others.\n\n**Without Pagenary**: Every site is a snowflake. Consistency is a manual, never-finished chore.\n\n**With Pagenary**: All tenants render from one template catalog. A structural or visual change is made once and rebuilt into every bundle.\n\n### 2. Branding Coupled to Code\n\nCustomizing a site's look means forking the generator or hand-editing output, which makes upgrades painful.\n\n**Without Pagenary**: Branding changes require touching build logic; tenant-specific tweaks accumulate as un-mergeable forks.\n\n**With Pagenary**: Branding is per-tenant configuration (`config.json` — colors, brand marks, typography) plus optional `overrides/`. The generator stays shared and upgradable.\n\n### 3. Slow, Full Rebuilds\n\nRegenerating every site on every change wastes time as the number of tenants grows.\n\n**Without Pagenary**: Build time scales with the whole repository, not the change.\n\n**With Pagenary**: Git-aware incremental builds (`build:incremental`, `build:diff`) rebuild only the tenants and pages affected by a change.\n\n---\n\n## Core Concepts\n\n### 1. Multi-Tenant Model\n\nEach tenant is defined in `tenants/\u003ctenant-id\u003e/` with a `manifest.json` (navigation overrides), a `content/` directory, and optional `overrides/`. The build emits an isolated `dist/\u003ctenant-id\u003e/` bundle with its own `manifest.js` and `sections/`.\n\n### 2. Template Catalog\n\n`src/sections/section-templates.js` is the shared catalog. Categories (welcome, guide, reference, tutorial, …) define rendering for each page type, so all tenants inherit consistent page structure.\n\n### 3. Hash-Based SPA Routing\n\nPublished bundles are single-page apps. All navigation runs client-side through `app.js` via `#/page-id` routes — no server-side rendering, deployable as plain files.\n\n### 4. Content Types\n\nTenant content can be Markdown (converted to HTML by a lightweight parser), HTML (wrapped and shipped as-is), or JS modules (copied unchanged; must export `load()` returning `{ html, afterRender? }`).\n\n### 5. Theming \u0026 Branding\n\nPer-tenant `config.json` controls title, brand marks, tagline, accent and surface colors, and typography. Branding is data the build applies, never a fork of the generator.\n\n### 6. Git-Aware Builds\n\nThe build pipeline tracks changes against Git to support incremental and diff-only rebuilds, keeping large multi-tenant repositories fast to publish.\n\n---\n\n## When to Use Pagenary (and When Not To)\n\n### Good Fit\n\nShipping a project or app and wanting polished, searchable docs you host yourself for ~free — no SaaS subscription, no server to run, just a git repo and a static host. It's equally at home publishing **many** sites that share structure but differ in content and branding (white-label docs, multi-product portals, agency/client documentation). Especially strong when you want **real in-page search** and **clean SEO** out of the box, with flexible hosting: a site on its own domain, or many mounted under subpaths of a single host (e.g. `docs.example.com/product-a/`, `/product-b/`).\n\n### Not the Best Fit\n\nContent that must be edited by non-technical authors through a web UI (you write Markdown/HTML/JS in the repo, not in a CMS), or a site that genuinely needs server-side rendering or dynamic, per-request content. Pagenary produces static files.\n\n### The Trade-off\n\nYour docs live as files in git, not in a hosted CMS behind a login. In return you get zero hosting cost, full version control, and no vendor lock-in — and the option to scale from one site to many on the same shared-catalog model, which is what keeps a fleet of sites from drifting apart.\n\n```\nTemplates + per-tenant content/config\n                │\n                ▼\n        apps/publisher (build)\n                │\n                ▼\n   dist/\u003ctenant-id\u003e/  ── static SPA bundle (hash routing, zero runtime deps)\n                │\n                ▼\n   Any static host / CDN / bundled Caddy\n```\n\n---\n\n## How It Works\n\n1. **Define a tenant** under `tenants/\u003ctenant-id\u003e/` with content, a manifest, and a branding config.\n2. **Build** with the publisher — templates from the shared catalog are merged with the tenant's content and config.\n3. **Output** lands in `dist/\u003ctenant-id\u003e/` as a self-contained static SPA with a tenant-specific `manifest.js` and `sections/`.\n4. **Serve** the bundle from any static host, or use the bundled Caddy setup for multi-tenant domain testing.\n\n## Features\n\n- **Multi-Tenant Architecture** — isolated content, branding, and configuration per tenant\n- **Zero Runtime Dependencies** — published output is vanilla HTML, CSS, and ES modules\n- **Fortemi-backed search + graph** — command palette (`Ctrl/Cmd+K`) ranks results with snippets over a static chunked index ([`@fortemi/core`](https://www.npmjs.com/package/@fortemi/core)), with lazy precache, infinite scroll, page metadata, and an inspectable Docs Map with weighted relationships — all client-side (no server, no WASM)\n- **SEO-first output** — metadata-driven page titles, a configurable no-JS root HTML fallback, crawlable `/pages/` static snapshots, and `sitemap.xml` / `robots.txt` / `llms.txt` / JSON-LD / Open Graph generated at build time\n- **Flexible hosting** — per-tenant `\u003cbase\u003e` resolution serves the same bundle at a domain root *or* under a subpath; any static host, CDN, or the bundled Caddy\n- **Mermaid Diagrams** — native flowcharts, sequence diagrams, and more\n- **Syntax Highlighting** — Prism.js integration for code blocks\n- **Theming** — per-tenant colors, branding, and typography\n- **Blog Layout** — a reading-first `layout: \"blog\"` family: chronological post index, hero post pages, post navigation, optional living scroll, and themeable like the docs layout\n- **Page Effects** — opt-in, accessible primitives: hero/banner (full-bleed, overlay, parallax, sticky, CTA band), reveal-on-scroll and staggered reveal, a reading-progress bar, living scroll, disclosure accordions, scroll-snap sections, scrollytelling, figure zoom, generalized parallax, and a quick-copy control on code blocks — authored by class, fenced HTML, or a declarative frontmatter block\n- **Navigation** — collapsible sidebar with configurable drawer modes (`overlay`/`push`/`instant`) and an opt-in on-this-page TOC (scroll-spy, prev/next) with selectable placement: a persistent nav-style list in the **right** gutter or **left** sidebar mirror, a bordered **top** block, or a pinnable/collapsible **rail** with a viewport-capped internal heading scroller\n- **Document Export** — compile the current page or whole site to the browser's print / Save-as-PDF dialog (no pop-up window); configurable per tenant\n- **Incremental Builds** — Git-aware builds for fast iteration\n\n## Quick Start\n\nPagenary is an npm package — **no clone required to use it**. New to Pagenary?\nThe **[Getting Started guide](apps/publisher/docs/GETTING-STARTED.md)** walks\nyou from zero to a published docs site step by step.\n\n### Use the published package (recommended)\n\n```bash\n# See the available commands\nnpx @pagenary/publisher --help\n\n# Add it to your project, then build and serve your docs\nnpm install --save-dev @pagenary/publisher\nnpx pagenary build my-docs    # build your tenant (see \"Creating Your First Tenant\")\nnpx pagenary serve                    # serve on http://localhost:5173\n```\n\n`pagenary` commands: `build`, `serve`, `tenants list`, `check`, `new` (run `pagenary --help` for the full list).\nExtra flags pass through to the underlying script (e.g.\n`pagenary build --incremental`). The published tarball also ships a\ncompiled reference site under `site/` — the Pagenary docs, built by Pagenary\nitself.\n\n### Build from source (contributors / modifying Pagenary)\n\nClone the repo only if you want to change the templates, hack on the generator,\nor develop Pagenary itself — not to *use* it:\n\n```bash\ngit clone https://github.com/jmagly/pagenary.git\ncd pagenary \u0026\u0026 npm run bootstrap\n\nnpm run publisher:build \u0026\u0026 npm run publisher:serve   # default bundle → http://localhost:5173\nnpm run publisher:build:tenants                      # all tenant bundles\n```\n\nThis project is developed with [AIWG](https://aiwg.io). On this host, the AIWG\nproject source is available at `~/dev/aiwg` for maintainers who want to inspect,\nbuild, or run the framework that supports Pagenary development.\n\n## Creating Your First Tenant\n\nWith `@pagenary/publisher` installed in your project (`npm install -D @pagenary/publisher`):\n\n1. **Register the tenant** in a `tenants.json` at your project root (validated by the bundled `tenants.schema.json`):\n```json\n{\n  \"tenants\": [\n    {\n      \"id\": \"my-docs\",\n      \"source\": { \"type\": \"local\", \"path\": \"./docs\" },\n      \"strictLinks\": true\n    }\n  ]\n}\n```\n\n2. **Add your content** under the source path:\n```\ndocs/\n├── config.json          # branding and theme\n├── manifest.json        # navigation structure (optional)\n└── content/\n    ├── welcome.md       # Markdown content\n    ├── guide.html       # HTML content\n    └── dashboard.js     # dynamic JS modules\n```\n\n3. **Configure branding** in `config.json`:\n```json\n{\n  \"title\": \"My Documentation\",\n  \"brandMark\": \"ACME\",\n  \"brandSub\": \"Docs\",\n  \"tagline\": \"Your tagline here\",\n  \"accentColor\": \"#6366F1\",\n  \"surfaceColor\": \"#F7FAFC\"\n}\n```\n\n4. **Build and preview**:\n```bash\nnpx pagenary build my-docs\nnpx pagenary serve\n# Visit http://localhost:5173/my-docs/\n```\n\n\u003e Building Pagenary from source instead? Use `npm run publisher:build:tenants my-docs`\n\u003e and register tenants in `apps/publisher/tenants.json`.\n\n## Architecture\n\n**Static SPA pattern**: hash-based routing (`#/page-id`), no server-side rendering. All navigation runs through `app.js`; all styling lives in a single `styles.css`.\n\n**Key files**:\n\n- `src/manifest.js` — navigation structure and section metadata\n- `src/sections/section-templates.js` — template catalog with category-based rendering\n- `src/app.js` — router, command palette, and export logic\n- `scripts/build-tenants.js` — multi-tenant bundle generation\n\n**Repository layout**:\n\n```\npagenary/\n├── apps/\n│   └── publisher/           # Static site generator\n│       ├── src/             # SPA shell and templates\n│       ├── scripts/         # Build, serve, and utility scripts\n│       ├── tenants/         # Built-in example tenants\n│       ├── docs/            # Developer documentation\n│       └── dist/            # Build output\n├── package.json             # Workspace orchestration\n└── README.md\n```\n\n## Common Commands\n\n**Using the installed package** (the default — `npx pagenary \u003ccommand\u003e`):\n\n```bash\nnpx pagenary build              # build the default bundle to dist/\nnpx pagenary build [id]         # build a tenant; --all builds all enabled tenants\nnpx pagenary tenants list       # list configured tenants\nnpx pagenary serve              # serve dist/ on localhost:5173\n```\n\n**From source** (after cloning — for contributors / Pagenary development):\n\n```bash\nnpm run bootstrap               # install all workspace dependencies\nnpm run publisher:build         # build default bundle\nnpm run publisher:build:tenants # build all tenant bundles\nnpm run publisher:serve         # serve dist/ on localhost:5173\n\n# from apps/publisher/:\nnpm run dev                     # build + serve with watch\nnpm run build:incremental [id]  # Git-aware incremental build\nnpm run caddy:up                # start multi-tenant Caddy server\nnpm test                        # run test suite\n```\n\n## Configuration \u0026 Customization\n\n- **Tenant registration** — a `tenants.json` at your project root (or `apps/publisher/tenants.json` when building from source), validated by `tenants.schema.json`\n- **Branding \u0026 theme** — per-tenant `config.json` (title, brand marks, tagline, colors, typography)\n- **Navigation** — per-tenant `manifest.json` overrides the shared structure\n- **Post-build overrides** — drop replacements in a tenant's `overrides/` directory\n- **Multi-tenant domains** — the bundled `Caddyfile` + `docker-compose.yml` serve tenants by domain for local testing (`npm run caddy:up`)\n\n## Documentation\n\nThe full documentation site is published at **[docs.pagenary.com](https://docs.pagenary.com)** — built by Pagenary from the source files below (Pagenary dogfooding its own publisher). Read it online, or browse the source:\n\n- [Getting Started](apps/publisher/docs/GETTING-STARTED.md) — **start here**: zero to a published docs site using the npm package\n- [Publisher README](apps/publisher/README.md) — full feature documentation\n- [Quick Start Guide](apps/publisher/docs/QUICKSTART.md) — step-by-step tenant setup\n- [Publish with GitHub/Gitea Actions](apps/publisher/docs/PUBLISHING.md) — make any docs repo Pagenary-ready: copy-paste CI workflows + auto-discovery (no manifest required)\n- [Tenant Configuration](apps/publisher/docs/TENANT-CONFIG.md) — all config options\n- [Theming Recipes](apps/publisher/docs/THEMING-RECIPES.md) — copy-paste recipes for colors, fonts, and nav positions, with screenshots\n- [Architecture](apps/publisher/docs/ARCHITECTURE.md) — system design\n- [API Reference](apps/publisher/docs/API.md) — module documentation\n- [Deployment](apps/publisher/docs/DEPLOYMENT.md) — hosting patterns\n- [Releasing](docs/contributing/releasing.md) — CalVer release + npm publish flow\n\n---\n\n## Contributing\n\nContributions are welcome.\n\n- Found a bug or have a request? [Open an issue](https://github.com/jmagly/pagenary/issues/new)\n- Improving a template benefits every tenant — changes to `src/sections/` are high-leverage\n- Run `npm test` (from `apps/publisher/`) before opening a PR\n- Releases follow CalVer (`YYYY.M.PATCH`); see [docs/contributing/releasing.md](docs/contributing/releasing.md)\n\n---\n\n## Community \u0026 Support\n\n- **Issues:** [GitHub Issues](https://github.com/jmagly/pagenary/issues)\n- **Discussions:** [GitHub Discussions](https://github.com/jmagly/pagenary/discussions)\n\n---\n\n## License\n\n**GNU Affero General Public License v3.0** — strong copyleft. You may use, modify, and distribute Pagenary, but if you run a modified version to provide a network service, you must make the modified source available to its users. See [LICENSE](LICENSE).\n\n---\n\n## Acknowledgments\n\nBuilt with vanilla web standards and a small set of best-in-class libraries — [Mermaid](https://mermaid.js.org/) for diagrams and [Prism.js](https://prismjs.com/) for syntax highlighting — kept out of the runtime bundle wherever possible.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**[Back to Top](#pagenary)**\n\nMade with care by [Joseph Magly](https://github.com/jmagly)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmagly%2Fpagenary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmagly%2Fpagenary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmagly%2Fpagenary/lists"}