{"id":29644054,"url":"https://github.com/haskell-miso/miso-lynx","last_synced_at":"2026-04-11T04:00:28.261Z","repository":{"id":303911267,"uuid":"129321952","full_name":"haskell-miso/miso-lynx","owner":"haskell-miso","description":":ramen: 🐈 A tasty Haskell mobile framework","archived":false,"fork":false,"pushed_at":"2026-03-07T15:53:39.000Z","size":5186,"stargazers_count":86,"open_issues_count":10,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-04-11T04:00:08.484Z","etag":null,"topics":["android","apple-watch","cocoa","cocoa-touch","haskell","ios","iphone","lynx","lynxjs","miso","osx","ramen"],"latest_commit_sha":null,"homepage":"https://lynx-haddocks.haskell-miso.org","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/haskell-miso.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"open_collective":"miso","github":["dmjio"]}},"created_at":"2018-04-12T23:25:03.000Z","updated_at":"2026-04-03T09:00:49.000Z","dependencies_parsed_at":"2025-08-01T15:13:56.253Z","dependency_job_id":"cf6b9c1d-0f31-4f2b-939c-9c98d4902693","html_url":"https://github.com/haskell-miso/miso-lynx","commit_stats":null,"previous_names":["haskell-miso/miso-lynx"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/haskell-miso/miso-lynx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haskell-miso%2Fmiso-lynx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haskell-miso%2Fmiso-lynx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haskell-miso%2Fmiso-lynx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haskell-miso%2Fmiso-lynx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/haskell-miso","download_url":"https://codeload.github.com/haskell-miso/miso-lynx/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haskell-miso%2Fmiso-lynx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31668050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"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"}},"keywords":["android","apple-watch","cocoa","cocoa-touch","haskell","ios","iphone","lynx","lynxjs","miso","osx","ramen"],"created_at":"2025-07-22T00:02:14.927Z","updated_at":"2026-04-11T04:00:28.248Z","avatar_url":"https://github.com/haskell-miso.png","language":"Haskell","funding_links":["https://opencollective.com/miso","https://github.com/sponsors/dmjio"],"categories":["Haskell","Uncategorized"],"sub_categories":["Uncategorized"],"readme":"\u003ch1 align=\"center\"\u003emiso-lynx\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n\n\u003ca href=\"https://native.haskell-miso.org\"\u003e\n\u003cp align=\"center\"\u003eA \u003ci\u003etasty\u003c/i\u003e \u003ca href=\"https://www.haskell.org/\"\u003e\u003cstrong\u003eHaskell\u003c/strong\u003e\u003c/a\u003e mobile framework 🍜 🐈 📱 \u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://matrix.to/#/#haskell-miso:matrix.org\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/matrix.org-miso-E01563.svg?style=flat-square\" alt=\"Matrix #haskell-miso:matrix.org\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://haskell.org\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/language-Haskell-orange.svg?style=flat-square\" alt=\"Haskell\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://haskell-miso-cachix.cachix.org\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/build-cachix-yellow.svg?style=flat-square\" alt=\"Cachix\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://actions-badge.atrox.dev/haskell-miso/miso-lynx/goto?ref=master\"\u003e\n    \u003cimg alt=\"Build Status\" src=\"https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fhaskell-miso%2Fmiso-lynx%2Fbadge%3Fref%3Dmaster\u0026style=flat-square\" /\u003e\n  \u003c/a\u003e\n  \u003c!-- \u003ca href=\"http://hackage.haskell.org/package/miso-lynx\"\u003e\n    \u003cimg src=\"https://img.shields.io/hackage/v/miso-lynx.svg?style=flat-square\" alt=\"Hackage\"\u003e\n  \u003c/a\u003e --\u003e\n  \u003ca href=\"https://github.com/haskell-miso/miso-lynx/blob/master/LICENSE\"\u003e\n    \u003cimg src=\"http://img.shields.io/badge/license-BSD3-blue.svg?style=flat-square\" alt=\"LICENSE\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n##\n\n**Miso Lynx** 🍜 🐈 is a mobile framework that uses [miso](https://github.com/dmjio/miso) and [LynxJS](https://github.com/lynx-family) to facilitate drawing and API interaction on [iOS](https://www.apple.com/ios/), [Android](https://www.android.com/), and [HarmonyOS](https://device.harmonyos.com/en/) devices. The [Haskell miso project](https://github.com/haskell-miso) is excited to use [LynxJS](https://lynxjs.org/) to advance native mobile app development in the functional programming space.\n\n## Why Lynx\n\n[Since 2017](https://github.com/dmjio/miso/issues/314), `miso` has sought ways to run on mobile devices that take advantage of native drawing facilities. [Flutter](https://flutter.dev/), [SwiftUI](https://developer.apple.com/swiftui/) produce stunning, performant user experiences but are not necessarily designed for integration with open standards, are effectively only usable with a specific IDE / choice languages, and can lack in cross-platform capability (SwiftUI specifically). [React Native](https://reactnative.dev/) improves upon this situation by allowing open web standards for development and cross-platform capability, but wasn't designed for easy integration with ***any*** web framework (rather for use specifically with [react](https://react.dev)).\n\n[Lynx](https://lynxjs.org/) addresses the aforementioned issues with a new architectural approach.\n\n - #### Dual-threaded interpreter runtime\n   The [Lynx](https://lynxjs.org) engine uses [two embedded JavaScript interpreters](https://lynxjs.org/react/thinking-in-reactlynx.html#your-code-runs-on-two-threads) to selectively schedule / offload computation to free up the render thread. This avoids drawing lag as commonly seen with scroll events in react native applications.\n\n - #### Element PAPI (PrimJS API)\n   Exposing a [DOM API](https://lynxjs.org/api/engine/element-api.html) for rendering allows any JavaScript (or compile-to-JavaScript 🍜) web framework to produce cross-platfom mobile applications. [Seen here](https://github.com/haskell-miso/miso-lynx/blob/master/ts/miso/context/lynx.ts) in `miso-lynx`.\n\n - #### Cross platform capability\n   Lynx targets iOS, Android, HarmonyOS, Web by default, and has [a roadmap](https://lynxjs.org/blog/lynx-open-source-roadmap-2025) that mentions Desktop UI as well (OSX, etc.)\n\n - #### Instant first-frame rendering - [IFR](https://lynxjs.org/guide/interaction/ifr.html#ifr-is-one-of-the-advantages-of-lynx)\n   The flagship isomorphic (server side rendering) feature in `miso` can be repurposed as IFR in `miso-lynx` (one of the flagship features of [lynx](https://lynxjs.org)).\n\n - #### Extensibility \n   Custom native components can be written in Objective-C, Swift, Kotlin or Java and accessed via the [Lynx Native Module](https://lynxjs.org/guide/use-native-modules.html) system.\n\nFor framework implementors, this is a dream come true, and we hope `miso-lynx` can be an ideal development environment for building [Lynx](https://lynxjs.org) applications with [miso](https://haskell-miso.org).\n\n## Table of Contents\n- [React Summit](#react-summit)\n- [Fireship](#fireship)\n- [Demo](#demo)\n- [Preview](#preview)\n- [Quick Start](#quick-start)\n- [Setup](#setup)\n- [Hot Reload](#hot-reload)\n- [Haddocks](#haddocks)\n- [Binary cache](#binary-cache)\n- [Maintainers](#maintainers)\n- [Contributing](#contributing)\n- [License](#license)\n\n## React Summit\n\nAs seen @ [React Summit](https://reactsummit.com/) by [@huxpro](https://github.com/huxpro) !\n\n[![Alt text](https://img.youtube.com/vi/l2dByiwiQcM/0.jpg)](https://www.youtube.com/watch?v=l2dByiwiQcM)\n \nThe Haskell miso portion is queued [here](https://youtu.be/l2dByiwiQcM?si=3IghUTRryYAyb7SK\u0026t=1712).\n\n## Fireship\n\nSee [Fireship](https://www.youtube.com/watch?v=-qjE8JkIVoQ) 🔥 🚀 video\n\n## Demo\n\n\u003cimg src=\"https://github.com/user-attachments/assets/385d8686-849c-4be8-99d9-f43a40f5fb43\" width=\"40%\" /\u003e\n\n## Preview\n\nTo run the example locally execute the following command\n\n```bash\n$ git clone git@github.com:haskell-miso/miso-lynx.git\n$ http-server ./miso-lynx/examples\n```\n\nThis will host the `main.lynx.bundle` which can be loaded into the `LynxExplorer` for interactive development.\n\n\u003e [!NOTE] \n\u003e You will need to have the LynxExplorer installed which works with the iOS simulator. Please see the [LynxJS](https://lynxjs.org) getting started guide for installation.\n\n## Quick Start\n\n\u003e [!WARNING]\n\u003e `miso-lynx` depends on the latest version of `miso` (version `1.9`), this includes custom renderers (ala React Renderer) and Components as well.\n\u003e Currently all event handling and drawing are performed on the main thread. Selectively scheduling Haskell code on the Lynx MTS / BTS is ongoing research.\n\u003e This project is under heavy development and is considered experimental.\n\u003e\n\u003e See this [PR](https://github.com/haskell-miso/miso-lynx/pull/70) to follow the progress.\n\nTo start developing applications with `miso-lynx` you will need to acquire [GHC](https://www.haskell.org/ghc/) and [cabal](https://www.haskell.org/cabal/). This can be done via [GHCup](https://www.haskell.org/ghcup/) or [Nix](https://nixos.org/).\n\n\u003e [!TIP]\n\u003e For new Haskell users we recommend using [GHCup](https://www.haskell.org/ghcup/) to acquire both [GHC](https://www.haskell.org/ghc/) and [cabal](https://www.haskell.org/cabal/)\n\n## Setup\n\n### `Main.hs`\n\nThis file contains a simple `miso-lynx` counter application.\n\n```haskell\n-----------------------------------------------------------------------------\n{-# LANGUAGE LambdaCase                  #-}\n{-# LANGUAGE RecordWildCards             #-}\n{-# LANGUAGE OverloadedStrings           #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving  #-}\n-----------------------------------------------------------------------------\nmodule Main where\n-----------------------------------------------------------------------------\nimport           Miso hiding (text_)\nimport           Miso.Lynx\nimport           Miso.Lynx.Element.View.Event (onTap)\n-----------------------------------------------------------------------------\nimport           Miso.Lens\nimport           Miso.String\nimport qualified Miso.CSS as CSS\n-----------------------------------------------------------------------------\n-- | Application model\nnewtype Model = Model { _value :: Int }\n  deriving (Show, Eq, ToMisoString)\n-----------------------------------------------------------------------------\nvalue :: Lens Model Int\nvalue = lens _value $ \\m v -\u003e m { _value = v }\n-----------------------------------------------------------------------------\ndata Action\n  = AddOne\n  | SubtractOne\n  deriving (Show, Eq)\n-----------------------------------------------------------------------------\n-- | Entry point for a miso application\nmain :: IO ()\nmain = lynx lynxEvents counterComponent\n-----------------------------------------------------------------------------\ncounterComponent :: App Model Action\ncounterComponent = component (Model 0) updateModel viewModel\n-----------------------------------------------------------------------------\nupdateModel\n  :: Action\n  -\u003e Transition Model Action\nupdateModel = \\case\n  AddOne -\u003e\n    value += 1\n  SubtractOne -\u003e\n    value -= 1\n-----------------------------------------------------------------------------\n-- | Constructs a virtual DOM from a model\nviewModel :: Model -\u003e View Model Action\nviewModel m = view_\n  [ CSS.style_\n    [ CSS.height \"200px\"\n    , CSS.display \"flex\"\n    , CSS.alignItems \"center\"\n    , CSS.justifyContent \"center\"\n    ]\n  ]\n  [ view_\n    [ onTap AddOne\n    , CSS.style_\n        [ CSS.backgroundColor CSS.yellow\n        , CSS.width \"100px\"\n        , CSS.height \"100px\"\n        , CSS.margin \"2px\"\n        , CSS.display \"flex\"\n        , CSS.alignItems \"center\"\n        , CSS.justifyContent \"center\"\n        ]\n    ]\n    [ text_\n      [ CSS.style_\n        [ CSS.fontSize \"48px\"\n        ]\n      ]\n      [ \"🐈\"\n      ]\n    ]\n  , view_\n    [ CSS.style_\n        [ CSS.backgroundColor CSS.orange\n        , CSS.width \"100px\"\n        , CSS.height \"100px\"\n        , CSS.display \"flex\"\n        , CSS.alignItems \"center\"\n        , CSS.justifyContent \"center\"\n        ]\n    ]\n    [ text_\n      [ CSS.style_\n        [ CSS.fontSize \"48px\"\n        ]\n      ]\n      [ text $ ms (m ^. value)\n      ]\n    ]\n  , view_\n    [ onTap SubtractOne\n    , CSS.style_\n        [ CSS.backgroundColor CSS.pink\n        , CSS.width \"100px\"\n        , CSS.height \"100px\"\n        , CSS.margin \"2px\"\n        , CSS.display \"flex\"\n        , CSS.alignItems \"center\"\n        , CSS.justifyContent \"center\"\n        ]\n    ]\n    [ text_\n      [ CSS.style_\n        [ CSS.fontSize \"48px\"\n        ]\n      ]\n      [ \"🍜\"\n      ]\n    ]\n ]\n-----------------------------------------------------------------------------\n```\n\nNow that your project files are populated, development can begin.\n\n## Hot Reload\n\nThis entails creating a [LynxExplorer](https://lynxjs.org) application with GHC WASM browser hot reload. This will require using [rspack](https://rspack.rs/) and the BTS to access WebSockets via the Native Module system. For more information on accessing native device APIs (like `WebSocket`) via the BTS please see the [Sphynx](https://github.com/dmjio/sphynx) project.\n\n## Haddocks\n\nSee the official [Haskell documentation](https://lynx-haddocks.haskell-miso.org)\n\n## Examples\n\n- [Examples](https://github.com/dmjio/miso-lynx/tree/master/examples)\n\n### Binary cache\n\n`nix` users on a Linux or OSX distros can take advantage of a [binary cache](https://haskell-miso-cachix.cachix.org) for faster builds. To use the binary cache follow the instructions on [cachix](https://haskell-miso-cachix.cachix.org/).\n\n\u003e [!TIP]\n\u003e We highly recommend nix users consume the [cachix](https://cachix.org) cache. `cachix use haskell-miso-cachix`.\n\n```bash\n$ cachix use haskell-miso-cachix\n```\n\n## Maintainers\n\n[@dmjio](https://github.com/dmjio)\n\n## Contributing\n\nFeel free to dive in! [Open an issue](https://github.com/dmjio/miso-lynx/issues/new) or a submit [Pull Request](https://github.com/dmjio/miso-lynx/pulls).\n\nSee [CONTRIBUTING](https://github.com/dmjio/miso-lynx/blob/master/CONTRIBUTING.md) for more info.\n\n## License\n\n[BSD3](LICENSE) © dmjio\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaskell-miso%2Fmiso-lynx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhaskell-miso%2Fmiso-lynx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaskell-miso%2Fmiso-lynx/lists"}