{"id":13514553,"url":"https://github.com/bcomnes/deploy-to-neocities","last_synced_at":"2025-05-16T03:01:54.896Z","repository":{"id":36046944,"uuid":"221075328","full_name":"bcomnes/deploy-to-neocities","owner":"bcomnes","description":"🐈 Github Action to deploy a folder to Neocities","archived":false,"fork":false,"pushed_at":"2025-05-06T00:02:13.000Z","size":6086,"stargazers_count":231,"open_issues_count":4,"forks_count":17,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-06T18:51:18.325Z","etag":null,"topics":["actions","css","deployment","github-actions","html","neocities","publishing","static-site"],"latest_commit_sha":null,"homepage":"https://github.com/marketplace/actions/deploy-to-neocities","language":"JavaScript","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/bcomnes.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["bcomnes"],"custom":["https://bret.io","https://neocities.org/donate"]}},"created_at":"2019-11-11T21:41:38.000Z","updated_at":"2025-05-06T00:02:16.000Z","dependencies_parsed_at":"2023-02-13T01:31:30.332Z","dependency_job_id":"73e87adf-f752-4337-8146-4315a1da9f22","html_url":"https://github.com/bcomnes/deploy-to-neocities","commit_stats":{"total_commits":334,"total_committers":22,"mean_commits":"15.181818181818182","dds":0.5419161676646707,"last_synced_commit":"f9a550fd471327a444d246b87c1ef045ea7a8750"},"previous_names":[],"tags_count":59,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcomnes%2Fdeploy-to-neocities","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcomnes%2Fdeploy-to-neocities/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcomnes%2Fdeploy-to-neocities/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcomnes%2Fdeploy-to-neocities/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bcomnes","download_url":"https://codeload.github.com/bcomnes/deploy-to-neocities/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254459077,"owners_count":22074604,"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":["actions","css","deployment","github-actions","html","neocities","publishing","static-site"],"created_at":"2024-08-01T05:00:57.715Z","updated_at":"2025-05-16T03:01:54.801Z","avatar_url":"https://github.com/bcomnes.png","language":"JavaScript","funding_links":["https://github.com/sponsors/bcomnes","https://bret.io","https://neocities.org/donate"],"categories":["JavaScript","Tools"],"sub_categories":[],"readme":"# deploy-to-neocities\n\n[![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/bcomnes/deploy-to-neocities)](https://github.com/bcomnes/deploy-to-neocities)\n[![Actions Status](https://github.com/bcomnes/deploy-to-neocities/workflows/tests/badge.svg)](https://github.com/bcomnes/deploy-to-neocities/actions)\n![Deploy to neocities](https://github.com/bcomnes/deploy-to-neocities/workflows/Deploy%20to%20neocities/badge.svg)\n[![Marketplace link](https://img.shields.io/badge/github%20marketplace-deploy--to--neocities-brightgreen)](https://github.com/marketplace/actions/deploy-to-neocities)\n[![Neocities][neocities-img]](https://deploy-to-neocities.neocities.org)\n\n\u003ccenter\u003e\u003cimg src=\"static/logo.png\"\u003e\u003c/center\u003e\n\nEfficiently deploy a website to [Neocities][nc] using [Github actions](https://github.com/features/actions).  Uses content aware diffing to only update files that changed.\n\nAlternatively, you can use the bin helper in [async-neocities](https://github.com/bcomnes/async-neocities) to deploy to neocities locally from your own machine as well as in CI.\n\n## Usage\n\n```yaml\nname: Deploy to neocities\n\n# only run on changes to main. Use main or master depending on whatever your default branch is called.\non:\n  push:\n    branches:\n      - main\n\nconcurrency: # prevent concurrent deploys doing strange things\n  group: deploy-to-neocities\n  cancel-in-progress: true\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n\n    steps:\n    # The checkout step copies your repo into the action runner. Important!\n    - uses: actions/checkout@v4\n    # Set up any tools and build steps here\n    # This example uses a Node.js toolchain to build a site\n    # If you don't need Node.js to build your site, you can omit this.\n    - name: Use Node.js\n      uses: actions/setup-node@v4\n      with:\n        node-version: lts/*\n    # If you have a different build process, replace this with your own build steps\n    - name: Install deps and build\n      run: |\n        npm i\n        npm run build\n    # When the dist_dir is ready, deploy it to neocities\n    # Here we deploy the folder named `public`\n    - name: Deploy to neocities\n      uses: bcomnes/deploy-to-neocities@v3\n      with:\n        api_key: ${{ secrets.NEOCITIES_API_TOKEN }}\n        cleanup: false\n        neocities_supporter: false # set this to true if you have a supporter account and want to bypass unsuported files filter.\n        preview_before_deploy: true # print a deployment plan prior to waiting for files to upload.\n        dist_dir: public\n```\n\n- 💻 [Example YML](.github/workflows/neocities.yml)\n- 🌎 [Example Deploy](https://deploy-to-neocities.neocities.org)\n\nCreate a workflow `.yml` file in your repository's `.github/workflows` directory. An [example workflow](#example-workflow) is available above. For more information, reference the GitHub Help Documentation for [Creating a workflow file](https://help.github.com/en/articles/configuring-a-workflow#creating-a-workflow-file).\n\nYou'll need the API token for your site. Go to:\n\n```\nhttps://neocities.org/settings/{{your-sitename}}#api_key\n```\n\nRetreive your site's API token from Neocities. In your GitHub repository, set a [secret][sec] called `NEOCITIES_API_TOKEN`.  Set the `api_token` input on your `deploy-to-neocities` action to `${{ secrets.NEOCITIES_API_TOKEN }}` as in the example above. The setting (as of writing) lives in Repository \u003e Settings \u003e Security \u003e Secrets and Variables \u003e Actions \u003e Repository secrets.\n\nDuring your workflow, generate the files you want to deploy to [Neocities][nc] into a directory. Set this as the `dist_dir` directory in your workflow (the default is `public`).  You can use any tools to generate your site that can be installed or brought into the Github actions environment.\n\nOnce the build is complete, `deploy-to-neocities` will efficiently upload all new and all changed files to Neocities.  Any files on Neocities that don't exist in the `dist_dir` are considered 'orphaned' files.  To destructively remove these 'orphaned' files, set the `cleanup` input to `true`.\n\nYou most likely only want to run this on the `master` branch so that only changes committed to `master` result in website updates.  Running a test build that does not deploy on all branches and PRs can help catch changes that will break the build.\n\n### Inputs\n\n- `api_key` (**REQUIRED**): The API token for your [Neocities][nc] website to deploy to.\n- `dist_dir`: The directory to deploy to [Neocities][nc]. Default: `public`. Don't deploy your root repo directory (e.g. `./`). It contains `.git`, `.github` and other files that won't deploy properly to neocities. Keep it clean by keeping or building your site into a subdir and deploy that.\n- `neocities_supporter`: Set this to `true` if you have a paid neocities account and want to bypass the [unsupported files filter](https://neocities.org/site_files/allowed_types).\n- `cleanup`:  Boolean string (`true` or `false`).  If `true`, `deploy-to-neocities` will destructively delete files found on [Neocities][nc] not found in your `dist_dir`.  Default: `false`.\n- `preview_before_deploy`: Boolean string (`true` or `false`).  If `true`, `deploy-to-neocities` will print a preview of the files that will be uploaded and deleted.  Default: `true`.\n- `protected_files`: An optional glob string used to mark files as protected.  Protected files are never cleaned up.  Test this option out with `cleanup` set to false before relying on it.  Protected files are printed when `cleanup` is set to true or false.  Glob strings are processed by [minimatch](https://github.com/isaacs/minimatch) against remote neocities file paths.  Protected files can still be updated.\n\n### Outputs\n\nNone.\n\n## FAQ\n\n### Why should I deploy to Neocities?\n\n[Neocities][nc] offers a bunch of nice properties:\n\n- Neocities CDN uses a pure [anycast](https://en.wikipedia.org/wiki/Anycast) network providing efficient content serving no matter where your visitors are located around the world.\n- Anycast doesn't require special DNS records to achieve geolocation routing characteristics.  Simple `A` and `AAAA` records are all you need.  Bare names and all!\n- Neocities owns its own [ARIN](https://en.wikipedia.org/wiki/American_Registry_for_Internet_Numbers) IP block and has its own [BGP](https://en.wikipedia.org/wiki/Border_Gateway_Protocol) peering agreements, eliminating entire layers of bureaucracy between your content and the rest of the Internet typical of all major cloud providers.\n- Far faster cold cache access than other popular static hosting services.  Perfect for personal websites, projects and other infrequently accessed documents.\n- Simple and understandable feature set.  You can hand upload and edit files along side built/deployed assets.\n- First class IPv6 support.\n- Fun, friendly, creative and organic community with an [interesting social network](https://neocities.org/browse).\n- Independent, sustainable and altruistic service run by [@kyledrake](https://github.com/kyledrake/) and word on the street is that the service is profitable.\n- [Affordable and predictable pricing](https://neocities.org/supporter).  There is a generous free tier and you can get custom domains and additional sites for $5/mo.\n- Offers simple, Google-free site analytics.\n- Makes accepting tips a breeze.\n- Bring your own CI environment, or don't.\n- Free https via [Lets Encrypt](https://blog.neocities.org/blog/2016/11/10/switching-to-default-ssl.html).\n- Cute cat logo.\n- [Support the distributed web](https://neocities.org/distributed-web). Built in IPFS support.\n- [Beginner friendly docs](https://neocities.org/tutorials) for learning how to make your own websites.\n\n### What are some of the drawbacks compared to Netlify/Vercel?\n\n- Not appropriate for hyper traffic commercial sites most likely.\n- No concept of a Deploy or atomicity when changing files.\n- Most features of these services are not included. Neocities is just static file hosting and a few basic features around that.\n- Doesn't offer support.\n- No deploy previews.\n- No Github Deploys API support (yet).\n\n## Sites using deploy-to-neocities\n\n- https://github.com/bcomnes/bret.io ([bret.io](https://bret.io))\n- https://github.com/ecomnes/elenacomnes.com ([elenacomnes.comnes](https://elenacomnes.com))\n- https://github.com/gumcast/gumcast-client ([gumcast.com](https://gumcast.com))\n- https://github.com/bcomnes/deploy-to-neocities/blob/master/.github/workflows/neocities.yml ([deploy-to-neocities.neocities.org](https://deploy-to-neocities.neocities.org))\n- [Zambonifofex/stories](https://github.com/Zambonifofex/stories) ([zamstories.neocities.org](https://zamstories.neocities.org))\n- [Your Neofeed](https://github.com/victoriadrake/neocities-neofeed), (っ◔◡◔)っ a personal timeline for Neocities and GitHub Pages.\n- https://speakscribe.com\n- https://geno7.neocities.org\n- https://github.com/M1ssM0ss/deploy-to-neocities-template\n- https://nelson.neocities.org\n- https://flamedfury.com\n- https://keb.neocities.org\n- https://missmoss.neocities.org\n- https://rarebit.neocities.org\n- https://cavacado.neocities.org\n- https://wanderinginn.neocities.org\n- https://andri.dk/blog/2019/2021/deploy-static-websites-anywhere/\n- https://github.com/PersonMeetup/frontiercorps ([frontiercorps.neocities.org](https://frontiercorps.neocities.org/))\n- https://github.com/riastrad/cyberbspace ([cyberb.space](https://cyberb.space))\n- https://github.com/rogerahuntley/neocities-site ([stealdog.neocities.org](https://stealdog.neocities.org))\n- https://github.com/ConorSheehan1/conorsheehan1.neocities.org ([conorsheehan1.neocities.org](https://conorsheehan1.neocities.org))\n- https://github.com/bechnokid/neocities ([bechnokid.neocities.org](https://bechnokid.neocities.org))\n- https://github.com/lime360/website ([lime360.neocities.org](https://lime360.neocities.org))\n- https://obspogon.neocities.org/\n- https://profsugoi.neocities.org/\n- https://github.com/tencurse/neocities ([10kph.neocities.org](https://10kph.neocities.org/))\n- https://github.com/alephdfilms/neocities/ ([alephd.neocities.org](https://alephd.neocities.org/)]\n- https://sacred.neocities.org/ (https://github.com/M-Valentino/sacredOS)\n- https://lenp.net/ (https://github.com/Len42/web-site)\n- \u003chttps://punkfairie.net\u003e (\u003chttps://github.com/punkfairie/punkfairie-site\u003e)\n- https://github.com/jefbecker/jefbecker.com ([jefbecker.com](https://jefbecker.com))\n- [See more!](https://github.com/bcomnes/deploy-to-neocities/network/dependents)\n- ...PR your site when you set it up!\n\n## See also\n\n- [async-neocities](https://ghub.io/async-neocities): diffing engine used for action.\n- [Neocities API Docs](https://neocities.org/api)\n- [neocities/neocities-node](https://github.com/neocities/neocities-node): Official Node API\n- [jonchang/deploy-neocities](https://github.com/jonchang/deploy-neocities): An alternative docker + official ruby client based action similar to this one.\n- [M1ssM0ss/deploy-to-neocities-template](https://github.com/M1ssM0ss/deploy-to-neocities-template): a template repo ready for cloning using deploy-to-neocities.\n- [professorsugoi/Deploy-Astro-Neocities](https://github.com/professorsugoi/Deploy-Astro-Neocities): a template repo for projets built with Astro. uses deploy-to-neocities.\n\n## CHANGELOG\n\nSee [changelog.md](CHANGELOG.md)\n\n[qs]: https://ghub.io/qs\n[nf]: https://ghub.io/node-fetch\n[fd]: https://ghub.io/form-data\n[nc]: https://neocities.org\n[sec]: https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets\n[neocities-img]: https://img.shields.io/website/https/siteup.neocities.org?label=neocities\u0026logo=data:image/png;base64,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\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcomnes%2Fdeploy-to-neocities","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbcomnes%2Fdeploy-to-neocities","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcomnes%2Fdeploy-to-neocities/lists"}