# jgougerdie/inkforge-website architecture

> Architecture diagram of the GitHub repository jgougerdie/inkforge-website, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jgougerdie/inkforge-website
- Repository: https://github.com/jgougerdie/inkforge-website

## Overview

Sharpline is a static React site for concise business articles across marketing, tax and compliance, personal growth, and finance. Readers browse featured or categorized articles, filter the article list, then open an article; its body is shown only after login, with reader state persisted in localStorage. Login can optionally send a best-effort Formspree notification. The sampled source shows routing, article gating, and local auth; other README/tree-listed page capabilities are represented at their supported module paths without assuming their internals.

Main entry points: [`src/App.tsx`](https://github.com/jgougerdie/inkforge-website/blob/main/src/App.tsx) (App routing), [`src/pages/Article.tsx`](https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Article.tsx) (Article page), [`src/pages/Home.tsx`](https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Home.tsx) (Home), [`src/context/AuthContext.tsx`](https://github.com/jgougerdie/inkforge-website/blob/main/src/context/AuthContext.tsx) (Auth context)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_reading["Article discovery"]
  node_home["Home<br/>[Home.tsx]"]
  node_blog["Blog listing<br/>[Blog.tsx]"]
  node_video["Video tour<br/>[VideoTourModal.tsx]"]
end

subgraph group_content["Content and rendering"]
  node_article["Article page<br/>[Article.tsx]"]
  node_article_data["Article catalog<br/>[articles.ts]"]
  node_categories["Categories<br/>[categories.ts]"]
  node_article_content["Article renderer<br/>[ArticleContent.tsx]"]
  node_article_jsonld["Article structured data<br/>[ArticleJsonLd.tsx]"]
end

subgraph group_identity["Reader access"]
  node_login["Login page<br/>[Login.tsx]"]
  node_auth["Auth context<br/>[AuthContext.tsx]"]
  node_local_storage[("Browser storage")]
  node_notify["Login notifier<br/>[notifyLogin.ts]"]
end

subgraph group_site["Site shell"]
  node_app["App routing<br/>[App.tsx]"]
  node_header["Header navigation<br/>[Header.tsx]"]
  node_footer["Footer<br/>[Footer.tsx]"]
  node_analytics["Analytics<br/>[Analytics.tsx]"]
  node_metadata["Page metadata<br/>[PageMeta.tsx]"]
  node_not_found["Not found<br/>[NotFound.tsx]"]
end

node_reader(("Reader"))
node_formspree["Formspree"]

node_reader -->|"opens site"| node_app
node_app -->|"routes to"| node_home
node_app -->|"routes to"| node_blog
node_app -->|"routes to"| node_article
node_app -->|"routes to"| node_login
node_app -->|"routes to"| node_not_found
node_app -->|"provides auth"| node_auth
node_app -->|"renders"| node_header
node_app -->|"renders"| node_footer
node_app -->|"renders"| node_analytics
node_home -->|"selects featured"| node_article_data
node_home -->|"reads categories"| node_categories
node_home -->|"links to browse"| node_blog
node_home -->|"opens tour"| node_video
node_blog -->|"browses articles"| node_article_data
node_blog -->|"filters by category"| node_categories
node_article -->|"loads article"| node_article_data
node_article -->|"loads category"| node_categories
node_article -->|"checks access"| node_auth
node_article -->|"renders body"| node_article_content
node_article -->|"links when gated"| node_login
node_article -->|"sets page metadata"| node_metadata
node_article -->|"renders structured data"| node_article_jsonld
node_login -->|"logs reader in"| node_auth
node_login -->|"requests notification"| node_notify
node_auth -->|"reads and writes"| node_local_storage
node_notify -.->|"posts notification"| node_formspree
node_header -->|"reads and logs out"| node_auth
node_header -->|"links to sections"| node_home

click node_app "https://github.com/jgougerdie/inkforge-website/blob/main/src/App.tsx"
click node_home "https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Home.tsx"
click node_blog "https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Blog.tsx"
click node_article "https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Article.tsx"
click node_article_data "https://github.com/jgougerdie/inkforge-website/blob/main/src/data/articles.ts"
click node_categories "https://github.com/jgougerdie/inkforge-website/blob/main/src/data/categories.ts"
click node_article_content "https://github.com/jgougerdie/inkforge-website/blob/main/src/components/ArticleContent.tsx"
click node_login "https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Login.tsx"
click node_auth "https://github.com/jgougerdie/inkforge-website/blob/main/src/context/AuthContext.tsx"
click node_notify "https://github.com/jgougerdie/inkforge-website/blob/main/src/lib/notifyLogin.ts"
click node_header "https://github.com/jgougerdie/inkforge-website/blob/main/src/components/Header.tsx"
click node_footer "https://github.com/jgougerdie/inkforge-website/blob/main/src/components/Footer.tsx"
click node_analytics "https://github.com/jgougerdie/inkforge-website/blob/main/src/components/Analytics.tsx"
click node_metadata "https://github.com/jgougerdie/inkforge-website/blob/main/src/components/PageMeta.tsx"
click node_article_jsonld "https://github.com/jgougerdie/inkforge-website/blob/main/src/components/ArticleJsonLd.tsx"
click node_video "https://github.com/jgougerdie/inkforge-website/blob/main/src/components/VideoTourModal.tsx"
click node_not_found "https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/NotFound.tsx"

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_home,node_blog,node_video toneBlue
class node_article,node_article_data,node_categories,node_article_content,node_article_jsonld toneAmber
class node_login,node_auth,node_local_storage,node_notify toneMint
class node_app,node_header,node_footer,node_analytics,node_metadata,node_not_found toneRose
class node_reader,node_formspree toneIndigo
```

## Components

### Article discovery

- [Home](https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Home.tsx): `src/pages/Home.tsx`
- [Blog listing](https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Blog.tsx): `src/pages/Blog.tsx`
- [Video tour](https://github.com/jgougerdie/inkforge-website/blob/main/src/components/VideoTourModal.tsx): `src/components/VideoTourModal.tsx`

### Content and rendering

- [Article page](https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Article.tsx): `src/pages/Article.tsx`
- [Article catalog](https://github.com/jgougerdie/inkforge-website/blob/main/src/data/articles.ts): `src/data/articles.ts`
- [Categories](https://github.com/jgougerdie/inkforge-website/blob/main/src/data/categories.ts): `src/data/categories.ts`
- [Article renderer](https://github.com/jgougerdie/inkforge-website/blob/main/src/components/ArticleContent.tsx): `src/components/ArticleContent.tsx`
- [Article structured data](https://github.com/jgougerdie/inkforge-website/blob/main/src/components/ArticleJsonLd.tsx): `src/components/ArticleJsonLd.tsx`

### Reader access

- [Login page](https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/Login.tsx): `src/pages/Login.tsx`
- [Auth context](https://github.com/jgougerdie/inkforge-website/blob/main/src/context/AuthContext.tsx): `src/context/AuthContext.tsx`
- **Browser storage**
- [Login notifier](https://github.com/jgougerdie/inkforge-website/blob/main/src/lib/notifyLogin.ts): `src/lib/notifyLogin.ts`

### Site shell

- [App routing](https://github.com/jgougerdie/inkforge-website/blob/main/src/App.tsx): `src/App.tsx`
- [Header navigation](https://github.com/jgougerdie/inkforge-website/blob/main/src/components/Header.tsx): `src/components/Header.tsx`
- [Footer](https://github.com/jgougerdie/inkforge-website/blob/main/src/components/Footer.tsx): `src/components/Footer.tsx`
- [Analytics](https://github.com/jgougerdie/inkforge-website/blob/main/src/components/Analytics.tsx): `src/components/Analytics.tsx`
- [Page metadata](https://github.com/jgougerdie/inkforge-website/blob/main/src/components/PageMeta.tsx): `src/components/PageMeta.tsx`
- [Not found](https://github.com/jgougerdie/inkforge-website/blob/main/src/pages/NotFound.tsx): `src/pages/NotFound.tsx`

### Other components

- **Reader**
- **Formspree**

## Connections

- Reader → App routing: opens site
- App routing → Home: routes to
- App routing → Blog listing: routes to
- App routing → Article page: routes to
- App routing → Login page: routes to
- App routing → Not found: routes to
- App routing → Auth context: provides auth
- App routing → Header navigation: renders
- App routing → Footer: renders
- App routing → Analytics: renders
- Home → Article catalog: selects featured
- Home → Categories: reads categories
- Home → Blog listing: links to browse
- Home → Video tour: opens tour
- Blog listing → Article catalog: browses articles
- Blog listing → Categories: filters by category
- Article page → Article catalog: loads article
- Article page → Categories: loads category
- Article page → Auth context: checks access
- Article page → Article renderer: renders body
- Article page → Login page: links when gated
- Article page → Page metadata: sets page metadata
- Article page → Article structured data: renders structured data
- Login page → Auth context: logs reader in
- Login page → Login notifier: requests notification
- Auth context → Browser storage: reads and writes
- Login notifier → Formspree: posts notification
- Header navigation → Auth context: reads and logs out
- Header navigation → Home: links to sections
