{"id":13430773,"url":"https://github.com/tj/staticgen","last_synced_at":"2025-04-04T18:09:10.615Z","repository":{"id":47929609,"uuid":"212820779","full_name":"tj/staticgen","owner":"tj","description":"Static website generator that lets you use HTTP servers and frameworks you already know","archived":false,"fork":false,"pushed_at":"2022-12-11T17:06:14.000Z","size":54,"stargazers_count":720,"open_issues_count":14,"forks_count":12,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-28T17:10:02.330Z","etag":null,"topics":["static","static-site","static-site-generator"],"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/tj.png","metadata":{"files":{"readme":"Readme.md","changelog":"History.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"tj"}},"created_at":"2019-10-04T13:26:05.000Z","updated_at":"2025-03-23T05:42:36.000Z","dependencies_parsed_at":"2023-01-27T03:30:40.437Z","dependency_job_id":null,"html_url":"https://github.com/tj/staticgen","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tj%2Fstaticgen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tj%2Fstaticgen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tj%2Fstaticgen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tj%2Fstaticgen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tj","download_url":"https://codeload.github.com/tj/staticgen/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247226215,"owners_count":20904465,"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":["static","static-site","static-site-generator"],"created_at":"2024-07-31T02:00:57.619Z","updated_at":"2025-04-04T18:09:10.591Z","avatar_url":"https://github.com/tj.png","language":"Go","readme":"# Staticgen\n\nA static website generator that lets you use HTTP servers and frameworks you already know. Just tell Staticgen how to start your server, then watch it crawl your site and generate a static version with all of the pages and assets required.\n\n## About\n\nIf you're unfamiliar, you can actually use the decades-old [wget command](https://apex.sh/blog/post/pre-render-wget/) to output a static website from a dynamic one, this project is purpose-built for the same idea, letting your team to use whatever HTTP servers and frameworks you're already familiar with, in any language.\n\nI haven't done any scientific benchmarks or comparisons yet, but here are some results on my 2014 8-core MBP:\n\n- Compiles 3,296 pages of the [Signal v. Noise](https://m.signalvnoise.com/) blog in 1 second\n- Compiles my [Apex Software](https://apex.sh/) site in 150ms\n\n## Installation\n\nVia [gobinaries.com](https://gobinaries.com):\n\n```sh\n$ curl -sf https://gobinaries.com/tj/staticgen/cmd/staticgen | sh\n```\n\n## Configuration\n\nConfiguration is stored within a `./static.json` file in your project's root directory. The following options are available:\n\n- __command__ — The server command executed before crawling.\n- __url__ — The target website to crawl. Defaults to `\"http://127.0.0.1:3000\"`.\n- __dir__ —  The static website output directory. Defaults to `\"build\"`.\n- __pages__ —  A list of paths added to crawl, typically including unlinked pages such as landing pages. Defaults to `[]`.\n- __concurrency__ — The number of concurrent pages to crawl. Defaults to `30`.\n\n## Guide\n\nFirst create the `./static.json` configuration file, for example here's the config for Go server, the only required property is `command`:\n\n```json\n{\n  \"command\": \"go run main.go\",\n  \"concurrency\": 50,\n  \"dir\": \"dist\"\n}\n```\n\nBelow is an example of a Node.js server, note that `NODE_ENV` is assigned to production so that optimizations such as Express template caches are used to improve serving performance.\n\n```json\n{\n  \"command\": \"NODE_ENV=production node server.js\"\n}\n```\n\nRun the `staticgen` command to start the pre-rendering process:\n\n```\n$ staticgen\n```\n\nStaticgen executes the `command` you provided, waits for the server to become available on the `url` configured. The pages and assets are copied to the `dir` configured and then your server is shut down.\n\nBy default the timeout for the generation process is 15 minutes, depending on your situation you may want to increase or decrease this with the `-t, --timeout` flag, here are some examples:\n\n```\n$ staticgen -t 30s\n$ staticgen -t 15m\n$ staticgen -t 1h\n```\n\nWhen launching the `command`, Staticgen sets the `STATICGEN` environment variable to `1`, allowing you to alter behaviour if necessary.\n\nTo view the pre-rendered site run the following command to start a static file server and open the browser:\n\n```\n$ staticgen serve\n```\n\nSee the [examples](./_examples) directory for full examples.\n\n## Notes\n\nStaticgen does not pre-render using a headless browser, this makes it faster, however it means that you cannot rely on client-side JavaScript manipulating the page.\n\n\n---\n\n[![GoDoc](https://godoc.org/github.com/tj/staticgen?status.svg)](https://godoc.org/github.com/tj/staticgen)\n![](https://img.shields.io/badge/license-MIT-blue.svg)\n![](https://img.shields.io/badge/status-stable-green.svg)\n\n## Sponsors\n\nThis project is sponsored by [CTO.ai](https://cto.ai/), making it easy for development teams to create and share workflow automations without leaving the command line.\n\n[![](https://apex-software.imgix.net/github/sponsors/cto.png)](https://cto.ai/)\n\nAnd my [GitHub sponsors](https://github.com/sponsors/tj):\n\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/0\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/0)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/1\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/1)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/2\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/2)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/3\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/3)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/4\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/4)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/5\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/5)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/6\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/6)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/7\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/7)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/8\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/8)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/9\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/9)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/10\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/10)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/11\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/11)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/12\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/12)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/13\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/13)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/14\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/14)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/15\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/15)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/16\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/16)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/17\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/17)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/18\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/18)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/19\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/19)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/20\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/20)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/21\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/21)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/22\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/22)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/23\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/23)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/24\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/24)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/25\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/25)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/26\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/26)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/27\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/27)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/28\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/28)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/29\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/29)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/30\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/30)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/31\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/31)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/32\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/32)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/33\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/33)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/34\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/34)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/35\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/35)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/36\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/36)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/37\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/37)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/38\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/38)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/39\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/39)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/40\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/40)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/41\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/41)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/42\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/42)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/43\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/43)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/44\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/44)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/45\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/45)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/46\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/46)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/47\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/47)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/48\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/48)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/49\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/49)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/50\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/50)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/51\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/51)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/52\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/52)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/53\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/53)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/54\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/54)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/55\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/55)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/56\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/56)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/57\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/57)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/58\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/58)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/59\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/59)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/60\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/60)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/61\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/61)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/62\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/62)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/63\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/63)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/64\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/64)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/65\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/65)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/66\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/66)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/67\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/67)\n[\u003cimg src=\"https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/avatar/68\" width=\"35\"\u003e](https://sponsors-api-u2fftug6kq-uc.a.run.app/sponsor/profile/68)\n\n","funding_links":["https://github.com/sponsors/tj"],"categories":["Go","static-site-generator"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftj%2Fstaticgen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftj%2Fstaticgen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftj%2Fstaticgen/lists"}