{"id":13610363,"url":"https://github.com/jwstegemann/fritz2","last_synced_at":"2025-05-14T21:10:31.690Z","repository":{"id":37037612,"uuid":"230732344","full_name":"jwstegemann/fritz2","owner":"jwstegemann","description":"Easily build reactive web-apps in Kotlin based on flows and coroutines.","archived":false,"fork":false,"pushed_at":"2025-04-08T16:03:30.000Z","size":23615,"stargazers_count":687,"open_issues_count":13,"forks_count":29,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-13T18:44:34.320Z","etag":null,"topics":["binding","framework","frontend","html5","kotlin","kotlin-coroutines","kotlin-js","reactive"],"latest_commit_sha":null,"homepage":"https://www.fritz2.dev","language":"Kotlin","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/jwstegemann.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2019-12-29T10:01:07.000Z","updated_at":"2025-04-13T15:51:59.000Z","dependencies_parsed_at":"2023-12-19T20:44:59.331Z","dependency_job_id":"14afef62-8659-42b3-a0fd-345b423a2a63","html_url":"https://github.com/jwstegemann/fritz2","commit_stats":{"total_commits":2418,"total_committers":41,"mean_commits":58.97560975609756,"dds":0.7597187758478081,"last_synced_commit":"206c3117c7cadbfc3b841f5109bbab0520a6f8ed"},"previous_names":[],"tags_count":50,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwstegemann%2Ffritz2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwstegemann%2Ffritz2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwstegemann%2Ffritz2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwstegemann%2Ffritz2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jwstegemann","download_url":"https://codeload.github.com/jwstegemann/fritz2/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254227631,"owners_count":22035671,"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":["binding","framework","frontend","html5","kotlin","kotlin-coroutines","kotlin-js","reactive"],"created_at":"2024-08-01T19:01:44.012Z","updated_at":"2025-05-14T21:10:26.666Z","avatar_url":"https://github.com/jwstegemann.png","language":"Kotlin","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"readme":"![fritz2](https://www.fritz2.dev/img/fritz2_header.png)\n\n[![Actions Status](https://github.com/jwstegemann/fritz2/workflows/build/badge.svg)](https://github.com/jwstegemann/fritz2/actions)\n[![Awesome Kotlin Badge](https://kotlin.link/awesome-kotlin.svg)](https://github.com/KotlinBy/awesome-kotlin)\n[![Download](https://img.shields.io/maven-central/v/dev.fritz2/core)](https://search.maven.org/search?q=g:dev.fritz2)\n[![IR](https://img.shields.io/badge/Kotlin%2FJS-IR%20supported-yellow)](https://kotl.in/jsirsupported)\n[![Examples](https://img.shields.io/badge/examples-showcase-yellow)](/examples)\n[![API](https://img.shields.io/badge/API-dokka-green)](https://fritz2.dev/api)\n[![Docs](https://img.shields.io/badge/docs-online-violet)](https://fritz2.dev/docs)\n[![Slack chat](https://img.shields.io/badge/kotlinlang-%23fritz2-B37700?logo=slack)](https://kotlinlang.slack.com/messages/fritz2)\n\nfritz2 is an ***extremely lightweight***, well-performing, independent library for building\nreactive web apps in ***Kotlin***, heavily depending on coroutines and flows.\n\nfritz2 includes an intuitive way to build and render HTML elements using a type-safe dsl. \nYou can easily create lightweight **reactive** HTML components which are bound to an underlying model \nand **automatically** change whenever the model data changes:\n\n```kotlin\nrender {\n    val model = storeOf(\"init value\")\n    \n    div(\"some-css-class\") {\n        input {\n            value(model.data)\n            changes.values() handledBy model.update \n        }\n        p {\n            +\"model value = \"\n            model.data.renderText()\n        }\n    }\n}\n```\n\nfritz2 implements **precise data binding**. This means that when parts of your data model change, \n**exactly those** and only those DOM-nodes depending on the changed parts will automatically change as well. \nNo intermediate layer (like a virtual DOM) is needed. fritz2 requires no additional methods to decide \nwhich parts of your component have to be re-rendered. \nfritz2 also supports **two-way data binding** out-of-the-box to update your model by listening on events:\n\n[//]: # (![State management in fritz2]\u0026#40;https://fritz2.dev/img/fritz2_cycle_of_life.png\u0026#41;)\n![State management in fritz2](https://raw.githubusercontent.com/jwstegemann/fritz2/gh-pages/img/fritz2_cycle_of_life.png)\n\nUtilizing Kotlin's multiplatform-abilities, you'll write the code of your data classes only once and use \nit on your client and server (i.e. in a [SpringBoot](https://github.com/jamowei/fritz2-spring-todomvc)- or \n[Ktor](https://github.com/jamowei/fritz2-ktor-todomvc)-Backend). \nThis is also true for your model-validation-code, which can quickly become far more complex than your data model.\n\n## Key Features\n\n- easy reactive one- and two-way data binding (even for lists and deep nested structures)\n- hassle-free state-handling\n- model-validation and message handling\n- http and websockets\n- hash-based routing\n- history / undo\n- processing state (\"spinning wheel\")\n- webcomponents\n- easy to learn\n- [documentation](https://fritz2.dev/docs)\n- [examples](/examples) i.e. implementing the specification of [TodoMVC](http://todomvc.com/)\n\n## How to try it?\n\n* Take a look at our hosted [examples](https://www.fritz2.dev/examples/)\n* Or set up a new project on your own, following our [documentation](https://www.fritz2.dev/docs/start/)\n\n## Overall Goals\n\n- staying lightweight\n- keeping dependencies as low as possible\n- providing tags, attributes, events for HTML from specification (w3c, mozilla, ...)\n- making it as easy as possible to write reactive web-apps in pure kotlin\n\n## Inspiration\n\nfritz2 is hugely inspired by the great [Binding.scala](https://github.com/ThoughtWorksInc/Binding.scala) framework. \nLater we discovered that a lot of those concepts are described independently in [Meiosis](https://meiosis.js.org/).\nAlso, fritz2 relies heavily on the great Kotlin [coroutines](https://github.com/Kotlin/kotlinx.coroutines) library.\n\n## Leave us a star...\n\nIf you like the idea of a lightweight pure Kotlin implementation for building reactive web-apps, \nplease give us a star. Thank you!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwstegemann%2Ffritz2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjwstegemann%2Ffritz2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwstegemann%2Ffritz2/lists"}