{"id":23088504,"url":"https://github.com/jamowei/webapp","last_synced_at":"2026-04-08T16:31:05.385Z","repository":{"id":262706596,"uuid":"888088255","full_name":"jamowei/webapp","owner":"jamowei","description":"Simple WebApp (SPA) Template using eslint, jsx and tailwind, packed in lightweight Docker image with provided Helm chart for use in Kubernetes","archived":false,"fork":false,"pushed_at":"2025-10-04T21:31:42.000Z","size":650,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-04T23:29:29.381Z","etag":null,"topics":["docker","docker-compose","docker-image","esbuild","helm-chart","jsx","kubernetes","spa","typescript","webapp"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/jamowei.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-13T19:47:13.000Z","updated_at":"2025-10-04T21:29:25.000Z","dependencies_parsed_at":"2024-11-13T21:22:48.214Z","dependency_job_id":"1d82d99c-4207-4c70-b192-45beafcf930b","html_url":"https://github.com/jamowei/webapp","commit_stats":{"total_commits":36,"total_committers":1,"mean_commits":36.0,"dds":0.0,"last_synced_commit":"e46096fc8a37966c2c45349ef75dee0e91969015"},"previous_names":["jamowei/spa-simple","jamowei/webapp"],"tags_count":5,"template":true,"template_full_name":null,"purl":"pkg:github/jamowei/webapp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamowei%2Fwebapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamowei%2Fwebapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamowei%2Fwebapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamowei%2Fwebapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jamowei","download_url":"https://codeload.github.com/jamowei/webapp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamowei%2Fwebapp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31564776,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"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":["docker","docker-compose","docker-image","esbuild","helm-chart","jsx","kubernetes","spa","typescript","webapp"],"created_at":"2024-12-16T20:17:00.960Z","updated_at":"2026-04-08T16:31:05.361Z","avatar_url":"https://github.com/jamowei.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![build](https://github.com/jamowei/spa-simple/actions/workflows/buildAndRelease.yaml/badge.svg)\n![GitHub Release](https://img.shields.io/github/v/release/jamowei/spa-simple)\n\n\n# 😎 WebApp made simple 🎉\nSimple WebApp (SPA) using [esbuild](https://esbuild.github.io/), [jsx-dom](https://www.npmjs.com/package/jsx-dom) and [tailwindcss](https://www.npmjs.com/package/tailwindcss)\n\n# 📑 Requirements\n* [NodeJS](https://nodejs.org/) for developing the webapp\n* [go-task](https://taskfile.dev/) for running tasks inside the `Taskfile.yml` file\n* [Docker](https://www.docker.com/) for building the image\n* [kubectl](https://kubernetes.io/de/docs/reference/kubectl/) for deploying to [Kubernetes](https://kubernetes.io/)\n\n# 🏗️ Structure\nAll source-files for the app resides in the `./src` folder.\n\nWhere the `./src/main/app.jsx` file is your main entry point\nfor your app which gets bundled via `esbuild`.\nAny custom css goes into the `./src/main/app.css` file and\nany static resources (e.g. html, images, etc.) goes into the `./src/resource` folder. \n\nThere is also a `./src/kubernetes/app.ts` file,\nwhich gets compiled to a Kubernetes manifest YAML file.\n\nThat's all! 😉\n\n# 💻 Development\nTo bundle the app in `./src/main/app.tsx`\njust run `go-task build` or following commands\n```\nnpm install\nnode build.mjs\n```\nThis produces all files for the browser inside the `out` folder.\n\nIf you want to enable [live-reload](https://esbuild.github.io/api/#live-reload),\njust run `go-task serve` or\n```\nnode build.mjs serve\n```\n\n# 🐋 Docker\n## 🐋 Build 🛠️\nJust run `go-task docker-build` or following commands\n```\ndocker build -t ${NAME}:latest .\n```\nDocker image size is `~112 kB`! 🤯\n\n## 🐋 Run\nJust run `go-task docker-run` or following command\n```\ndocker run --name ${NAME} -dt --rm --init -p ${PORT}:3000 ${NAME}:latest\n```\nAlternatively, you can also use `docker compose up` to start the container, by using the `./docker-compose.yaml`.\n\n## 🐋 Stop\nJust run `go-task docker-stop` or following command\n```\ndocker container stop ${NAME}\n```\n\nOr use `docker compose stop` to stop the container, when using the `./docker-compose.yaml`.\n\n## 🐋 Cleanup 🧹\nJust run `go-task docker-clean` or following command\n```\ndocker image prune\n```\n\n# ☸️ Kubernetes\n## ☸️ Build 🛠️\nTo bundle the kubernetes manifest in `./src/kubernetes/app.ts`\njust run `go-task k8s` or following commands\n```\nnpm install\nnode build.mjs k8s\n```\nThis produces the yaml kubernetes manifest file inside the `out` folder.\n\n## ☸️ Apply via kubectl\nJust run `go-task k8s-apply namespace=dev-test` ('namespace' is optional) or following command\n```\nkubectl apply -f out/${NAME}.k8s.yaml --namespace $(namespace)\n```\n\n## ☸️ Delete via kubectl\nJust run `go-task k8s-delete namespace=dev-test` ('namespace' is optional) or following command\n```\nkubectl delete -f out/${NAME}.k8s.yaml --namespace $(namespace)\n```\n\n# ⚙️ Github Release + Package\nWhenever a new commit is pushed on the `main` branch or a pull request is created, the Github workflow gets triggered.\nThe workflow (`./.github/workflows/buildAndRelease.yaml`) builds the app, Docker image and Kubernetes manifest.\n\nTo create a Github Release and publish the app, Docker image and Kubernetes manifest,\nyou only have to tag the specific commit with `*.*.*` notation ([SemanticVersion](https://semver.org/)).\n\nJust run `go-task release version=1.0.0` or following commands\n```\ngit tag v1.0\ngit push origin tag v1.0\n```\n\nIt is also possible to delete a release.\nJust run `go-task release-delete version=1.0.0` or following commands\n```\ngit tag -d v1.0\ngit push --delete origin v1.0\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamowei%2Fwebapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjamowei%2Fwebapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamowei%2Fwebapp/lists"}