{"id":232012,"name":"sitepipe","ecosystem":"hackage","description":"\n\n[Index] [Quick Jump]\n\nPackage maintainers\n\nFor package maintainers and hackage trustees\n\nCandidates\n\n\n\nHey there! If you're just getting started with a static site I'd recommend checking out  slick instead. It has better caching support, is faster, and has better pandoc interop! SitePipe isn't deprecated (yet), but I'd recommend trying slick instead! There's a template repo HERE to get you started. Cheers!\n\n\n\n\n\n\n\nHeads up! If you're reading this from the Hackage docs the links will be broken, go\nread it on Github.\n\nIt's a simple to understand static site generator for making blogs, personal\nwebsites, etc.\n\nStart by setting up the structure of your website in a site folder:\n\nHere's a dead-simple blog generator using markdown posts, you can see it in action in\nexamples/starter-template, or build on it in the tutorial\n\nYup, yet another static site generator. I've tried using Hakyll and Jekyll on\ndifferent occasions and found there was too much magic going on with all of the\nmonadic contexts for me to understand how to customize things for my use-cases.\nEven adding simple tags/categories to my blog seemed far more complex then it\nneeded to be; Hakyll specifically got me really bogged down; what was the\nCompiler monad? How does an Item work? How do I add a custom field? Why\ncouldn't I just edit data directly like I'm used to doing in Haskell? They\nseemed a bit too opinionated without giving me escape hatches to wire in my own\nfunctionality. If they're working for you, then great! But they weren't working\nfor me, so that's where SitePipe came from.\n\nThe easiest way to get started is to clone this repo and try out the examples in the\nexamples directory. There's a starter-template which is a barebones\nstarting point, and also a slightly more complex blog with tags and an rss feed.\nYou can build either of the examples using Stack\nby cding into the directory and running stack build \u0026\u0026 stack exec build-site.\nThis creates a 'dist' folder with the results of the build. A quick way to serve\nthe site is to use Serve.\n\nServing a site with Serve:\n\nRead the walkthrough of the system HERE; it'll run you through the basics\nof how the system works and how to make your own customizations!\n\nInstead of dealing with complex contexts SitePipe works with values. Values\nare loaded from files and can be rendered into html. What happens to the values\nin-between is up to you!\n\nSitePipe provides a bunch of helpers for you, but at the end of the day you can\nfit the pipes together however you like.\n\nMetadata for posts and content is parsed from yaml into Aeson's Value\ntype; Aeson can\neasily represent nested objects or lists inside your metadata, and there's a\nrich ecosystem for working with Aeson types! You can load resources in as any\nobject which implements FromJSON (or just leave them as Aeson Values) and you\nhave the option to edit the objects directly without worrying about monadic or\nexternal context.\n\nSitePipe has built-in support for Mustache\nTemplates, specifically Justus\nAdam's implementation in\nHaskell. This lets you use a well established templating system in your site,\ncomplete with template functions, partials, and iteration. Since the underlying\ndata is based on It's clear how templates will behave since resources are based\non Aeson's JSON types.\n\nYou can load resources in to work on them using a Loader, A loader simply\nfinds and loads files into resources by employing a Reader on some files. A\nbasic resourceLoader loader is provided, which will load all of the files\nmatching a set of file-globs through the provided reader and will return an\nAeson Value containing the relevant metadata and content. You should be able to\nuse resourceLoader for most things by customizing the reader function which you\npass it.\n\nA reader is a function of the type String -\u003e IO String; the input is the file\ncontents which remain after a yaml header has been stripped off (if it exists).\nThe most common reader is the provided markdownReader which runs a markdown\ndocument through pandoc's markdown processor and outputs html. You can write\nyour own readers if you like, either by making a function which operates over\nthe content of the document and matches String -\u003e IO String or by using\nthe provided Pandoc helpers (mkPandocReader, mkPandocReaderWith) which\nallow you to use any of Pandoc's provided document formats, and optionally specify\ntransformations over the pandoc document before it is rendered to html or some other\noutput format.\n\nWriters take a list of resources (anything with a ToJSON instance, often an\nAeson Value) and will write them to the output where the static site will be.\nThe most common writer is writeTemplate which will render the given resource\nthrough a given template, but you can also use textWriter, or write your own\nwriter; either writing to disk using liftIO or by using the provided\nwriteWith combinator which given a transformation from a resource to a String\n(a -\u003e SiteM String) will write the result of the transformation to the place\nspecified by the resource's url.\n\nSome things don't fit into the previous categories. For example copyFiles and\ncopyFilesWith are simple tools which just copy the specified files over as-is\ninto the output directory. You pass either of them a list of file globs and the\nresulting files will be copied over. copyFiles sends them to the same\nrelative filepath from the source directory to the output directory, while\ncopyFilesWith allows you to transform the filepath to specify a new location\nfor each file.\n\nSitepipe includes a few utilities which simply make working with sites easier.\nThe included utilities will expand as time goes on.\n\nFeel free to file an issue if you run into any trouble,\nor come ask in the Chatroom","homepage":"https://github.com/ChrisPenner/sitepipe#readme","licenses":"BSD-3-Clause","normalized_licenses":["BSD-3-Clause"],"repository_url":"https://github.com/ChrisPenner/sitepipe","keywords_array":["bsd3","library","web","Propose Tags"],"namespace":null,"versions_count":9,"first_release_published_at":"2017-05-22T23:04:40.000Z","latest_release_published_at":"2017-05-28T22:52:02.000Z","latest_release_number":"0.1.1","last_synced_at":"2026-10-15T03:31:52.529Z","created_at":"2022-04-06T01:38:55.417Z","updated_at":"2026-10-15T03:31:52.529Z","registry_url":"https://hackage.haskell.org/package/sitepipe","install_command":"cabal install sitepipe","documentation_url":null,"metadata":{},"repo_metadata":{"id":44840290,"uuid":"90479597","full_name":"ChrisPenner/SitePipe","owner":"ChrisPenner","description":"Yet another static site generator - non-opinionated, value-level.  Less magic == easier to understand","archived":false,"fork":false,"pushed_at":"2022-10-25T16:44:25.000Z","size":4274,"stargazers_count":120,"open_issues_count":1,"forks_count":8,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-10-15T02:53:00.708Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ChrisPenner.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-06T17:27:39.000Z","updated_at":"2026-10-09T19:37:05.000Z","dependencies_parsed_at":"2022-08-28T04:40:34.816Z","dependency_job_id":null,"html_url":"https://github.com/ChrisPenner/SitePipe","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/ChrisPenner/SitePipe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChrisPenner","download_url":"https://codeload.github.com/ChrisPenner/SitePipe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344794859,"owners_count":38329677,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-15T02:00:06.843Z","response_time":105,"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"},"owner_record":{"login":"ChrisPenner","name":"Chris Penner","uuid":"6439644","kind":"user","description":"he/him\r\nWriting software to improve the experience of writing software.\r\nAuthor of Optics By Example","email":"","website":"http://www.chrispenner.ca/","location":"Saskatoon, SK, CA","twitter":"chrislpenner","company":null,"icon_url":"https://avatars.githubusercontent.com/u/6439644?u=29780c5eafee7155475bf84fdb98426b6623afb7\u0026v=4","repositories_count":177,"last_synced_at":"2023-08-10T13:58:45.855Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ChrisPenner","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-06T23:49:42.431Z","updated_at":"2023-08-10T13:59:04.920Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChrisPenner","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChrisPenner/repositories"},"tags":[{"name":"v0.4.0.0","sha":"ee2ed981c0a0d34b91075e9e5d79afc1e6097555","kind":"commit","published_at":"2019-02-26T22:28:46.000Z","download_url":"https://codeload.github.com/ChrisPenner/SitePipe/tar.gz/v0.4.0.0","html_url":"https://github.com/ChrisPenner/SitePipe/releases/tag/v0.4.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ChrisPenner/SitePipe@v0.4.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/tags/v0.4.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/tags/v0.4.0.0/manifests"},{"name":"v0.2.0.0","sha":"cb439bb1ed098b233bd93fbbefa0a4e6b8c7bfd9","kind":"commit","published_at":"2017-11-02T14:26:43.000Z","download_url":"https://codeload.github.com/ChrisPenner/SitePipe/tar.gz/v0.2.0.0","html_url":"https://github.com/ChrisPenner/SitePipe/releases/tag/v0.2.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ChrisPenner/SitePipe@v0.2.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/tags/v0.2.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/tags/v0.2.0.0/manifests"},{"name":"v0.1.1","sha":"4314633e0445c0143afe0ea48cbbd8ad5bbae119","kind":"commit","published_at":"2017-10-12T01:50:50.000Z","download_url":"https://codeload.github.com/ChrisPenner/SitePipe/tar.gz/v0.1.1","html_url":"https://github.com/ChrisPenner/SitePipe/releases/tag/v0.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ChrisPenner/SitePipe@v0.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/tags/v0.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/tags/v0.1.1/manifests"}]},"repo_metadata_updated_at":"2026-10-15T03:31:52.281Z","dependent_packages_count":1,"downloads":4479,"downloads_period":"total","dependent_repos_count":2,"rankings":{"downloads":33.376941015869406,"dependent_repos_count":30.970934531596612,"dependent_packages_count":10.522723394573688,"stargazers_count":7.5422330925430865,"forks_count":13.025425174904726,"docker_downloads_count":null,"average":19.087651441897503},"purl":"pkg:hackage/sitepipe","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/hackage/sitepipe","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/hackage/sitepipe","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/hackage/sitepipe/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-10-15T03:26:53.808Z","issues_count":14,"pull_requests_count":11,"avg_time_to_close_issue":6994103.769230769,"avg_time_to_close_pull_request":238656.72727272726,"issues_closed_count":13,"pull_requests_closed_count":11,"pull_request_authors_count":7,"issue_authors_count":8,"avg_comments_per_issue":2.0714285714285716,"avg_comments_per_pull_request":1.0909090909090908,"merged_pull_requests_count":10,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2FSitePipe/issues","maintainers":[{"login":"bandali0","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/bandali0"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/hackage.haskell.org/packages/sitepipe/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/hackage.haskell.org/packages/sitepipe/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/hackage.haskell.org/packages/sitepipe/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/hackage.haskell.org/packages/sitepipe/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/hackage.haskell.org/packages/sitepipe/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/hackage.haskell.org/packages/sitepipe/codemeta","maintainers":[{"uuid":"ChrisPenner","login":"ChrisPenner","name":null,"email":null,"url":null,"packages_count":41,"html_url":"https://hackage.haskell.org/user/ChrisPenner","role":null,"created_at":"2022-11-14T19:45:44.851Z","updated_at":"2022-11-14T19:45:44.851Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/hackage.haskell.org/maintainers/ChrisPenner/packages"}]}