# reaper47/recipya architecture

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

- Interactive diagram: https://gitdiagram.com/reaper47/recipya
- Repository: https://github.com/reaper47/recipya

## Overview

Recipya is a self-hosted recipe-management web application. The main workflow is a user submitting recipe details or a URL, the server handling the request, recipe data being parsed or normalized, and the repository persisting it for later viewing and organization into cookbooks. Separate capabilities include authentication, recipe imports from external managers, measurement conversion, and scheduled maintenance. The sampled files show server setup and selected handler/storage behavior; several feature branches are documented or named in the tree but their internal wiring was not sampled.

Main entry points: [`internal/server/server.go`](https://github.com/reaper47/recipya/blob/main/internal/server/server.go) (HTTP server), [`internal/server/handlers_recipes.go`](https://github.com/reaper47/recipya/blob/main/internal/server/handlers_recipes.go) (Recipe handlers), [`internal/jobs/jobs.go`](https://github.com/reaper47/recipya/blob/main/internal/jobs/jobs.go) (Scheduled jobs), [`internal/services/sqlite_service.go`](https://github.com/reaper47/recipya/blob/main/internal/services/sqlite_service.go) (SQLite repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_entry["CLI entry<br/>[main.go]"]
  node_server["HTTP server<br/>[server.go]"]
  node_auth["Authentication<br/>[handlers_auth.go]"]
  node_templates["Page data<br/>[data.go]"]
  node_web_components["Web components"]
end

subgraph group_recipes["Recipe workflows"]
  node_recipe_handlers["Recipe handlers"]
  node_cookbooks["Cookbook handlers"]
  node_recipe_model["Recipe model<br/>[recipe.go]"]
  node_scraper["Recipe scrapers<br/>[websites.go]"]
  node_units["Measurement conversion<br/>[measurements.go]"]
  node_integrations["Import integrations"]
end

subgraph group_data["Data and services"]
  node_repository["Repository service<br/>[service.go]"]
  node_sqlite["SQLite repository<br/>[sqlite_service.go]"]
  node_sql_statements["SQL statements<br/>[select.go]"]
  node_database[("SQLite database")]
  node_files["File management<br/>[files.go]"]
end

subgraph group_support["Supporting capabilities"]
  node_jobs["Scheduled jobs<br/>[jobs.go]"]
  node_reports["Reports"]
  node_settings["Settings handlers"]
  node_email["Email service<br/>[email.go]"]
end

node_user(("User"))

node_user -.->|"sends requests"| node_server
node_entry -->|"starts"| node_server
node_entry -->|"creates"| node_sqlite
node_server -->|"routes requests"| node_recipe_handlers
node_server -->|"routes requests"| node_auth
node_recipe_handlers -.->|"reads and writes"| node_repository
node_cookbooks -->|"manages cookbooks"| node_repository
node_server -->|"initializes"| node_scraper
node_recipe_handlers -.->|"imports URLs"| node_scraper
node_recipe_handlers -->|"handles recipes"| node_recipe_model
node_recipe_model -->|"uses conversions"| node_units
node_server -.->|"initializes templates"| node_templates
node_recipe_handlers -->|"builds page data"| node_templates
node_cookbooks -->|"builds page data"| node_templates
node_auth -->|"renders responses"| node_web_components
node_cookbooks -->|"renders pages"| node_web_components
node_sqlite -->|"executes queries"| node_sql_statements
node_sqlite -->|"reads and writes"| node_database
node_repository -.->|"implemented by"| node_sqlite
node_server -->|"schedules"| node_jobs
node_jobs -->|"checks updates"| node_repository
node_jobs -->|"uses files"| node_files
node_server -.->|"provides import service"| node_integrations
node_server -.->|"routes reports"| node_reports
node_server -.->|"routes settings"| node_settings
node_jobs -.->|"uses email"| node_email

click node_entry "https://github.com/reaper47/recipya/blob/main/main.go"
click node_server "https://github.com/reaper47/recipya/blob/main/internal/server/server.go"
click node_auth "https://github.com/reaper47/recipya/blob/main/internal/server/handlers_auth.go"
click node_recipe_handlers "https://github.com/reaper47/recipya/blob/main/internal/server/handlers_recipes.go"
click node_cookbooks "https://github.com/reaper47/recipya/blob/main/internal/server/handlers_cookbooks.go"
click node_recipe_model "https://github.com/reaper47/recipya/blob/main/internal/models/recipe.go"
click node_scraper "https://github.com/reaper47/recipya/blob/main/internal/scraper/websites.go"
click node_units "https://github.com/reaper47/recipya/blob/main/internal/units/measurements.go"
click node_integrations "https://github.com/reaper47/recipya/tree/main/internal/integrations"
click node_templates "https://github.com/reaper47/recipya/blob/main/internal/templates/data.go"
click node_web_components "https://github.com/reaper47/recipya/tree/main/web/components"
click node_repository "https://github.com/reaper47/recipya/blob/main/internal/services/service.go"
click node_sqlite "https://github.com/reaper47/recipya/blob/main/internal/services/sqlite_service.go"
click node_sql_statements "https://github.com/reaper47/recipya/blob/main/internal/services/statements/select.go"
click node_files "https://github.com/reaper47/recipya/blob/main/internal/services/files.go"
click node_jobs "https://github.com/reaper47/recipya/blob/main/internal/jobs/jobs.go"
click node_reports "https://github.com/reaper47/recipya/blob/main/internal/server/handlers_reports.go"
click node_settings "https://github.com/reaper47/recipya/blob/main/internal/server/handlers_settings.go"
click node_email "https://github.com/reaper47/recipya/blob/main/internal/services/email.go"

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_entry,node_server,node_auth,node_templates,node_web_components,node_user toneBlue
class node_recipe_handlers,node_cookbooks,node_recipe_model,node_scraper,node_units,node_integrations toneAmber
class node_repository,node_sqlite,node_sql_statements,node_database,node_files toneMint
class node_jobs,node_reports,node_settings,node_email toneRose
```

## Components

### Web application

- [CLI entry](https://github.com/reaper47/recipya/blob/main/main.go): `main.go`
- [HTTP server](https://github.com/reaper47/recipya/blob/main/internal/server/server.go): `internal/server/server.go`
- [Authentication](https://github.com/reaper47/recipya/blob/main/internal/server/handlers_auth.go): `internal/server/handlers_auth.go`
- [Page data](https://github.com/reaper47/recipya/blob/main/internal/templates/data.go): `internal/templates/data.go`
- [Web components](https://github.com/reaper47/recipya/tree/main/web/components): `web/components`

### Recipe workflows

- [Recipe handlers](https://github.com/reaper47/recipya/blob/main/internal/server/handlers_recipes.go): `internal/server/handlers_recipes.go`
- [Cookbook handlers](https://github.com/reaper47/recipya/blob/main/internal/server/handlers_cookbooks.go): `internal/server/handlers_cookbooks.go`
- [Recipe model](https://github.com/reaper47/recipya/blob/main/internal/models/recipe.go): `internal/models/recipe.go`
- [Recipe scrapers](https://github.com/reaper47/recipya/blob/main/internal/scraper/websites.go): `internal/scraper/websites.go`
- [Measurement conversion](https://github.com/reaper47/recipya/blob/main/internal/units/measurements.go): `internal/units/measurements.go`
- [Import integrations](https://github.com/reaper47/recipya/tree/main/internal/integrations): `internal/integrations`

### Data and services

- [Repository service](https://github.com/reaper47/recipya/blob/main/internal/services/service.go): `internal/services/service.go`
- [SQLite repository](https://github.com/reaper47/recipya/blob/main/internal/services/sqlite_service.go): `internal/services/sqlite_service.go`
- [SQL statements](https://github.com/reaper47/recipya/blob/main/internal/services/statements/select.go): `internal/services/statements/select.go`
- **SQLite database**
- [File management](https://github.com/reaper47/recipya/blob/main/internal/services/files.go): `internal/services/files.go`

### Supporting capabilities

- [Scheduled jobs](https://github.com/reaper47/recipya/blob/main/internal/jobs/jobs.go): `internal/jobs/jobs.go`
- [Reports](https://github.com/reaper47/recipya/blob/main/internal/server/handlers_reports.go): `internal/server/handlers_reports.go`
- [Settings handlers](https://github.com/reaper47/recipya/blob/main/internal/server/handlers_settings.go): `internal/server/handlers_settings.go`
- [Email service](https://github.com/reaper47/recipya/blob/main/internal/services/email.go): `internal/services/email.go`

### Other components

- **User**

## Connections

- User → HTTP server: sends requests
- CLI entry → HTTP server: starts (evidence: `main.go`)
- CLI entry → SQLite repository: creates (evidence: `main.go`)
- HTTP server → Recipe handlers: routes requests (evidence: `internal/server/server.go`)
- HTTP server → Authentication: routes requests (evidence: `internal/server/server.go`)
- Recipe handlers → Repository service: reads and writes
- Cookbook handlers → Repository service: manages cookbooks (evidence: `internal/server/handlers_cookbooks.go`)
- HTTP server → Recipe scrapers: initializes (evidence: `internal/server/server.go`)
- Recipe handlers → Recipe scrapers: imports URLs
- Recipe handlers → Recipe model: handles recipes (evidence: `internal/server/handlers_recipes.go`)
- Recipe model → Measurement conversion: uses conversions (evidence: `internal/models/recipe.go`)
- HTTP server → Page data: initializes templates
- Recipe handlers → Page data: builds page data (evidence: `internal/server/handlers_recipes.go`)
- Cookbook handlers → Page data: builds page data (evidence: `internal/server/handlers_cookbooks.go`)
- Authentication → Web components: renders responses (evidence: `internal/server/handlers_auth.go`)
- Cookbook handlers → Web components: renders pages (evidence: `internal/server/handlers_cookbooks.go`)
- SQLite repository → SQL statements: executes queries (evidence: `internal/services/sqlite_service.go`)
- SQLite repository → SQLite database: reads and writes (evidence: `internal/services/sqlite_service.go`)
- Repository service → SQLite repository: implemented by
- HTTP server → Scheduled jobs: schedules (evidence: `internal/server/server.go`)
- Scheduled jobs → Repository service: checks updates (evidence: `internal/jobs/jobs.go`)
- Scheduled jobs → File management: uses files (evidence: `internal/jobs/jobs.go`)
- HTTP server → Import integrations: provides import service
- HTTP server → Reports: routes reports
- HTTP server → Settings handlers: routes settings
- Scheduled jobs → Email service: uses email
