{"id":41229007,"url":"https://github.com/michilu/boilerplate","last_synced_at":"2026-01-23T00:45:32.480Z","repository":{"id":57496586,"uuid":"145190056","full_name":"michilu/boilerplate","owner":"michilu","description":"PWA via Angular/Dart 2 with GopherJS, CLI and Shared Lib","archived":false,"fork":false,"pushed_at":"2023-05-05T02:24:51.000Z","size":451,"stargazers_count":8,"open_issues_count":4,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-14T03:52:40.722Z","etag":null,"topics":["angulardart","cgo","dart","firebase","go","gopherjs","netlify","pwa"],"latest_commit_sha":null,"homepage":"https://boilerplate-go.firebaseapp.com/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/michilu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2018-08-18T04:32:49.000Z","updated_at":"2021-08-11T01:29:37.000Z","dependencies_parsed_at":"2024-06-19T05:20:13.975Z","dependency_job_id":"efd547ba-9d86-486a-9a84-213a7d5f54a1","html_url":"https://github.com/michilu/boilerplate","commit_stats":null,"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/michilu/boilerplate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michilu%2Fboilerplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michilu%2Fboilerplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michilu%2Fboilerplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michilu%2Fboilerplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michilu","download_url":"https://codeload.github.com/michilu/boilerplate/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michilu%2Fboilerplate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28676145,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T20:48:19.482Z","status":"ssl_error","status_checked_at":"2026-01-22T20:48:14.968Z","response_time":144,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["angulardart","cgo","dart","firebase","go","gopherjs","netlify","pwa"],"created_at":"2026-01-23T00:45:31.764Z","updated_at":"2026-01-23T00:45:32.471Z","avatar_url":"https://github.com/michilu.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# boilerplate\n\n# Install\nUse `go get -u github.com/michilu/boilerplate`.\n\nOR\n\n```console\n$ git clone --depth=1 https://github.com/michilu/boilerplate.git\n$ cd boilerplate\n$ make\n```\n\n# develop\n\n## dependencies\n\n### require go1.14\n- [Go 1\\.14 Release Notes \\- The Go Programming Language](https://golang.org/doc/go1.14#runtime)\n  - \u003e Goroutines are now asynchronously preemptible. As a result, loops without function calls no longer potentially deadlock the scheduler or significantly delay garbage collection.\n\n### protobuf\n\n- [Package google\\.protobuf  \\|  Protocol Buffers  \\|  Google Developers](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf) require `libprotoc==3.11.3`, `$ brew upgrade protobuf`\n- [Protocol Buffers Version 3 Language Specification  \\|  Protocol Buffers  \\|  Google Developers](https://developers.google.com/protocol-buffers/docs/reference/proto3-spec)\n- [envoyproxy/protoc\\-gen\\-validate: protoc plugin to generate polyglot message validators](https://github.com/envoyproxy/protoc-gen-validate) require `==v0.1.0`\n- [protocolbuffers/protobuf: Protocol Buffers \\- Google's data interchange format](https://github.com/protocolbuffers/protobuf) `$ brew install protobuf`\n- [uber/prototool: Your Swiss Army Knife for Protocol Buffers](https://github.com/uber/prototool) `$ brew install prototool`\n\n- [mitchellh/gox: A dead simple, no frills Go cross compile tool](https://github.com/mitchellh/gox)\n- [rjeczalik/interfaces: Code generation tools for Go.](https://github.com/rjeczalik/interfaces)\n- [robertkrimen/godocdown: Format package documentation (godoc) as GitHub friendly Markdown](https://github.com/robertkrimen/godocdown)\n- [sanbornm/go-selfupdate: Enable your Go applications to self update](https://github.com/sanbornm/go-selfupdate)\n\n### go generate\n\n```console\n$ go get -u github.com/cheekybits/genny\n$ GO111MODULE=on go get -u github.com/rjeczalik/interfaces/cmd/interfacer\n```\n\n## build\n\n- `make`\n\n- `make golang`       build Go code\n- `make proto`        generate Go codes from proto\n- `make generate`     generate Go codes via go-generate\n- `make gox`:         cross compile\n- `make channel`:     push out self update files to develop channel\n- `make release`:     push out self update files to release channel\n- `make uml`:         generate PlantUML from Go codes\n- `make godoc`:       generate GoDoc from Go codes\n\n- `make gopherjs`\n- `make serve`\n\n- `make clean`:     clean up\n\n## launch\n\n```console\n$ ./assets/daemon/loop ./boilerplate --debug --verbose --trace --profiler --update run\n```\n\n## Architecture\n\n### DDD\n\nEach directory contains:\n- `domain`: Domain Service, Domain Rule, Entity, Value Object, Repository Interface\n  - Layered architecture: Domain\n  - Hexagonal architecture: Domain Model\n  - Onion architecture: Domain Model, Domain Service\n  - Clean architecture: Entities\n- `application`: Application, Handler of Entity/Value Object, Dataflow\n  - Layered architecture: Application\n  - Hexagonal architecture: Application\n  - Onion architecture: Application Service\n  - Clean architecture: Use Cases, Controllers\n- `infra`: Repository\n  - Layered architecture: Infrastructure\n  - Hexagonal architecture: Adapter\n  - Onion architecture: Infrastructure\n  - Clean architecture: Gateways\n- `presentation`: Endpoint\n  - Layered architecture: User Interface, Presentation\n  - Hexagonal architecture: Adapter\n  - Onion architecture: User Interface\n  - Clean architecture: Presentaters\n- `usecase`: Use Case, Requirements\n  - The context in Agile software development, not DDD.\n\n### Event-driven architecture\nNOT the Event Sourcing System.\n\n# deploy\n\n```console\n$ make deploy\n```\n\n# environment variables for Wercker\n\nsee: https://app.wercker.com/\u003corganization\\\u003e/\u003capplication\\\u003e/environment\n\n- `FIREBASE_PROJECT`: needs by the deploy step. see: https://console.firebase.google.com/\n- `FIREBASE_TOKEN`: needs by the deploy step, via `firebase login:ci`. see: https://github.com/firebase/firebase-tools#using-with-ci-systems\n- `NETLIFY_BRANCH_DEPLOY_SITE_ID`: `API ID(UUID4)` on https://app.netlify.com/sites/\u003csite-name\\\u003e/settings/general\n- `NETLIFY_TOKEN`: https://app.netlify.com/account/applications/personal\n- `SLACK_TOKEN`: needs by the ['slackcli'](https://github.com/cixtor/slackcli) command. see: https://api.slack.com/custom-integrations/legacy-tokens\n- `SLACK_URL`: needs by the 'slack-notifier' step. see: https://slack.com/apps/A0F7XDUAZ-incoming-webhooks\n\n# setup the workflows on Wercker\n\nsee: https://app.wercker.com/\u003corganization\\\u003e/\u003capplication\\\u003e/workflows\n\n![](assets/wercker-pipeline.png)\n![](assets/wercker-workflow.png)\n\n# tools\n- [mitchellh/gox: A dead simple, no frills Go cross compile tool](https://github.com/mitchellh/gox)\n- [sanbornm/go-selfupdate: Enable your Go applications to self update](https://github.com/sanbornm/go-selfupdate)\n- [PlantUML - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml)\n  - [kazukousen/gouml: Automatically generate PlantUML from Go Code\\.](https://github.com/kazukousen/gouml) `go get -u github.com/kazukousen/gouml/cmd/gouml`\n- [XML Pretty Print](https://jsonformatter.org/xml-pretty-print)\n\n# optimize\n\n- https://github.com/gopherjs/gopherjs/wiki/JavaScript-Tips-and-Gotchas\u003cPaste\u003e\n  - https://github.com/cathalgarvey/fmtless\n\n1. minify: https://github.com/gopherjs/gopherjs#performance-tips\n\n:\n\n    7,196,874 bytes:  100%:   $ gopherjs build\n    4,661,791 bytes:   65%:   $ gopherjs build --minify\n\n2. UglifyJS 3: https://github.com/mishoo/UglifyJS2\n\n:\n\n    4,547,810 bytes:   63%:   $ gopherjs build --minify \u0026\u0026 uglifyjs\n    4,274,152 bytes:   59%:   $ gopherjs build --minify \u0026\u0026 uglifyjs --compress\n    3,843,890 bytes:   53%:   $ gopherjs build --minify \u0026\u0026 uglifyjs --compress --mangle\n\n# sync subtree\n\nAdd upstream:\n```console\n$ git clone git@github.com:michilu/boilerplate.git .\n$ git remote add upstream https://github.com/dart-lang/angular.git\n$ git checkout upstream/master\n$ git subtree split --prefix=examples/hacker_news_pwa -b examples/hacker_news_pwa\n```\n\nSync to upstream:\n```console\n$ git fetch upstream master\n$ git checkout upstream/master\n$ git subtree push --prefix=examples/hacker_news_pwa origin examples/hacker_news_pwa\n$ git checkout upstream\n$ git subtree pull --prefix=app origin examples/hacker_news_pwa\n```\n\nref:\n- https://github.com/dart-lang/angular/tree/master/examples/hacker_news_pwa\n\n## for proto\n\nAdd upstream:\n```console\n$ git remote add googleapis https://github.com/googleapis/googleapis\n$ git fetch --depth=1 --no-tags googleapis\n$ git checkout googleapis/master\n$ git subtree split --prefix=google/type -b google/type\n```\n\nAdd subtree:\n```console\n$ git checkout dev\n$ git subtree add --prefix=vendor/github.com/googleapis/googleapis/google/type google/type\n```\n\nSync to upstream:\n```console\n$ git fetch --no-tags googleapis\n(TBD)\n$ git subtree pull --prefix=vendor/github.com/googleapis/googleapis/google/type origin google/type\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichilu%2Fboilerplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichilu%2Fboilerplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichilu%2Fboilerplate/lists"}