{"id":50428291,"url":"https://github.com/varabyte/kobweb-showcase-db","last_synced_at":"2026-05-31T12:01:46.433Z","repository":{"id":356859469,"uuid":"1232571056","full_name":"varabyte/kobweb-showcase-db","owner":"varabyte","description":"The issue tracker / json database that drives the data used by the Kobweb showcase site","archived":false,"fork":false,"pushed_at":"2026-05-21T02:21:34.000Z","size":58,"stargazers_count":1,"open_issues_count":24,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-21T05:50:52.283Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://showcase.kobweb.varabyte.com/","language":null,"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/varabyte.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":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T04:04:48.000Z","updated_at":"2026-05-21T03:23:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/varabyte/kobweb-showcase-db","commit_stats":null,"previous_names":["varabyte/kobweb-showcase-db"],"tags_count":0,"template":false,"template_full_name":"lifestreamy/issueops-json-db-template","purl":"pkg:github/varabyte/kobweb-showcase-db","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/varabyte%2Fkobweb-showcase-db","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/varabyte%2Fkobweb-showcase-db/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/varabyte%2Fkobweb-showcase-db/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/varabyte%2Fkobweb-showcase-db/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/varabyte","download_url":"https://codeload.github.com/varabyte/kobweb-showcase-db/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/varabyte%2Fkobweb-showcase-db/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33730241,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-05-31T12:01:45.460Z","updated_at":"2026-05-31T12:01:46.400Z","avatar_url":"https://github.com/varabyte.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kobweb Showcase Database\r\n\u003e **A fully GitHub-hosted CRUD-compatible JSON database powering the official Kobweb Showcase.**\r\n\u003e *Tailored from the [IssueOps JSON Database Template](https://github.com/lifestreamy/issueops-json-db-template) made by Tim Korelov.*\r\n\u003e\r\n\u003e 💡 **Build your own:** You can use the original template linked above to instantly set up a completely free,\r\n\u003e  serverless backend for your own portfolios, directory sites, or collections!\r\n\r\nA serverless JSON database that leverages GitHub Actions and IssueOps to manage website submissions for the Kobweb Showcase frontend.\r\n\r\n---\r\n\r\n## Table of Contents\r\n- [How to Submit Your Website](#how-to-submit-your-website)\r\n- [The User Submission Pipeline](#the-user-submission-pipeline)\r\n- [Showcase Management Commands](#showcase-management-commands)\r\n- [Image Parsing \u0026 Validation](#image-parsing--validation)\r\n- [Directory Structure](#directory-structure)\r\n\r\n---\r\n\r\n## How to Submit Your Website\r\n\r\nIf you are a developer looking to get your Kobweb project featured on the official showcase, you are in the right place!\r\n\r\n1. Navigate to the **Issues** tab at the top of this repository.\r\n2. Click the green **New issue** button.\r\n3. Click the \"Submit a Kobweb Project\" option.\r\n4. Fill out the required fields (Name, Live URL, Screenshot, Description, and Site Type).\r\n5. Click **Submit new issue**.\r\n\r\n*(A maintainer will review your submission shortly. Once approved, the automated bot will instantly add it to the database!)*\r\n\r\n\u003e \u003cimg width=\"1981\" height=\"440\" alt=\"image\" src=\"https://github.com/user-attachments/assets/aab20763-65f9-4e38-b8eb-532422d6fbdb\" /\u003e\r\n\r\n\r\n---\r\n\r\n## The User Submission Pipeline\r\n\r\nInstead of hosting a custom web form and external database, this repository relies entirely on **user-created GitHub Issues** for data entry.\r\nWhen a developer wants to submit a website to the showcase, they simply fill out the repository's structured Issue Form.\r\n\r\n`resources/db/showcased-sites.json` acts as the persistent database storing these user submissions.\r\nIt is not modified manually, but rather through automated workflows triggered by maintainer comments on the user's issue.\r\n\r\n---\r\n\r\n## Showcase Management Commands\r\n\r\nMaintainers review submissions and use specific commands to trigger database updates.\r\nExecution is strictly limited to users with **OWNER**, **COLLABORATOR**, or **MEMBER** roles.\r\n\r\n\u003e **Note on Workflow Concurrency:** The `/approve` and `/revoke` workflows are concurrency-locked at the job-level. This ensures safe sequential execution, preventing `git push` race conditions when multiple issues are managed simultaneously. `/check` runs asynchronously.\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cb\u003e\u003ccode\u003e/check\u003c/code\u003e (Dry Run \u0026 Validation)\u003c/b\u003e\u003c/summary\u003e\r\n\r\nParses the issue form and dry-runs validation logic without touching the database. Outputs the resulting JSON for visual inspection.\r\n\r\n| Outcome | Bot Response |\r\n| :--- | :--- |\r\n| **Passed** | ✅ Validation Passed! The form is correctly filled... |\r\n| **Failed** | ❌ Check Failed. Please fix the following issues: [List] |\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cb\u003e\u003ccode\u003e/approve\u003c/code\u003e (Database Mutation)\u003c/b\u003e\u003c/summary\u003e\r\n\r\nParses the form, validates all fields, and commits the data to the JSON file.\r\n\r\n| Outcome | Bot Response |\r\n| :--- | :--- |\r\n| **Added** | ✅ The site has been approved and added to the showcase. |\r\n| **Updated** | ✅ The site has been successfully updated in the showcase. |\r\n| **Unchanged** | ✅ Nothing has changed since the last submission... |\r\n| **Failed** | ❌ Approval Failed. Please fix the following issues: [List] |\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cb\u003e\u003ccode\u003e/revoke\u003c/code\u003e (Database Deletion)\u003c/b\u003e\u003c/summary\u003e\r\n\r\nLocates the dictionary matching the current issue ID and removes it from the JSON file.\r\n\r\n| Outcome | Bot Response |\r\n| :--- | :--- |\r\n| **Revoked** | ✅ The site has been successfully revoked and removed... |\r\n| **Not Found** | ✅ There is no submission to revoke for this issue. |\r\n\u003c/details\u003e\r\n\r\n---\r\n\r\n## Image Parsing \u0026 Validation\r\n\r\nThe automation script extracts the primary image directly from the raw markdown body by searching for the auto-generated `src=` HTML attribute wrapping the image link.\r\nFor security and performance, image URLs are strictly validated against a whitelist of approved GitHub CDN prefixes (e.g., `https://github.com/user-attachments/assets/`).\r\n\r\n---\r\n\r\n## Directory Structure\r\n\r\n```text\r\n.\r\n├── .github/\r\n│   ├── ISSUE_TEMPLATE/\r\n│   │   └── submit-entry.yml    # The frontend form users fill out to submit their site\r\n│   ├── scripts/\r\n│   │   ├── approve_entry.py    # Mutates the JSON database (Appends/Updates)\r\n│   │   ├── check_entry.py      # Dry-runs validation and outputs the parsed dictionary\r\n│   │   ├── common.py           # Shared helper functions (JSON loading/saving, errors)\r\n│   │   ├── config.py           # Enums, CDN rules, messages, and UI-to-DB string mapping\r\n│   │   ├── revoke_entry.py     # Removes an entry from the JSON db by Issue Number\r\n│   │   └── validator.py        # Pure function that parses form data and batches errors\r\n│   └── workflows/\r\n│       ├── approve.yml         # Triggers on `/approve` issue comment\r\n│       ├── check.yml           # Triggers on `/check` issue comment\r\n│       └── revoke.yml          # Triggers on `/revoke` issue comment\r\n├── docs/\r\n│   └── testing_github_actions.md # Guide on safely testing workflows using a public fork\r\n├── resources/\r\n│   └── db/\r\n│       └── showcased-sites.json  # The database! Stores all approved Kobweb submissions\r\n└── README.md\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvarabyte%2Fkobweb-showcase-db","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvarabyte%2Fkobweb-showcase-db","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvarabyte%2Fkobweb-showcase-db/lists"}