# wdhdev/free-for-life architecture

> Architecture diagram of the GitHub repository wdhdev/free-for-life, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-17). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/wdhdev/free-for-life
- Repository: https://github.com/wdhdev/free-for-life

## Overview

1. This repository is a content-heavy, static curated-list project rather than an application with runtime business logic. The core asset is a large set of categorized markdown lists of “free forever” services and tools.

2. The primary source-of-truth content lives under `data/`. Each file maps to one category shown in the README, such as APIs, AI, BaaS, DNS, Databases, Forms, Email, PaaS, and SSL. The `_start.md` and `_end.md` files act as framing markers for generated output.

3. `README.md` is treated as a generated artifact, not a hand-edited document. The warning block at the top and the `<!-- data:start -->` / `<!-- data:end -->` markers indicate that category content is assembled into the README from the `data/` files.

4. `scripts/update-readme.sh` is the main build/generation step. Its job is to transform the category markdown sources into the published README, keeping the table of contents and section content synchronized with the files in `data/`.

5. The `website/` directory is the public-facing static site layer. It contains a single `index.html` plus media assets, which suggests a lightweight static frontend that mirrors or presents the same curated list content outside GitHub.

6. The repository therefore has two presentation surfaces for the same underlying content: GitHub’s rendered `README.md`, and the standalone website under `website/`. The content pipeline feeds both.

7. GitHub Actions in `.github/workflows/main.yml` and `.github/workflows/website.yml` provide automation around that content pipeline. One workflow likely validates or regenerates the README, while the other publishes the website.

8. `CNAME` shows the site is mapped to a custom domain, so the static website is intended for direct public hosting rather than only GitHub viewing.

9. The boundary between “content” and “presentation” is important here: contributors are expected to edit category markdown under `data/`, while generated outputs (`README.md` and the website) are maintained by automation.

10. The resulting architecture is simple and deterministic: contributor edits flow into category markdown, a script assembles those files into the canonical README, and CI publishes the static website copy. No database, API server, or dynamic backend is part of the repo’s architecture.

