{"id":30593340,"url":"https://github.com/localnerve/jam-build","last_synced_at":"2026-04-05T02:00:53.659Z","repository":{"id":309604039,"uuid":"946357978","full_name":"localnerve/jam-build","owner":"localnerve","description":"A practical reference project for building PWAs; static/dynamic data, sw/offline first, vanillajs","archived":false,"fork":false,"pushed_at":"2026-03-30T14:21:55.000Z","size":17318,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-30T16:28:16.706Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","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/localnerve.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","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},"funding":{"github":"localnerve","custom":["https://www.paypal.com/ncp/payment/DHCB5GUYMGX5U","https://www.paypal.com/donate/?hosted_button_id=U98LEKAK7DXML"]}},"created_at":"2025-03-11T02:35:39.000Z","updated_at":"2026-02-18T22:04:48.000Z","dependencies_parsed_at":"2025-08-12T21:15:14.829Z","dependency_job_id":"171a4f92-083b-4c92-9e3d-bc46e3d909f4","html_url":"https://github.com/localnerve/jam-build","commit_stats":null,"previous_names":["localnerve/jam-build"],"tags_count":58,"template":false,"template_full_name":null,"purl":"pkg:github/localnerve/jam-build","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localnerve%2Fjam-build","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localnerve%2Fjam-build/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localnerve%2Fjam-build/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localnerve%2Fjam-build/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/localnerve","download_url":"https://codeload.github.com/localnerve/jam-build/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/localnerve%2Fjam-build/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31421869,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T00:25:07.052Z","status":"online","status_checked_at":"2026-04-05T02:00:05.211Z","response_time":75,"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":[],"created_at":"2025-08-29T18:13:15.544Z","updated_at":"2026-04-05T02:00:53.647Z","avatar_url":"https://github.com/localnerve.png","language":"JavaScript","funding_links":["https://github.com/sponsors/localnerve","https://www.paypal.com/ncp/payment/DHCB5GUYMGX5U","https://www.paypal.com/donate/?hosted_button_id=U98LEKAK7DXML"],"categories":[],"sub_categories":[],"readme":"# Jam Build\n\n\u003e A web application reference of a custom static site, but as a versionable, offline, service-worker MPA, with batching, multi-user OCC, RBAC authz, and data on top.\n\u003e\n\u003e Minimal, hand-crafted vanillajs by a human.\n\n## Quick Links\n\n* 🚀 [Getting Started](docs/localsetup.md)\n* 💡 [How This is Different](docs/how-different.md)\n* ⚡ [Static Site Generator](docs/static-site-generator.md)\n* 📊 [Data Store and Flow Architecture](docs/nanostores.md)\n* 📡 [Batch Update and Conflict Flow](docs/batch-updates.md)\n* ⏳ [Service Worker Timer Architecture](docs/heartbeat-timer.md)\n* 🧪 [Testing Procedure and Detail](docs/testing-documentation.md)\n* 🎭 [Performance Audits](docs/performance-audits.md)\n* 🔧 [Build Process Summary](docs/build.md)\n* ✨ [Command Reference](docs/commands.md)\n* 📈 [Project Stats Snapshots](docs/stats.md)\n* 🌱 [Analysis Artifacts](docs/analysis.md)\n\n\u003e A Go Fiber API with monitoring and multi-database support, as a drop-in replacement for the backend in this project, is available at [jam-build-propsdb](https://github.com/localnerve/jam-build-propsdb).\n\n## Project Summary\n\n### Overview\n\nThis project serves as a starting point for a PWA (Progressive Web Application). It builds a versionable, offline-first, multi-page JAM (JavaScript, APIs, Markup) web app with support for multi-user data.\n\n### Key Features\n\n* **Service Worker First:**\n  * The project design centers around a service worker, which is different from most web applications.\n\n* **Custom Sass/Handlebars Static Site Generator:** \n  * A multi-page application built using a custom static site generator that leverages Sass and Handlebars.\n  * Image processors generate metadata used to render preload tags and other performance-oriented styles and markup.\n    - Custom WASM image processor pipeline for performant optimization and `webp` format creation. Boosts build speed and reduces external toolchain dependencies. Eases application image maintenance, reduces image size.\n  * See the [static site generator document](docs/static-site-generator.md) for more detail.\n  * Static site only [branch](https://github.com/localnerve/jam-build/tree/front-only) (sans data layer) available.\n\n* **Offline Capabilities:**\n  * Pages are rendered directly from the service worker cache using a stale-while-revalidate strategy.\n  * Service worker manages offline data updates and reconciliation when the network is restored.\n\n* **Version Updates:** \n  * The service worker handles version updates and ensures that users receive the latest static pages and app versions.\n  * Supports versioned deployment for both front-end and back-end components.\n\n* **Service Worker Data Update Batching:**\n  * Data mutations are staged in IndexedDB and committed to the API in offline supported batch processes, optimized for resource usage.\n\n* **Optimistic Concurrency Control:**\n  * The service worker and data service handle multi-user optimistic concurrency control with three-way merge resolution.\n\n* **Role-Based Access Control:**\n  * Supports role-based access control for different user roles (e.g., user, admin).\n\n* **Reusable, General Data Design:**\n  * Features a reusable, general data design with application and user regions.\n\n* **Established Toolchain:**\n  * Uses a well-established toolchain with no magic (no hidden or complex processes) and minimal dependencies.\n\n## Technology Stack\n\n* Vanillajs, plain Javascript Object persistent nanostores\n\n### Runtime Dependencies\n\n* [Expressjs](https://expressjs.com)\n* [Workboxjs](https://developer.chrome.com/docs/workbox/)\n* [Authorizer](https://github.com/localnerve/authorizer)\n* [Mariadb](https://mariadb.com)\n\n### Development Dependencies\n\n* [Handlebars](https://handlebarsjs.com/guide/)\n* [Sass](https://sass-lang.com/documentation/)\n* [Playwright](https://playwright.dev)\n* [Gulp](https://gulpjs.com)\n* [Rollup](https://rollupjs.org/)\n* [Docker](https://docker.com)\n* [Localnerve](https://github.com/localnerve)\n\n## Donate\n\nIf this project is helpful or useful to you, please consider donating to help me create and maintain more great things.  \n[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/donate/?hosted_button_id=U98LEKAK7DXML)  \nI'm also available for [hire](https://www.localnerve.com/contact).\n\n## Author and License\n\nJam-build, a web application practical reference.  \nCopyright (c) 2025 Alex Grant \u003cinfo@localnerve.com\u003e (https://www.localnerve.com), LocalNerve LLC  \n\nJam-build is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jam-build is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [GNU Affero General Public License](LICENSE.md) for more details.  \nAdditional terms under GNU AGPL version 3 section 7:  \n  a) The reasonable legal notice of original copyright and author attribution must be preserved  \n     by including the string: \"Copyright (c) 2025 Alex Grant \u003cinfo@localnerve.com\u003e (https://www.localnerve.com), LocalNerve LLC\"  \n     in this material, copies, or source code of derived works.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flocalnerve%2Fjam-build","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flocalnerve%2Fjam-build","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flocalnerve%2Fjam-build/lists"}