# eddiehubcommunity/good-first-issue-finder architecture

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

- Interactive diagram: https://gitdiagram.com/eddiehubcommunity/good-first-issue-finder
- Repository: https://github.com/eddiehubcommunity/good-first-issue-finder

## Overview

Good First Issue Finder is a SvelteKit web app for helping newcomers find open-source issues. The main workflow is to authenticate with GitHub, search issues using the app, and browse issue and repository details. The sampled API confirms cookie-based authentication and GitHub GraphQL search; the app-page excerpts do not show how the UI invokes it, so that connection is marked unverified. Navigation and profile components are shown as an internal presentation layer. Other UI-to-route wiring is not established by the excerpts.

Main entry points: [`src/routes/app/+page.svelte`](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/app/%2Bpage.svelte) (Finder page), [`src/lib/components/hamburger-menu/menu.svelte`](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/hamburger-menu/menu.svelte) (Mobile menu), [`src/lib/components/header.svelte`](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/header.svelte) (Header navigation), [`src/routes/api/authentication/callback/+server.ts`](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/authentication/callback/%2Bserver.ts) (OAuth callback)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Web experience"]
  node_site["Site shell<br/>[+layout.svelte]"]
  node_landing["Landing page<br/>[+page.svelte]"]
  node_nav["Header navigation<br/>[header.svelte]"]
  node_mobile_nav["Mobile menu<br/>[menu.svelte]"]
  node_menu_state["Menu state"]
  node_overflow["Scroll control<br/>[hide-overflow.ts]"]
end

subgraph group_identity["GitHub identity"]
  node_login_page["Login page<br/>[+page.svelte]"]
  node_login_route["Login redirect<br/>[+server.ts]"]
  node_oauth_callback["OAuth callback<br/>[+server.ts]"]
  node_logout["Logout route<br/>[+server.ts]"]
  node_profile["Profile popover"]
end

subgraph group_discovery["Issue discovery"]
  node_app["Finder page<br/>[+page.svelte]"]
  node_issue_query["Query setup<br/>[+page.ts]"]
  node_issue_api["Issue search API<br/>[+server.ts]"]
  node_issue_cards["Issue cards<br/>[issue-card.svelte]"]
  node_search["Search controls<br/>[search.svelte]"]
  node_filters["Issue filters<br/>[filter.svelte]"]
end

node_contributor(("Contributor"))
node_github{{"GitHub API"}}

node_contributor -->|"opens site"| node_landing
node_contributor -.->|"signs in"| node_login_page
node_contributor -.->|"browses issues"| node_app
node_site -->|"renders header"| node_nav
node_site -.->|"renders page"| node_landing
node_nav -->|"renders menu"| node_mobile_nav
node_nav -->|"renders profile"| node_profile
node_mobile_nav -->|"renders profile"| node_profile
node_mobile_nav -->|"reads state"| node_menu_state
node_mobile_nav -->|"controls scrolling"| node_overflow
node_profile -->|"links to"| node_logout
node_login_page -.->|"starts login"| node_login_route
node_login_route -.->|"requests authorization"| node_github
node_github -->|"returns authorization"| node_oauth_callback
node_oauth_callback -->|"fetches token and user"| node_github
node_oauth_callback -->|"redirects after login"| node_app
node_app -.->|"configures search"| node_issue_query
node_issue_query -.->|"requests issues"| node_issue_api
node_issue_api -->|"searches GraphQL"| node_github
node_search -.->|"provides query"| node_app
node_filters -.->|"narrows issues"| node_app
node_app -.->|"displays results"| node_issue_cards
node_logout -->|"clears session"| node_contributor