Main entry points: [`scripts/update-readme.sh`](https://github.com/wdhdev/free-for-life/blob/main/scripts/update-readme.sh) (Update script), [`website/index.html`](https://github.com/wdhdev/free-for-life/blob/main/website/index.html) (Website), [`data/_start.md`](https://github.com/wdhdev/free-for-life/blob/main/data/_start.md) (Start marker), [`.github/workflows/main.yml`](https://github.com/wdhdev/free-for-life/blob/main/.github/workflows/main.yml) (README CI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_content["Content sources"]
  node_start_marker["Start marker<br/>framing marker<br/>[_start.md]"]
  node_end_marker["End marker<br/>framing marker<br/>[_end.md]"]
  node_apis["APIs<br/>category list"]
  node_ai["AI<br/>category list"]
  node_baas["BaaS<br/>category list<br/>[BaaS.md]"]
  node_data_stores["Data stores<br/>category cluster"]
  node_comm_tools["Comms<br/>category cluster"]
  node_platforms["Platforms<br/>category cluster"]
  node_security["Security<br/>category cluster"]
  node_other_lists["Other lists<br/>category cluster"]
end

subgraph group_build["Generation"]
  node_build_script["Update script<br/>build script<br/>[update-readme.sh]"]
end

subgraph group_surface["Published surfaces"]
  node_readme["README<br/>generated artifact<br/>[README.md]"]
  node_site["Website<br/>static site<br/>[index.html]"]
  node_media["Media<br/>assets"]
  node_domain["Domain<br/>hosting config"]
end

subgraph group_ci["Automation"]
  node_readme_ci["README CI<br/>GitHub Action<br/>[main.yml]"]
  node_website_ci["Site CI<br/>GitHub Action<br/>[website.yml]"]
end

node_start_marker -->|"frames"| node_apis
node_apis -->|"neighbors"| node_ai
node_ai -->|"neighbors"| node_baas
node_baas -->|"extends"| node_data_stores
node_data_stores -->|"extends"| node_comm_tools
node_comm_tools -->|"extends"| node_platforms
node_platforms -->|"extends"| node_security
node_security -->|"continues"| node_other_lists
node_other_lists -->|"closes"| node_end_marker
node_start_marker -->|"feeds"| node_build_script
node_build_script -->|"assembles"| node_readme
node_build_script -->|"mirrors"| node_site
node_readme_ci -->|"runs"| node_build_script
node_website_ci -->|"publishes"| node_site
node_site -->|"uses"| node_media
node_domain -->|"points to"| node_site
node_readme_ci -->|"checks"| node_readme

click node_start_marker "https://github.com/wdhdev/free-for-life/blob/main/data/_start.md"
click node_end_marker "https://github.com/wdhdev/free-for-life/blob/main/data/_end.md"
click node_apis "https://github.com/wdhdev/free-for-life/blob/main/data/APIs_Data_and_ML.md"
click node_ai "https://github.com/wdhdev/free-for-life/blob/main/data/Artificial_Intelligence.md"
click node_baas "https://github.com/wdhdev/free-for-life/blob/main/data/BaaS.md"
click node_readme "https://github.com/wdhdev/free-for-life/blob/main/README.md"
click node_site "https://github.com/wdhdev/free-for-life/blob/main/website/index.html"
click node_media "https://github.com/wdhdev/free-for-life/tree/main/website/media"
click node_build_script "https://github.com/wdhdev/free-for-life/blob/main/scripts/update-readme.sh"
click node_readme_ci "https://github.com/wdhdev/free-for-life/blob/main/.github/workflows/main.yml"
click node_website_ci "https://github.com/wdhdev/free-for-life/blob/main/.github/workflows/website.yml"
click node_domain "https://github.com/wdhdev/free-for-life/tree/main/CNAME"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_start_marker,node_end_marker,node_apis,node_ai,node_baas,node_data_stores,node_comm_tools,node_platforms,node_security,node_other_lists toneBlue
class node_build_script toneAmber
class node_readme,node_site,node_media,node_domain toneMint
class node_readme_ci,node_website_ci toneRose
```

## Components

### Content sources

Curated markdown lists that define the repository’s canonical service catalog.

- [Start marker](https://github.com/wdhdev/free-for-life/blob/main/data/_start.md): framing marker · Marks the beginning of generated README content. · `data/_start.md`
- [End marker](https://github.com/wdhdev/free-for-life/blob/main/data/_end.md): framing marker · Marks the end of generated README content. · `data/_end.md`
- [APIs](https://github.com/wdhdev/free-for-life/blob/main/data/APIs_Data_and_ML.md): category list · Curated free-forever APIs and data/ML services. · `data/APIs_Data_and_ML.md`
- [AI](https://github.com/wdhdev/free-for-life/blob/main/data/Artificial_Intelligence.md): category list · Curated artificial intelligence tools and services. · `data/Artificial_Intelligence.md`
- [BaaS](https://github.com/wdhdev/free-for-life/blob/main/data/BaaS.md): category list · Backend-as-a-Service offerings. · `data/BaaS.md`
- **Data stores**: category cluster · Core storage and data infrastructure categories.
- **Comms**: category cluster · Communication and productivity categories.
- **Platforms**: category cluster · Hosting and deployment platform categories.
- **Security**: category cluster · Domain and certificate-related categories.
- **Other lists**: category cluster · Additional curated markdown sections that round out the catalog.

### Generation

Automation that assembles source content into published outputs.

- [Update script](https://github.com/wdhdev/free-for-life/blob/main/scripts/update-readme.sh): build script · Transforms category markdown into the generated README. · `scripts/update-readme.sh`

### Published surfaces

Human-facing outputs rendered from the curated lists.

- [README](https://github.com/wdhdev/free-for-life/blob/main/README.md): generated artifact · Published GitHub-facing catalog assembled from data sources. · `README.md`
- [Website](https://github.com/wdhdev/free-for-life/blob/main/website/index.html): static site · Public-facing static presentation of the same curated content. · `website/index.html`
- [Media](https://github.com/wdhdev/free-for-life/tree/main/website/media): assets · Static site media assets used by the website. · `website/media`
- [Domain](https://github.com/wdhdev/free-for-life/tree/main/CNAME): hosting config · Custom domain binding for the public site. · `CNAME`

### Automation

GitHub Actions workflows that validate and publish the site.

- [README CI](https://github.com/wdhdev/free-for-life/blob/main/.github/workflows/main.yml): GitHub Action · Workflow that validates or regenerates the README output. · `.github/workflows/main.yml`
- [Site CI](https://github.com/wdhdev/free-for-life/blob/main/.github/workflows/website.yml): GitHub Action · Workflow that publishes the static website. · `.github/workflows/website.yml`

## Connections

- Start marker → APIs: frames · Begins the generated README content around the category sources.
- APIs → AI: neighbors · Representative category sequence in the source catalog.
- AI → BaaS: neighbors · Representative category sequence in the source catalog.
- BaaS → Data stores: extends · Additional data-centric categories continue the catalog.
- Data stores → Comms: extends · Broader list sections continue beyond infrastructure topics.
- Comms → Platforms: extends · Platform and hosting categories follow in the curated set.
- Platforms → Security: extends · Security and trust-related categories complete the catalog.
- Security → Other lists: continues · Remaining markdown sections are folded into the generated output.
- Other lists → End marker: closes · Ends the generated README content.
- Start marker → Update script: feeds · The generator reads framed source sections.
- Update script → README: assembles · Build step produces the canonical README artifact.
- Update script → Website: mirrors · Same curated content is prepared for the public site.
- README CI → Update script: runs · Workflow invokes the README generation step.
- Site CI → Website: publishes · Workflow deploys the static site output.
- Website → Media: uses · Website pulls in supporting static assets.
- Domain → Website: points to · Custom domain is bound to the hosted site.
- README CI → README: checks · CI keeps the generated README synchronized.
