# cassperrr/url-checker architecture

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

- Interactive diagram: https://gitdiagram.com/cassperrr/url-checker
- Repository: https://github.com/cassperrr/url-checker

## Overview

URL Checker is a full-stack asynchronous URL-checking service. Users submit URL batches in the web app, monitor per-job and per-URL progress, inspect results, and cancel active jobs. The backend exposes job endpoints, runs checks asynchronously, and retains job state in memory. The README identifies HEAD requests and configurable concurrency/timeouts; processor internals were not sampled, so details beyond that documented behavior are omitted.

Main entry points: [`apps/frontend/src/App.tsx`](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/App.tsx) (App), [`apps/backend/src/api/v1/jobs/jobs.controller.ts`](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.controller.ts) (Jobs controller), [`apps/frontend/src/store/jobs.store.ts`](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/store/jobs.store.ts) (Jobs store), [`apps/backend/src/api/v1/jobs/jobs.service.ts`](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.service.ts) (Jobs service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_app["App<br/>[App.tsx]"]
  node_form["Create form"]
  node_list["Jobs list<br/>[jobs-list.tsx]"]
  node_details["Job details<br/>[job-details.tsx]"]
  node_store["Jobs store<br/>[jobs.store.ts]"]
  node_client["Jobs API client<br/>[jobs-api.ts]"]
end

subgraph group_api["Job API"]
  node_controller["Jobs controller<br/>[jobs.controller.ts]"]
  node_service["Jobs service<br/>[jobs.service.ts]"]
  node_mapper["Response mapper<br/>[jobs.mapper.ts]"]
  node_repository[("In-memory jobs<br/>[jobs.repository.ts]")]
  node_api_module["Jobs module<br/>[jobs.module.ts]"]
end

subgraph group_checking["URL checking"]
  node_processor["Job processor<br/>[jobs.processor.ts]"]
end

subgraph group_shared["Contracts and config"]
  node_contracts["Job contracts<br/>[jobs.ts]"]
  node_config["Backend config<br/>[config.module.ts]"]
  node_docs["Swagger setup<br/>[swagger-setup.ts]"]
end

node_user(("User"))
node_browser(("Browser fetch"))
node_targets(("URL targets"))

node_user -->|"uses"| node_app
node_app -->|"renders"| node_form
node_app -->|"renders"| node_list
node_app -->|"renders"| node_details
node_app -->|"loads jobs"| node_store
node_form -->|"creates jobs"| node_store
node_list -->|"selects jobs"| node_store
node_details -->|"loads, cancels"| node_store
node_store -->|"requests jobs"| node_client
node_client -->|"fetches"| node_browser
node_browser -->|"HTTP requests"| node_controller
node_controller -->|"dispatches"| node_service
node_service -->|"reads, saves"| node_repository
node_service -->|"runs, cancels"| node_processor
node_service -->|"maps responses"| node_mapper
node_processor -->|"HEAD checks"| node_targets
node_controller -->|"uses types"| node_contracts
node_client -->|"uses types"| node_contracts
node_api_module -->|"registers"| node_controller
node_config -->|"configures"| node_api_module
node_docs -->|"documents API"| node_controller

click node_app "https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/App.tsx"
click node_form "https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/components/job-create-form.tsx"
click node_list "https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/components/jobs-list.tsx"
click node_details "https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/components/job-details.tsx"
click node_store "https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/store/jobs.store.ts"
click node_client "https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/api/jobs-api.ts"
click node_controller "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.controller.ts"
click node_service "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.service.ts"
click node_mapper "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.mapper.ts"
click node_repository "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.repository.ts"
click node_processor "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.processor.ts"
click node_contracts "https://github.com/cassperrr/url-checker/blob/main/packages/contracts/src/jobs.ts"
click node_api_module "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.module.ts"
click node_config "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/config/config.module.ts"
click node_docs "https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/docs/swagger-setup.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_app,node_form,node_list,node_details,node_store,node_client,node_user,node_browser toneBlue
class node_controller,node_service,node_mapper,node_repository,node_api_module toneAmber
class node_processor toneMint
class node_contracts,node_config,node_docs toneRose
class node_targets toneIndigo
```

## Components

### Web application

- [App](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/App.tsx): `apps/frontend/src/App.tsx`
- [Create form](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/components/job-create-form.tsx): `apps/frontend/src/components/job-create-form.tsx`
- [Jobs list](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/components/jobs-list.tsx): `apps/frontend/src/components/jobs-list.tsx`
- [Job details](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/components/job-details.tsx): `apps/frontend/src/components/job-details.tsx`
- [Jobs store](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/store/jobs.store.ts): `apps/frontend/src/store/jobs.store.ts`
- [Jobs API client](https://github.com/cassperrr/url-checker/blob/main/apps/frontend/src/api/jobs-api.ts): `apps/frontend/src/api/jobs-api.ts`

### Job API

- [Jobs controller](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.controller.ts): `apps/backend/src/api/v1/jobs/jobs.controller.ts`
- [Jobs service](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.service.ts): `apps/backend/src/api/v1/jobs/jobs.service.ts`
- [Response mapper](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.mapper.ts): `apps/backend/src/api/v1/jobs/jobs.mapper.ts`
- [In-memory jobs](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.repository.ts): `apps/backend/src/api/v1/jobs/jobs.repository.ts`
- [Jobs module](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.module.ts): `apps/backend/src/api/v1/jobs/jobs.module.ts`

### URL checking

- [Job processor](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/api/v1/jobs/jobs.processor.ts): `apps/backend/src/api/v1/jobs/jobs.processor.ts`

### Contracts and config

- [Job contracts](https://github.com/cassperrr/url-checker/blob/main/packages/contracts/src/jobs.ts): `packages/contracts/src/jobs.ts`
- [Backend config](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/config/config.module.ts): `apps/backend/src/config/config.module.ts`
- [Swagger setup](https://github.com/cassperrr/url-checker/blob/main/apps/backend/src/docs/swagger-setup.ts): `apps/backend/src/docs/swagger-setup.ts`

### Other components

- **User**
- **Browser fetch**
- **URL targets**

## Connections

- User → App: uses
- App → Create form: renders
- App → Jobs list: renders
- App → Job details: renders
- App → Jobs store: loads jobs
- Create form → Jobs store: creates jobs
- Jobs list → Jobs store: selects jobs
- Job details → Jobs store: loads, cancels
- Jobs store → Jobs API client: requests jobs
- Jobs API client → Browser fetch: fetches
- Browser fetch → Jobs controller: HTTP requests
- Jobs controller → Jobs service: dispatches
- Jobs service → In-memory jobs: reads, saves
- Jobs service → Job processor: runs, cancels
- Jobs service → Response mapper: maps responses
- Job processor → URL targets: HEAD checks
- Jobs controller → Job contracts: uses types
- Jobs API client → Job contracts: uses types
- Jobs module → Jobs controller: registers
- Backend config → Jobs module: configures
- Swagger setup → Jobs controller: documents API
