{"id":16338135,"url":"https://github.com/srid/feather","last_synced_at":"2025-10-25T23:31:42.852Z","repository":{"id":53376198,"uuid":"352120642","full_name":"srid/Feather","owner":"srid","description":"[Paused] Static site generator with customizable pipeline and live-reload","archived":false,"fork":false,"pushed_at":"2021-06-02T23:13:51.000Z","size":91,"stargazers_count":5,"open_issues_count":4,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-31T12:04:54.118Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"F#","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/srid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-27T16:25:14.000Z","updated_at":"2022-05-02T08:51:23.000Z","dependencies_parsed_at":"2022-09-11T16:52:03.463Z","dependency_job_id":null,"html_url":"https://github.com/srid/Feather","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/srid%2FFeather","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srid%2FFeather/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srid%2FFeather/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srid%2FFeather/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srid","download_url":"https://codeload.github.com/srid/Feather/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238229940,"owners_count":19437723,"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":[],"created_at":"2024-10-10T23:49:44.378Z","updated_at":"2025-10-25T23:31:37.598Z","avatar_url":"https://github.com/srid.png","language":"F#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg width=\"10%\" src=\"./feather-logo.svg\"\u003e\n\n# Feather\n\n**NOTE**: Feather development has ceased, superceded by [Ema](https://ema.srid.ca/) in Haskell, as well as [Emanote](https://github.com/srid/emanote).\n\nFeather is a work-in-progress **static site generator \u0026 previewer** with customizable pipeline and live-reload. It is currently in research \u0026 prototype phase, to explore the possibility of two related but very different use-cases:\n\n1. Generate simple static sites\n2. Generate complex static sites built off varied data that change over time (eg: Markdown files, as done by [Neuron Zettelkasten](https://neuron.zettel.page/))\n\nFeather, taking inspiration from the likes of [Sveltekit](https://kit.svelte.dev/) (which uses [Vite](https://vitejs.dev/)), also aims to provide a live-reload approach to instantly previewing the site while its source files are being modified, but without the \"taint\" of bringing in JavaScript. \n\n## Technology\n\n**F#** is used for a number of reasons, but primarily because the author is currently [invested in learning](https://srid.github.io/learning-fsharp/) it.\n\nFor **HTML templating** we choose Shopify's [Liquid](https://shopify.dev/docs/themes/liquid/reference) language (using [fluid](https://github.com/sebastienros/fluid)).\n\nFor building **reactive pipelines** we choose [Rx](https://dotnetfoundation.org/projects/reactive-extensions) along with possibly [Dynamic Data](https://github.com/reactivemarbles/DynamicData).\n\n## Milestones\n\nThe first priority is to get a non-pipeline based (i.e one-off) static site generation working off Liquid files. Then, live-reload is an option (a builtin version of [LiveReloadServer](https://github.com/RickStrahl/LiveReloadServer) basically). Finally exploring the reactive pipeline approach to achieve a neuron-like use case *in a more general fashion* would be an ambitious undertaking, and the ultimate purpose of this project.\n\n## Other considerations\n\n- **i18n**: The generated websites should support multiple languages. The \"content\" would thus be specified as input for the templates, rathar than being hardcoded in the HTML tags. This would allow us to specify translated versions with their own routes (eg: `/en/slug1` vs `/fr/slug1`).\n- **client-side search**: If, as detailed above, \"content\" is treated as *data* rather than *markup*, we can use [Elasticlunr.js](http://elasticlunr.com/) to provide a client-side search of these data documents.\n- **tool compilation**: For eg, to build CSS. The initial milestones will have support for [Tailwind](https://tailwindcss.com/) CSS styling, albeit using [twind/shim](https://twind.dev/docs/handbook/getting-started/using-the-shim.html) to (lazily) begin with.\n\n---\n\n## Hacking\n\n```shell\ndotnet tool restore\ndotnet paket restore\n\ndotnet run -p ./src/Feather -- -w -C example\n```\n\nThe above command will launch a live server that reloads the browser view as your source files change.\n\nYou can use `dotnet watch` (instead of `dotnet run`) to recompile and restart the tool on source change.\n\n```\ndotnet watch -p ./src/Feather run -- -w -C ../../example\n```\n\n## Installing and use\n\nTo build and install the release version,\n\n```\ncd ./src/Feather\ndotnet publish -c Release --self-contained -r linux-x64 -o out\nexport FEATHER=$(pwd)/out/Feather\n...\n```\n\nUse it,\n\n```\nmkdir my-site \u0026\u0026 cd my-site\nmkdir templates output\necho Hello world \u003e templates/index.liquid\n$FEATHER -w .\n```\n\n**Fastest way** to get feather running is to use the released version from NuGet (which may lag behind):\n\n```\n# Copy the .fsx script to your site dir as appropriate. To test,\n./example/example.fsx -C example/\n```\n\n## Status\n\n- [x] One-off generation of `.html` from `.liquid` files (see `./example` folder)\n- [x] Primitive file watcher that regenerates on source change\n- [x] Tailwind CSS support in .liquid files (via `twind/shim`)\n- [x] Finalize on a HTML template library ([#1](https://github.com/srid/Feather/issues/1))\n- [x] Add a dev server with live-reload\n- [ ] static/ files\n- [ ] Deploy something useful\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrid%2Ffeather","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrid%2Ffeather","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrid%2Ffeather/lists"}