{"id":9243661,"url":"https://github.com/mikesol/purescript-deku","last_synced_at":"2026-04-10T12:08:52.718Z","repository":{"id":37851311,"uuid":"471741397","full_name":"mikesol/purescript-deku","owner":"mikesol","description":"A PureScript web UI framework","archived":false,"fork":false,"pushed_at":"2026-03-13T14:41:21.000Z","size":8946,"stargazers_count":153,"open_issues_count":4,"forks_count":12,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-03-14T02:49:01.374Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://deku-documentation.vercel.app/","language":"PureScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mikesol.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-03-19T15:51:24.000Z","updated_at":"2026-03-13T14:41:27.000Z","dependencies_parsed_at":"2023-10-12T00:57:43.046Z","dependency_job_id":"9b0cb806-318c-4778-90a8-e0520633d600","html_url":"https://github.com/mikesol/purescript-deku","commit_stats":null,"previous_names":[],"tags_count":86,"template":false,"template_full_name":null,"purl":"pkg:github/mikesol/purescript-deku","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikesol%2Fpurescript-deku","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikesol%2Fpurescript-deku/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikesol%2Fpurescript-deku/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikesol%2Fpurescript-deku/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mikesol","download_url":"https://codeload.github.com/mikesol/purescript-deku/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikesol%2Fpurescript-deku/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31641537,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":"2024-05-08T00:10:38.626Z","updated_at":"2026-04-10T12:08:52.684Z","avatar_url":"https://github.com/mikesol.png","language":"PureScript","funding_links":[],"categories":["UI"],"sub_categories":["Deku"],"readme":"# purescript-deku\n\n![deku](./deku.gif)\n\nA PureScript web framework for apps that need to be fast.\n\n## In anger\n\n- [Verity Scheel's snowflow](https://snowflow.surge.sh/) is snowflake-themed work of web-art.\n- [Verity Scheel's post on parsing](https://cofree.coffee/~verity/parser.html) implements a full-featured tweening engine to animate rule-based parsing steps.\n- [Horizontal and Vertical Events](https://dev.to/mikesol/horizontal-and-vertical-events-1pm1) is an article that explores some concepts central to Deku with many tryable \u0026 editable examples.\n\n## Documentation\n\n[Here is a guide](https://deku-documentation.vercel.app/) to building apps with Deku. The guide is written in Deku and its source code can be found [here](https://github.com/mikesol/deku-documentation). **You should probably start your Deku journey with this guide.** It contains everything you need to build a Deku app, from bootstrapping a project to `Hello World` to a Discord clone!\n\nIndexed documentation for Deku is published on [Pursuit](https://pursuit.purescript.org/packages/purescript-deku). Deku's structure is currently highly decentralized, so it can be tough to know where to look. Here's a small Deku app that acts as a legend for the Pursuit docs.\n\n```purescript\n\nmain :: Effect Unit\nmain =\n  -- `Deku.Toplevel` contains runInBody\n  -- and other functions for hydration and SSR\n  runInBody myNut\n  where\n  -- `Deku.Core` contains the `Nut` type, which is the type\n  -- of all Deku applications.\n  myNut :: Nut\n  myNut = \n    -- `Deku.Do`` is the rebindable do context that allows you\n    -- to use hooks in Deku\n    Deku.do\n      -- `Deku.Hooks` contains hooks like `useState`,\n      -- `useDyn`, and `useMemoized`\n      setCounter /\\ counter \u003c- useState 0\n      -- `Deku.DOM`, often imported as `D`, contains all DOM elements,\n      -- attributes, and event handlers\n      D.div\n          [\n            -- `Deku.Listeners` contains helper functions for various common\n            -- listeners like `click` and `keyUp`\n            click $ counter \u003c#\u003e add 1 \u003e\u003e\u003e setCounter\n          -- `Deku.Attributes` contains helper functions for various common\n          -- attributes like `style` and `klass` (an alias for `class`)\n          , klass_ \"color: crimson;\"\n          -- `Deku.CSS` contains `render`, which allows you to take `CSS` from\n          -- `purescript-css` and use it in a Deku application\n          , style_ $ render do\n              color (rgb 42 142 242)\n              fontWeight bold\n          -- `Deku.Attribute` contains constructors for\n          -- uncommon and ad hoc `x-` attributes\n          , pure (xdata \"my-attr\" \"my-val\")\n          ]\n        [\n          -- `Deku.Control` contains all non-element buiding blocks\n          -- for applications, including `text` and `\u003c#~\u003e`, which\n          -- allows you to switch between elements.\n          text (show \u003c$\u003e counter)\n        -- `Deku.Pursx` contains the `~~` operator, which allows you to\n        -- construct typesafe Deku using plain old html.\n        , (Proxy :: _ \"\u003cp\u003eNow you're a Deku ~adj~\u003c/p\u003e\") ~~\n            { adj: text\n                (counter \u003c#\u003e mod 2 \u003e\u003e\u003e eq 0 \u003e\u003e\u003e if _ then \"newb\" else \"master\")\n            }\n        ]\n```\n\nSo, in summary, ignore the voluminous number of modules in Deku (which makes browsing Pursuit difficult) and focus on the modules used in the example above, namely:\n\n- [`Deku.Toplevel`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Toplevel)\n- [`Deku.Core`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Core)\n- [`Deku.Do`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Do)\n- [`Deku.Hooks`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Hooks)\n- [`Deku.DOM`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.DOM)\n- [`Deku.Listeners`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Listeners)\n- [`Deku.Attributes`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Attributes)\n- [`Deku.CSS`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.CSS)\n- [`Deku.Attribute`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Attribute)\n- [`Deku.Control`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Control)\n- [`Deku.Pursx`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Pursx)\n\n\nThere are a few more modules to be aware of for advanced usage:\n\n- [`Deku.Lifecycle`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Lifecycle) contains methods for arbitrary side effects to run when the Deku Nuts mount and dismount from the DOM.\n- [`Deku.Pursx.Anonymous`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Pursx.Anonymous) contains an experimental `pursx` syntax that could theoretically be made better by Visible Type Applications. As that feature develops, if the syntax becomes ergonomic, it may supersede the current `pursx` syntax.\n- [`Deku.Interpret`](https://pursuit.purescript.org/packages/purescript-deku/docs/Deku.Interpret) is for folks that wish to build a custom Deku backend. Deku currently supports Single-page applications (the default), static site rendering, and hydrated static site rendering.\n\nDeku is a small codebase. All of the heavy lifting is done via primitives from [`purescript-hyrule`](https://github.com/mikesol/purescript-hyrule), the documentation of which is also on [Pursuit](https://pursuit.purescript.org/packages/purescript-hyrule).\n\n## Why another web framework?\n\nDeku aims to be:\n\n- **fast**: it's up to 2x faster than Halogen for a simple Todo MVC app.\n- **small**: the average Deku program tends to be fewer lines of code than its React or Halogen counterparts.\n- **ssr-friendly**: Deku has out-of-the-box server-side rendering capabilities. \n\n## What does Deku mean?\n\nDeku is short for \"DOMs Emitted as Kan-extended Universals.\" It is also the tree of Zelda lore and is a Japanese diminutive for a dullard or simpleton.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikesol%2Fpurescript-deku","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmikesol%2Fpurescript-deku","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikesol%2Fpurescript-deku/lists"}