{"id":20841815,"url":"https://github.com/ainsleydev/webkit","last_synced_at":"2026-02-27T16:18:00.889Z","repository":{"id":228974520,"uuid":"775431861","full_name":"ainsleydev/webkit","owner":"ainsleydev","description":"A webkit framework and SDK for ainsley.dev. WebKit is a tool that transforms a single app.json manifest into production-ready infrastructure and CI/CD pipelines. ","archived":false,"fork":false,"pushed_at":"2026-02-05T18:55:14.000Z","size":4965,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-05T19:03:45.416Z","etag":null,"topics":["golang","payload","svelte-kit","webkit"],"latest_commit_sha":null,"homepage":"https://webkit.ainsley.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ainsleydev.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":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2024-03-21T11:31:41.000Z","updated_at":"2026-02-05T13:05:30.000Z","dependencies_parsed_at":"2026-01-18T19:02:53.043Z","dependency_job_id":null,"html_url":"https://github.com/ainsleydev/webkit","commit_stats":null,"previous_names":["ainsleydev/webkit"],"tags_count":100,"template":false,"template_full_name":null,"purl":"pkg:github/ainsleydev/webkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fwebkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fwebkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fwebkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fwebkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ainsleydev","download_url":"https://codeload.github.com/ainsleydev/webkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ainsleydev%2Fwebkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29190842,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T07:37:03.739Z","status":"ssl_error","status_checked_at":"2026-02-07T07:37:03.029Z","response_time":63,"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":["golang","payload","svelte-kit","webkit"],"created_at":"2024-11-18T01:21:59.414Z","updated_at":"2026-02-07T09:06:08.507Z","avatar_url":"https://github.com/ainsleydev.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://webkit.ainsley.dev\"\u003e\n    \u003cimg src=\"./resources/symbol.png\" height=\"96\"\u003e\n    \u003ch3 align=\"center\"\u003eWebKit\u003c/h3\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Infrastructure-as-code framework for full-stack web applications\n\u003c/p\u003e\n\n\u003cp align=\"center\" style=\"margin-bottom: 1rem;\"\u003e\n  \u003ca href=\"https://webkit.ainsley.dev\"\u003e\u003cstrong\u003eDocumentation\u003c/strong\u003e\u003c/a\u003e ·\n  \u003ca href=\"https://webkit.ainsley.dev/getting-started\"\u003e\u003cstrong\u003eGetting Started\u003c/strong\u003e\u003c/a\u003e ·\n  \u003ca href=\"https://webkit.ainsley.dev/examples\"\u003e\u003cstrong\u003eExamples\u003c/strong\u003e\u003c/a\u003e ·\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/ainsleydev/webkit)](https://goreportcard.com/report/github.com/ainsleydev/webkit)\n[![Release](https://img.shields.io/github/v/release/ainsleydev/webkit?color=brightgreen\u0026label=Release)](https://github.com/ainsleydev/webkit/releases)\n[![Maintainability](https://api.codeclimate.com/v1/badges/f5912a1dec11b8003850/maintainability)](https://codeclimate.com/github/ainsleydev/webkit/maintainability)\n[![Coverage](https://codecov.io/gh/ainsleydev/webkit/branch/main/graph/badge.svg)](https://codecov.io/gh/ainsleydev/webkit)\n![Made with Go](https://img.shields.io/badge/Made%20with-Go-00ADD8.svg?logo=go)\n[![Go Reference](https://pkg.go.dev/badge/github.com/ainsleydev/webkit.svg)](https://pkg.go.dev/github.com/ainsleydev/webkit)\n[![License](https://img.shields.io/github/license/ainsleydev/webkit?color=orange)](https://github.com/ainsleydev/webkit/blob/main/LICENSE)\n[![ainsley.dev](https://img.shields.io/badge/-ainsley.dev-black?style=flat\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH5wEYDzUGL1b35AAABA1JREFUWMPtlttvFVUUxn977ZnZu+W0tLalqRovBAUvQag0xNQbpSIosSSIJC198YknJfHJxDf9A/DBJ0x8MbFACjVqvCASq6FYFLFBvJAaAomkFCmhHGpLO+PDzOmZzpn2nKP4pCs5ycmevb7vW99as/fA//FfD1XO5p1nzuA3NWJHx5T8cVkRBPHHQfRjd0tzyZhOOQIy27bAxET9zCuvvhY0r2kC/OiRABeAN4BL/4oDr9+3lGszPs7UVNfUE23v3Nj5koszR/8N4EXg3XJckFIFuCLUuU7GWNNtTg25cu4syJx0F+gGMuU4UJKAt1Yux1UKV6TVat1qs+OYwQESMwDQCjwKsOv4iZsnwGihwbiuEek2WjJGhMrvv0UujYKa08VFkQvuTXNgz6oVeCIo1CqrZYMRwTiaytERKn44kRQAsAFYDbBrsLgLRQU0GI919TXKiHQaUQ1GBCuCCQKqjg/MqInrM4lZrgc6A1CljHhRAZ4Ip65m77FaOmbJdehC5vzZr1RAf/T6x6NDwb3/uAVfP74GnwCjZasRuXuWXASj9XQme+3t6erqPcB0IvUuYCsUH8YFBRhRNBqvyYpsn0MeOnG6wvc/9x33MPBjSvp24Na/7cDP7Y/gKIURecZoeTBObkSwWg7UNjaOeFfGLgK9KRAPAM8Wc2FeAUaEWtddbEV2WBFtREXkCqvlghE5yOQkvucBHAR+T0BooAtYXLYDI5sewxWFJ/Kk1bI2UTlW5DMFp03+JPwJ+DQFai2wbiEXUgVUas0trmuslm4jUmGi/tuwDVmrpafBuNPVrs7N/wzQA2QTUJbwYLIlOxB0tOGJ4IhqsSJts+T54Rv0lBz1RFh9ZJA385fOAHAshaMNaAF4OcWFQgeUwhMlrlJdnqjaOLkR8Y2WvbWec9VIQeo4sJf8FZ2LmmgWJO1cmm8I7wc2a6XwosGL+v+rFfnYUYplh47Obo5dvZ8Av6TgbSZ8KxYWEGxZn/u7Dbg9t8HNnwF9S2qqzqVUn4vzQF/K+m3AC1A4jGlId0QC8l0BXKVGrahe//okNR99WZAUc6EXuJiC+zxw57wOxKp/DliRAvCFKDUkxS+YIeBwyvryCHuOC0kH6oBOCj/V/gTeA6aK0oefZj3ARGJdRdh1BQ7Eqm8HHk4B/Q7oB1B9acWFEWtDf5STjGbgqbgLcQcqCQ8NL5EUAPuBsRKqz8UVYB+F97QXcSyatSXoWJ8zvB04AFQlkoaBp4HhhaqPR1TdUsLjeVni8TjhVX0odCAkd4AdKeQAHxIwXEb1Odt+Az5IeVQVcTmhgDBWAhtTNl8G9qGAwKfU2N3SnJvi/RFGMjYCD8UFdACNKRsHgZMA6v0j5ZpAlPtNyvqSiJO/AKik60y0ALlUAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIzLTAxLTI0VDE1OjUzOjA2KzAwOjAwm5vntAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMy0wMS0yNFQxNTo1MzowNiswMDowMOrGXwgAAABXelRYdFJhdyBwcm9maWxlIHR5cGUgaXB0YwAAeJzj8gwIcVYoKMpPy8xJ5VIAAyMLLmMLEyMTS5MUAxMgRIA0w2QDI7NUIMvY1MjEzMQcxAfLgEigSi4A6hcRdPJCNZUAAAAASUVORK5CYII=)](https://ainsley.dev)\n[![Twitter Handle](https://img.shields.io/twitter/follow/ainsleydev)](https://twitter.com/ainsleydev)\n\n\u003c/div\u003e\n\n## WebKit\n\nWebKit is a CLI tool that transforms a single `app.json` manifest into production-ready\ninfrastructure and CI/CD pipelines. It generates Terraform configurations, GitHub Actions workflows,\nand project files - all without cluttering your project repository with infrastructure code.\n\n**Key Features:**\n\n- **Single source of truth**: Define apps, resources, and environments in `app.json`\n- **Clean repositories**: No `infra/` folder needed - workflows contain everything\n- **Infrastructure as code**: Automated Terraform generation with centralized modules\n- **Secrets management**: Built-in SOPS/Age encryption with environment-specific decryption\n- **CI/CD automation**: GitHub Actions workflows for plans, deploys, and drift detection\n- **Developer experience**: Idempotent updates, local testing, and zero-config defaults\n\n\u003e **Note:** For user documentation and guides,\n\u003e visit [webkit.ainsley.dev](https://webkit.ainsley.dev)\n\n\n## Packages\n\n- ![npm](https://img.shields.io/npm/v/@ainsleydev/payload-helper?label=@ainsleydev/payload-helper\u0026logo=npm\u0026style=badge)\n- ![npm](https://img.shields.io/npm/v/@ainsleydev/eslint-config?label=@ainsleydev/eslint-config\u0026logo=npm\u0026style=badge)\n- ![npm](https://img.shields.io/npm/v/@ainsleydev/prettier-config?label=@ainsleydev/prettier-config\u0026logo=npm\u0026style=badge)\n\n\n## Installation\n\n**Quick install:**\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/ainsleydev/webkit/main/bin/install.sh | sh\n```\n\nOr download binaries from\nthe [latest release](https://github.com/ainsleydev/webkit/releases/latest).\n\n**Verify installation:**\n\n```bash\nwebkit version\n```\n\n## Development Setup\n\nRun the following to get setup with `webkit`.\n\n```bash\nmake setup\n```\n\n### Prerequisites\n\n- **Go** 1.23 or higher\n- **pnpm** (for task runners and local workflow testing)\n- **act** (for testing GitHub Actions locally)\n- **age** (for secrets encryption)\n\n### Project Structure\n\n```\nwebkit/\n├── cmd/webkit/          # CLI entry point\n├── internal/\n│   ├── appdef/          # App manifest parsing and validation\n│   ├── cmd/             # CLI command implementations\n│   │   ├── cicd/        # GitHub Actions workflow generation\n│   │   ├── env/         # Environment variable management\n│   │   ├── docs/        # Documentation generation\n│   │   ├── files/       # Project file generation\n│   │   ├── infra/       # Terraform infrastructure commands\n│   │   └── secrets/     # SOPS encryption/decryption\n│   ├── infra/           # Terraform wrapper and state management\n│   ├── manifest/        # File tracking and manifest source tagging\n│   ├── scaffold/        # Template scaffolding system\n│   ├── secrets/         # SOPS/Age integration\n│   ├── templates/       # Embedded project templates\n│   └── util/            # Shared utilities\n└── platform/            # Terraform modules (separate infra repository)\n    ├── providers/       # Provider-specific modules (DO, B2, etc.)\n    └── modules/         # Orchestration modules (apps, resources)\n```\n\n### Architecture Overview\n\n**Key Components:**\n\n- **appdef**: Defines the structure of `app.json` and handles unmarshaling with validation\n- **scaffold**: Template rendering engine with file tracking and idempotent updates\n- **manifest**: Tracks which files are generated and their sources (app/resource/project)\n- **secrets**: SOPS integration for encrypting/decrypting environment variables\n- **infra**: Terraform wrapper that manages state and tfvars generation\n\n## Local Workflow Testing\n\nYou can simulate GitHub Actions workflows locally using [act](https://github.com/nektos/act). `act`\nruns from your local computer, whatever files are currently in your working directory, including\nany uncommitted changes.\n\n```bash\n# Test lint workflow\npnpm act:lint\n\n# Test test workflow\npnpm act:test\n\n# Dry-run release workflow (shows what would run without executing)\npnpm act:release\n```\n\n## Releasing\n\n*For maintainers only*\n\nWebKit uses [GoReleaser](https://goreleaser.com/) for automated releases. The release process is\ntriggered by creating and pushing a git tag.\n\n### Quick Release\n\nUse the interactive tag tool:\n\n```bash\npnpm tag\n```\n\nThis will guide you through:\n\n1. Choosing between creating or deleting a tag.\n2. Selecting the version bump type (`patch`, `minor`, or `major`).\n3. Confirming the version.\n4. Creating and pushing the tag.\n\nWhen a tag is pushed, the version will be injected then GitHub Actions automatically triggers the\nGoReleaser workflow, builds binaries for each platform and creates a GitHub release with the\nbinaries attached.\n\n### Semantic Versioning\n\nWebKit follows [Semantic Versioning](https://semver.org/).\n\n- **Patch** (v1.0.1): Bug fixes and minor changes\n- **Minor** (v1.1.0): New features, backwards compatible\n- **Major** (v2.0.0): Breaking changes\n\n## Publishing npm packages\n\nWebKit uses [Changesets](https://github.com/changesets/changesets) for automated package versioning and publishing. When merging changes to npm packages in the `packages/` directory, create a changeset to document the change and specify the version bump type. See [packages/README.md](packages/README.md) for detailed instructions.\n\n## Copyright\n\nYou may not, except with our express written permission, distribute or commercially exploit the\ncontent found within this repository or any written text within this repository. Nor may you\ntransmit\nit or store it in any other website or other form of electronic retrieval system.\n\nAny redistribution or reproduction of part or all of the contents in any form is prohibited other\nthan the following:\n\n- You may print or download to a local hard disk extracts for your personal and non-commercial use\n  only.\n- You may copy the content to individual third parties for their personal use, but only if you\n  acknowledge the website\n  as the source of the material,\n\n## License\n\nCode Copyright 2023 ainsley.dev. Code released under the [BSD-3 Clause](LICENSE).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fainsleydev%2Fwebkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fainsleydev%2Fwebkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fainsleydev%2Fwebkit/lists"}