{"id":46490422,"url":"https://github.com/gost-dom/browser","last_synced_at":"2026-03-06T10:32:18.889Z","repository":{"id":261388006,"uuid":"884160706","full_name":"gost-dom/browser","owner":"gost-dom","description":"Headless browser for Go for TDD workflows","archived":false,"fork":false,"pushed_at":"2026-02-02T20:35:41.000Z","size":8732,"stargazers_count":248,"open_issues_count":68,"forks_count":13,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-02-03T04:10:23.111Z","etag":null,"topics":["go","golang","headless","headless-browsers","tdd","test-automation","testing","testing-tools"],"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/gost-dom.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","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},"funding":{"github":"stroiman","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"stroiman","thanks_dev":null,"custom":"https://gostdom.net/sponsor"}},"created_at":"2024-11-06T08:59:43.000Z","updated_at":"2026-02-02T19:09:58.000Z","dependencies_parsed_at":"2024-11-06T10:19:17.805Z","dependency_job_id":"0ca462d2-72f0-4351-805f-370d3503e6c5","html_url":"https://github.com/gost-dom/browser","commit_stats":null,"previous_names":["stroiman/go-dom","gost-dom/browser"],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/gost-dom/browser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gost-dom%2Fbrowser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gost-dom%2Fbrowser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gost-dom%2Fbrowser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gost-dom%2Fbrowser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gost-dom","download_url":"https://codeload.github.com/gost-dom/browser/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gost-dom%2Fbrowser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30171869,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T07:56:45.623Z","status":"ssl_error","status_checked_at":"2026-03-06T07:55:55.621Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["go","golang","headless","headless-browsers","tdd","test-automation","testing","testing-tools"],"created_at":"2026-03-06T10:32:18.245Z","updated_at":"2026-03-06T10:32:18.877Z","avatar_url":"https://github.com/gost-dom.png","language":"Go","funding_links":["https://github.com/sponsors/stroiman","https://buymeacoffee.com/stroiman","https://gostdom.net/sponsor"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/196428063?s=50\u0026v=4\" alt=\"logo\" /\u003e\u003cbr /\u003eGost-DOM\u003cbr /\u003e\u003cspan font-size=\"0.05em\"\u003eA headless browser for Go\u003c/span\u003e\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cem\u003eThe Go-to solution for a TDD workflow.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cblockquote margin=\"100\"\u003eAs a developer\u003cbr /\u003e\nIn order to work effeciently with code\u003cbr /\u003e\nI want a fast feedback loop for \u003cem\u003eall\u003c/em\u003e of my code.\u003c/blockquote\u003e\u003c/div\u003e\n\nGost-DOM is a development tool to help building web applications in Go by\nproviding a blazingly fast, completely reliable, feedback loop.\n\nBy simulating a browser envinronment in the test itself, including JavaScript\nexecution[^1], Gost-DOM allows you to write an automated test suite, and run\nthem so fast enough that they become a useful feedback tool _while implementing\nbehaviour_.\n\n\u003cp align=\"center\"\u003e\n\u003cem\u003e\n\nGost-DOM is **the headless browser** that provides sub-second feedback with 100%\npredictable code execution.\n\n\u003c/em\u003e\n\u003c/p\u003e\n\nTo learn more, read [Why Gost-DOM?](./docs/why-gost.md)\n\n## Why not use ...\n\nThe typical solution relies on browser automation (e.g., playwright). These have a\nsignificant overhead controlling a remote browser. In addition, developers\noften struggle with erratic tests due to unpredictable code execution.\n\nAs a result, these types of tests are typically written _after the fact_, when\nthe system already works.\n\nThese tests didn't provide any value as a feedback tool _during development_.\n\n\n### Not a replacement\n\nGost-DOM allows verification of individual pieces of behaviour _during\ndevelopment_, but it's not a full browser, e.g., you cannot export screen shots.\n\nIn addition, there are sensible tests to write _after_ features were developed,\ne.g., test a complete web-shop order flow from login to check-out. Using a real\nbrowser for these types of tests would be sensible; and verifying in _all_\nbrowsers you support.\n\n## Other Benefits of Gost-DOM\n\nGost-DOM has a few additional benefits over browser automation:\n\n- Tests run in parallel due to _complete isolation_[^2]\n- No erratic behaviour; 100% predictable UI reactions.\n- _Blazingly fast_.[^3] No out-of-process calls, not even thread boundaries for web\n  API calls as web application code runs in the test thread.[^4]\n- Dependencies can be replaced in tests.\n- Write tests at a higher level of abstraction, expressing the expected\n  _behaviour_ of a system, decoupled from implementation details.\n\nGost-DOM still uses HTTP request and responses for verification, testing the\nentire stack, including how middlewares affect the behaviour, verifying, and\nsupporting refactoring of e.g., authentication logic.\n\n## Getting started\n\n- Read [Getting Started]\n- Familiarize yourself with the [Feature list] to know what is implemented.\n- [Join my discord server] to chat with me, and stay up-to-date on progress.\n- [say hi!] on the github discussions page.\n- Read the [contribution guide](./CONTRIBUTING.md) to see how you can help.\n\nAlso, check out the [Shaman module] which provides capabilities of querying the\nDOM at a higher level of abstraction, e.g., find an element with a specific\n_label_ / _accessibility name_, allowing tests to be more expressive\n\n[Shaman module]: https://github.com/gost-dom/shaman\n\n\u003e [!NOTE]\n\u003e\n\u003e This is 0.x version still, and breaking API changes do occur, but will be\n\u003e announced before release in the [Gost-DOM discussions] (do say Hi! 👋)\n\n[Gost-DOM discussions]: https://github.com/orgs/gost-dom/discussions/categories/announcements\n[Getting Started]: ./docs/Getting-started.md\n[Feature list]: ./docs/Features.md\n[say hi!]: https://github.com/orgs/gost-dom/discussions\n[Join my discord server]: https://discord.gg/rPBRt8Rf\n\n## Looking for sponsors\n\nThis project is the spare time project for a single developer making good\nprogress because of too much spare time; but that will not last.\n\nIf I could find enough sponsors, it could mean the difference between continued\ndevelopment, or death 😢\n\nFor companies wanting to sponsor, I can send formal invoices too. More\ninformation on the project's [Sponsor page](https://gostdom.net/sponsor)\n\n## Attribution / 3rd party included code.\n\nSome web APIs are implemented [by embedding\npolyfills](./scripting/internal/polyfills) from other open-source\nJavaScript libraries.\n\n- XPath evaluator uses [code from](./scripting/internal/polyfills/xpath)\n  the [jsdom project](https://github.com/jsdom/jsdom) distributed under the MIT\n  license.\n- [FastestSmallestTextEncoderDecoder](./scripting/internal/polyfills/FastestSmallestTextEncoderDecoder)\n  distributed under the Creative Commons Zero v1.0 Universal license.\n\nIn addition, to verify compatibility with 3rd party JavaScript libraries, the\n[test code] in repository contains compiled versions of:\n\n- [HTMX](https://htmx.org) distributed under the Zero-Clause BSD license.\n- [Datastar](https://data-star.dev/) distributed under the MIT license.\n\n[test code]: ./internal/test/integration/test-app/content/public/datastar/datastar.rc6.js\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=gost-dom/browser\u0026type=Date)](https://www.star-history.com/#gost-dom/browser\u0026Date)\n\n---\n\n[^1]: Gost-DOM can use V8 - the same JavaScript engine that powers Chrome; but a\n    native Go alternative also exists.\n[^2]: Complete isolation depends on _your code_, e.g., if you don't replace\n    database dependencies, tests are not isolated.\n[^3]: Cliché, I know! But it is!\n[^4]: This depends on how you configure Gost-DOM.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgost-dom%2Fbrowser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgost-dom%2Fbrowser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgost-dom%2Fbrowser/lists"}