{"id":45316444,"url":"https://github.com/brunoluiz/imagewand","last_synced_at":"2026-02-21T07:51:49.304Z","repository":{"id":37258198,"uuid":"470793335","full_name":"brunoluiz/imagewand","owner":"brunoluiz","description":"🪄 Private-first image conversion within browsers, powered by WASM \u0026 Golang","archived":false,"fork":false,"pushed_at":"2023-05-28T15:58:59.000Z","size":239,"stargazers_count":31,"open_issues_count":4,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-19T00:00:30.177Z","etag":null,"topics":["go","golang","javascript","tinygo","wasm","webassembly"],"latest_commit_sha":null,"homepage":"https://imagewand.concordalabs.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brunoluiz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2022-03-17T00:19:56.000Z","updated_at":"2024-11-18T15:53:09.000Z","dependencies_parsed_at":"2024-06-19T11:14:21.147Z","dependency_job_id":"32e75115-5f7e-4a03-afaf-b228a9f7ae0f","html_url":"https://github.com/brunoluiz/imagewand","commit_stats":{"total_commits":33,"total_committers":1,"mean_commits":33.0,"dds":0.0,"last_synced_commit":"a3d424cdf100a4159829a9d42d65bb9f8e1503a2"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/brunoluiz/imagewand","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoluiz%2Fimagewand","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoluiz%2Fimagewand/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoluiz%2Fimagewand/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoluiz%2Fimagewand/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brunoluiz","download_url":"https://codeload.github.com/brunoluiz/imagewand/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brunoluiz%2Fimagewand/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29676854,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T06:23:40.028Z","status":"ssl_error","status_checked_at":"2026-02-21T06:23:39.222Z","response_time":107,"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","javascript","tinygo","wasm","webassembly"],"created_at":"2026-02-21T07:51:49.246Z","updated_at":"2026-02-21T07:51:49.298Z","avatar_url":"https://github.com/brunoluiz.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eImageWand\u003c/h1\u003e\n\u003cp align=\"center\"\u003ePrivate-first image conversion within browsers, powered by WASM ✨\u003c/p\u003e\n\n\u003ccenter\u003e\n  \u003ca href='http://unsplash.com/photos/NbgQfUvKFE0'\u003e\n    \u003cimg src='./cover.jpg' alt='Photo by Mark Tegethoff'/\u003e\n  \u003c/a\u003e\n\u003c/center\u003e\n\n# Summary\n\nMany image conversion websites require users to upload images to a server, which then converts it and send to the user. The problem is that images might get stored for an indefinite amount of time in these servers, which is not great for privacy. ImageWand does all the image conversion on the client-side, leveraging WebAssembly.\n\nThis project was part of my experiments with Golang \u0026 WebAssembly. It obviously have space for improvements, so please do open issues if you find that something can be improved. It can be compiled using Golang or TinyGo, although the deployed version uses Golang for now due to Vercel limitations.\n\nMore details about the project's implementation at [**ImageWand: privacy-first image conversion experiment with Golang \u0026 WASM**](https://brunoluiz.net/blog/2022/aug/imagewand-privacy-first-image-conversion-experiment-with-golang-and-wasm/).\n\n# How to run locally\n\n- Install NodeJS, Golang and TinyGo\n- Run `make watch-html`\n- Run `make watch-wasm` (only works for `standard` mode)\n- Run `make watch-css`: required for UI changes due to Tailwind\n- The content will be served at [localhost:3000](http://localhost:3000)\n\n## Select custom binary on load (TinyGo or Golang)\n\nWhen loading the application, it will try to run using `tinygo`. If you wish to use `go`, add `?t=go`. See all supported ones at [./app/js/imagewand.js](./app/js/imagewand.js).\n\n# References\n\n* [Go, WebAssembly, HTTP requests and Promises](https://withblue.ink/2020/10/03/go-webassembly-http-requests-and-promises.html)\n* [MDN: Transferable objects](https://developer.mozilla.org/en-US/docs/Glossary/Transferable_objects)\n* [Running Go in the Browser with WASM and Web Workers](https://qvault.io/golang/running-go-in-the-browser-wasm-web-workers/)\n* [Using WebAssembly with Web Workers](https://www.sitepen.com/blog/using-webassembly-with-web-workers)\n* [Shrink Your TinyGo WebAssembly Modules by 60%](https://www.fermyon.com/blog/optimizing-tinygo-wasm)\n* [Are We Wasm Yet ? - Part 1](https://elewis.dev/are-we-wasm-yet-part-1)\n* [Are We Wasm Yet ? - Part 2](https://elewis.dev/are-we-wasm-yet-part-2#heading-server-implementation)\n* [Standardizing WASI: A system interface to run WebAssembly outside the web](https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/)\n* [WASI](https://wasi.dev/)\n* [WebAssembly Linear Memory example](https://wasmbyexample.dev/examples/webassembly-linear-memory/webassembly-linear-memory.go.en-us.html#)\n* [How can I use GitHub Actions with Vercel?](https://vercel.com/support/articles/how-can-i-use-github-actions-with-vercel)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrunoluiz%2Fimagewand","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrunoluiz%2Fimagewand","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrunoluiz%2Fimagewand/lists"}