click node_site "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/%2Blayout.svelte"
click node_landing "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/%2Bpage.svelte"
click node_app "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/app/%2Bpage.svelte"
click node_issue_query "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/app/%2Bpage.ts"
click node_issue_api "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/get-issues/%2Bserver.ts"
click node_issue_cards "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/issue-card.svelte"
click node_search "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/search.svelte"
click node_filters "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/filter.svelte"
click node_login_page "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/login/%2Bpage.svelte"
click node_login_route "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/authentication/login/%2Bserver.ts"
click node_oauth_callback "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/authentication/callback/%2Bserver.ts"
click node_logout "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/authentication/logout/%2Bserver.ts"
click node_nav "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/header.svelte"
click node_mobile_nav "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/hamburger-menu/menu.svelte"
click node_profile "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/profile-picture.svelte"
click node_menu_state "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/stores/show-hamburger-menu.ts"
click node_overflow "https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/util/hide-overflow.ts"

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_site,node_landing,node_nav,node_mobile_nav,node_menu_state,node_overflow toneBlue
class node_login_page,node_login_route,node_oauth_callback,node_logout,node_profile toneAmber
class node_app,node_issue_query,node_issue_api,node_issue_cards,node_search,node_filters,node_github toneMint
class node_contributor toneIndigo
```

## Components

### Web experience

- [Site shell](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/%2Blayout.svelte): `src/routes/+layout.svelte`
- [Landing page](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/%2Bpage.svelte): `src/routes/+page.svelte`
- [Header navigation](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/header.svelte): `src/lib/components/header.svelte`
- [Mobile menu](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/hamburger-menu/menu.svelte): `src/lib/components/hamburger-menu/menu.svelte`
- [Menu state](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/stores/show-hamburger-menu.ts): `src/lib/stores/show-hamburger-menu.ts`
- [Scroll control](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/util/hide-overflow.ts): `src/lib/util/hide-overflow.ts`

### GitHub identity

- [Login page](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/login/%2Bpage.svelte): `src/routes/login/+page.svelte`
- [Login redirect](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/authentication/login/%2Bserver.ts): `src/routes/api/authentication/login/+server.ts`
- [OAuth callback](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/authentication/callback/%2Bserver.ts): `src/routes/api/authentication/callback/+server.ts`
- [Logout route](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/authentication/logout/%2Bserver.ts): `src/routes/api/authentication/logout/+server.ts`
- [Profile popover](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/profile-picture.svelte): `src/lib/components/profile-picture.svelte`

### Issue discovery

- [Finder page](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/app/%2Bpage.svelte): `src/routes/app/+page.svelte`
- [Query setup](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/app/%2Bpage.ts): `src/routes/app/+page.ts`
- [Issue search API](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/routes/api/get-issues/%2Bserver.ts): `src/routes/api/get-issues/+server.ts`
- [Issue cards](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/issue-card.svelte): `src/lib/components/issue-card.svelte`
- [Search controls](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/search.svelte): `src/lib/components/search.svelte`
- [Issue filters](https://github.com/eddiehubcommunity/good-first-issue-finder/blob/main/src/lib/components/filter.svelte): `src/lib/components/filter.svelte`

### Other components

- **Contributor**
- **GitHub API**

## Connections

- Contributor → Landing page: opens site (evidence: `README.md`)
- Contributor → Login page: signs in
- Contributor → Finder page: browses issues
- Site shell → Header navigation: renders header (evidence: `src/routes/+layout.svelte`)
- Site shell → Landing page: renders page
- Header navigation → Mobile menu: renders menu (evidence: `src/lib/components/header.svelte`)
- Header navigation → Profile popover: renders profile (evidence: `src/lib/components/header.svelte`)
- Mobile menu → Profile popover: renders profile (evidence: `src/lib/components/hamburger-menu/menu.svelte`)
- Mobile menu → Menu state: reads state (evidence: `src/lib/components/hamburger-menu/menu.svelte`)
- Mobile menu → Scroll control: controls scrolling (evidence: `src/lib/components/hamburger-menu/menu.svelte`)
- Profile popover → Logout route: links to (evidence: `src/lib/components/profile-picture.svelte`)
- Login page → Login redirect: starts login
- Login redirect → GitHub API: requests authorization
- GitHub API → OAuth callback: returns authorization (evidence: `src/routes/api/authentication/callback/+server.ts`)
- OAuth callback → GitHub API: fetches token and user (evidence: `src/routes/api/authentication/callback/+server.ts`)
- OAuth callback → Finder page: redirects after login (evidence: `src/routes/api/authentication/callback/+server.ts`)
- Finder page → Query setup: configures search
- Query setup → Issue search API: requests issues
- Issue search API → GitHub API: searches GraphQL (evidence: `src/routes/api/get-issues/+server.ts`)
- Search controls → Finder page: provides query
- Issue filters → Finder page: narrows issues
- Finder page → Issue cards: displays results
- Logout route → Contributor: clears session (evidence: `src/routes/api/authentication/logout/+server.ts`)
