{"id":25670197,"url":"https://github.com/cookiengineer/gooey","last_synced_at":"2026-06-20T14:32:10.275Z","repository":{"id":252254713,"uuid":"836207749","full_name":"cookiengineer/gooey","owner":"cookiengineer","description":":smiling_imp: :boom: :gun: Opinionated Go WebASM framework","archived":false,"fork":false,"pushed_at":"2026-06-14T07:55:54.000Z","size":3217,"stargazers_count":75,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-06-14T09:22:42.315Z","etag":null,"topics":["golang","webassembly","webframework"],"latest_commit_sha":null,"homepage":"","language":"Go","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/cookiengineer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-07-31T11:22:47.000Z","updated_at":"2026-06-14T07:55:58.000Z","dependencies_parsed_at":"2024-08-12T07:02:24.627Z","dependency_job_id":"5d26fa74-2484-4691-8283-d94085c3381b","html_url":"https://github.com/cookiengineer/gooey","commit_stats":null,"previous_names":["cookiengineer/godom","cookiengineer/golem","cookiengineer/gooey"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/cookiengineer/gooey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cookiengineer%2Fgooey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cookiengineer%2Fgooey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cookiengineer%2Fgooey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cookiengineer%2Fgooey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cookiengineer","download_url":"https://codeload.github.com/cookiengineer/gooey/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cookiengineer%2Fgooey/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34573729,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"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":["golang","webassembly","webframework"],"created_at":"2025-02-24T11:35:03.710Z","updated_at":"2026-06-20T14:32:10.269Z","avatar_url":"https://github.com/cookiengineer.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Gooey\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"256\" height=\"256\" src=\"https://raw.githubusercontent.com/cookiengineer/gooey/master/assets/gooey.jpg\"\u003e\n\u003c/p\u003e\n\n[Gooey](https://github.com/cookiengineer/gooey) (pronounced as `/'ɡu.i/` or `GUI`) is divided in three parts:\n\n- A pure Go WebASM [bindings](/bindings) framework that bridges the gaps between Go, WebASM and Browser APIs.\n- A pure Go Web UI [components](/components) framework that structures a Web Application, ready for use in local Web Views.\n- A pure CSS [design](/design) theme optimized for accessibility, readability, and light/dark mode support.\n\n\n## Motivation\n\n**Problems in modern Web App development**:\n\n- Web Components are great as a separation of feature concept.\n- Web Components are bad for web accessibility (e.g. `aria-` property fatigue).\n- Frontend-to-Backend communication is always a redundancy problem.\n- Frontend schema safety and validation is always implemented in another language (e.g. `ECMAScript`, `TypeScript`, etc).\n- Backend schema safety and validation is great with `Marshal` / `Unmarshal`.\n- Bug-to-bug differences from Frontend and Backend eat up a lot of development time.\n- Using online-first Web Apps with slow internet connections is painful.\n\n**Conclusions**:\n\n- Use Go's types, structs and schemas both on the Frontend and on the Backend side.\n- Use dynamic Web Components for the Frontend.\n- Use static Web Components for the Backend to provide server-side rendering.\n- Build offline-first Web Apps with `webview/webview` pointing to a local web server.\n- Bundle all assets in `/public` via `go:embed` within the application binary.\n\n\n## Architecture\n\nGooey uses a Reactive MVC Architecture and embraces the use of a unidirectional\nflow, meaning it is a circular pattern of state management.\n\nThis is a nice architecture pattern for deserialization and serialization of the\nSchemas into Views, because all custom application code lands in the separated\ncontrollers, which each manage their own View, Client, and Storage.\n\n![Reactive MVC Architecture](/assets/reactive-mvc.jpg)\n\nCustom Controllers with even Custom Views are easily integratable this way, because\nthe Reactive MVC Architecture allows to build an App where each of the Views is\njust a Web Component layer and doesn't need to be touched for most cases.\n\n\n## Documentation\n\n- [ERRATA.md](/docs/ERRATA.md) documents the state of known errata and problems of using Go via WebASM.\n\n**IMPORTANT**: Note that even if you have years of Go development experience, the Errata\ndocument is still relevant for you, because it highlights problems when using Go in the\nWeb Browser and the quirks that come with it.\n\n- [ARCHITECTURE.md](/docs/ARCHITECTURE.md) documents the architecture of a Gooey App.\n- [BINDINGS.md](/docs/BINDINGS.md) documents the state of implemented Web Bindings.\n- [COMPONENTS.md](/docs/COMPONENTS.md) documents the state of implemented Web Components.\n- [TODO.md](/docs/TODO.md) documents the work-in-progress of things that will be implemented in the near future.\n\n\n## Examples\n\nThe [examples](/examples) folder contains minimal demos that show how to use the gooey\nbindings and components. They also contain a `main.go` that is compiled into a `main.wasm`\nfile and a `serve.go` that reflects the local webserver.\n\nEach example contains a `build.sh` that builds and serves the demo on `http://localhost:3000`.\n\n**Important**: The examples also serve as unit tests, because `go test` cannot generate\nbinaries for the `syscall/js` platform right now. As soon as unit tests are available\nupstream via `go test -c`, the plan is to migrate towards fully integrated unit tests.\n\n**Bindings Examples**:\n\n- [canvas2d](/examples/bindings/canvas2d)\n- [console](/examples/bindings/console)\n- [crypto-aescbc](/examples/bindings/crypto-aescbc)\n- [cookiestore](/examples/bindings/cookiestore)\n- [dom](/examples/bindings/dom)\n- [encoding](/examples/bindings/encoding)\n- [fetch](/examples/bindings/fetch)\n- [history](/examples/bindings/history)\n- [location](/examples/bindings/location)\n- [navigator](/examples/bindings/navigator)\n- [navigator-geolocation](/examples/bindings/navigator-geolocation)\n- [storages](/examples/bindings/storages)\n\n**Components Examples**:\n\n- [app](/examples/components/app)\n- [app-components](/examples/components/app-components)\n- [app-views](/examples/components/app-views)\n- [content-fieldset](/examples/components/content-fieldset)\n- [content-linechart](/examples/components/content-linechart)\n- [content-piechart](/examples/components/content-piechart)\n- [content-table](/examples/components/content-table)\n- [layout](/examples/components/layout)\n- [ui](/examples/components/ui)\n\n\n# Changelog\n\nChanges, Additions and Removals are documented in [CHANGELOG.md](./CHANGELOG.md).\n\n\n# License\n\nThis project is licensed under the [MIT](./LICENSE.txt) license.\n\n\n# Contributors\n\n- [cookiengineer](https://github.com/cookiengineer)\n- [utsavanand2](https://github.com/utsavanand2)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcookiengineer%2Fgooey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcookiengineer%2Fgooey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcookiengineer%2Fgooey/lists"}