# nickpanov/purinina architecture

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

- Interactive diagram: https://gitdiagram.com/nickpanov/purinina
- Repository: https://github.com/nickpanov/purinina

## Overview

Purinina is a Tauri desktop app for managing projects, with a SvelteKit interface. The visible workflow is to choose a source folder, create and persist a project, then navigate to its project route; the home screen also checks for an app-local directory. Project-list controls retrieve or remove projects, while shared UI renders alerts and confirmation dialogs. The README describes only a starter template, so the product interpretation comes from the sampled app source. Project-detail behavior and several UI modules are present in the tree but not inspected here; their connections are omitted where evidence is lacking.

Main entry points: [`src/modules/ProjectManager.svelte.ts`](https://github.com/nickpanov/purinina/blob/master/src/modules/ProjectManager.svelte.ts) (Project manager), [`src/components/layout/project-list-item.svelte`](https://github.com/nickpanov/purinina/blob/master/src/components/layout/project-list-item.svelte) (Project item), [`src/components/message-layer.svelte`](https://github.com/nickpanov/purinina/blob/master/src/components/message-layer.svelte) (Message layer), [`src/routes/+page.svelte`](https://github.com/nickpanov/purinina/blob/master/src/routes/%2Bpage.svelte) (Home screen)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_project_ui["Project interface"]
  node_home["Home screen<br/>[+page.svelte]"]
  node_project_list["Project list<br/>[projects.svelte]"]
  node_project_item["Project item"]
  node_project_detail["Project detail<br/>[+page.svelte]"]
  node_file_table["File table<br/>[filetable.svelte]"]
end

subgraph group_project_logic["Project management"]
  node_project_manager["Project manager"]
  node_global_context["Global context"]
end

subgraph group_shared_ui["Shared feedback UI"]
  node_toaster["Toast and dialog state<br/>[toaster.svelte.ts]"]
  node_message_layer["Message layer"]
  node_alert["Alert<br/>[alert.svelte]"]
  node_dialog["Confirmation dialog<br/>[dialog.svelte]"]
end

subgraph group_desktop_runtime["Desktop runtime"]
  node_project_store[("Project store")]
  node_folder_picker["Folder picker"]
  node_local_filesystem["App-local filesystem"]
  node_tauri_runtime["Tauri runtime<br/>[lib.rs]"]
end

node_user(("User"))

node_user -->|"opens"| node_home
node_home -->|"creates project"| node_project_manager
node_home -->|"checks directory"| node_local_filesystem
node_project_manager -->|"selects folder"| node_folder_picker
node_project_manager -->|"loads and saves"| node_project_store
node_project_manager -->|"updates list"| node_global_context
node_project_manager -->|"reports results"| node_toaster
node_project_manager -->|"navigates to"| node_project_detail
node_project_list -->|"renders"| node_project_item
node_project_item -->|"gets or removes"| node_project_manager
node_project_item -->|"links to"| node_project_detail
node_project_item -->|"reports deletion"| node_toaster
node_message_layer -->|"reads messages"| node_toaster
node_message_layer -->|"renders alerts"| node_alert
node_message_layer -->|"renders dialogs"| node_dialog
node_tauri_runtime -->|"registers plugin"| node_project_store
node_tauri_runtime -->|"registers plugin"| node_folder_picker

click node_home "https://github.com/nickpanov/purinina/blob/master/src/routes/%2Bpage.svelte"
click node_project_list "https://github.com/nickpanov/purinina/blob/master/src/components/layout/projects.svelte"
click node_project_item "https://github.com/nickpanov/purinina/blob/master/src/components/layout/project-list-item.svelte"
click node_project_detail "https://github.com/nickpanov/purinina/blob/master/src/routes/project/%5BID%5D/%2Bpage.svelte"
click node_file_table "https://github.com/nickpanov/purinina/blob/master/src/components/filetable.svelte"
click node_project_manager "https://github.com/nickpanov/purinina/blob/master/src/modules/ProjectManager.svelte.ts"
click node_global_context "https://github.com/nickpanov/purinina/blob/master/src/modules/GlobalContext.svelte.ts"
click node_tauri_runtime "https://github.com/nickpanov/purinina/blob/master/src-tauri/src/lib.rs"
click node_toaster "https://github.com/nickpanov/purinina/blob/master/src/modules/toaster.svelte.ts"
click node_message_layer "https://github.com/nickpanov/purinina/blob/master/src/components/message-layer.svelte"
click node_alert "https://github.com/nickpanov/purinina/blob/master/src/components/alert.svelte"
click node_dialog "https://github.com/nickpanov/purinina/blob/master/src/components/dialog.svelte"

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_project_list,node_project_item,node_project_detail,node_file_table,node_user toneBlue
class node_project_manager,node_global_context toneAmber
class node_toaster,node_message_layer,node_alert,node_dialog toneMint
class node_project_store,node_folder_picker,node_local_filesystem,node_tauri_runtime toneRose
```

## Components

### Project interface

- [Home screen](https://github.com/nickpanov/purinina/blob/master/src/routes/%2Bpage.svelte): `src/routes/+page.svelte`
- [Project list](https://github.com/nickpanov/purinina/blob/master/src/components/layout/projects.svelte): `src/components/layout/projects.svelte`
- [Project item](https://github.com/nickpanov/purinina/blob/master/src/components/layout/project-list-item.svelte): `src/components/layout/project-list-item.svelte`
- [Project detail](https://github.com/nickpanov/purinina/blob/master/src/routes/project/%5BID%5D/%2Bpage.svelte): `src/routes/project/[ID]/+page.svelte`
- [File table](https://github.com/nickpanov/purinina/blob/master/src/components/filetable.svelte): `src/components/filetable.svelte`

### Project management

- [Project manager](https://github.com/nickpanov/purinina/blob/master/src/modules/ProjectManager.svelte.ts): `src/modules/ProjectManager.svelte.ts`
- [Global context](https://github.com/nickpanov/purinina/blob/master/src/modules/GlobalContext.svelte.ts): `src/modules/GlobalContext.svelte.ts`

### Shared feedback UI

- [Toast and dialog state](https://github.com/nickpanov/purinina/blob/master/src/modules/toaster.svelte.ts): `src/modules/toaster.svelte.ts`
- [Message layer](https://github.com/nickpanov/purinina/blob/master/src/components/message-layer.svelte): `src/components/message-layer.svelte`
- [Alert](https://github.com/nickpanov/purinina/blob/master/src/components/alert.svelte): `src/components/alert.svelte`
- [Confirmation dialog](https://github.com/nickpanov/purinina/blob/master/src/components/dialog.svelte): `src/components/dialog.svelte`

### Desktop runtime

- **Project store**
- **Folder picker**
- **App-local filesystem**
- [Tauri runtime](https://github.com/nickpanov/purinina/blob/master/src-tauri/src/lib.rs): `src-tauri/src/lib.rs`

### Other components

- **User**

## Connections

- User → Home screen: opens
- Home screen → Project manager: creates project (evidence: `src/routes/+page.svelte`)
- Home screen → App-local filesystem: checks directory (evidence: `src/routes/+page.svelte`)
- Project manager → Folder picker: selects folder (evidence: `src/modules/ProjectManager.svelte.ts`)
- Project manager → Project store: loads and saves (evidence: `src/modules/ProjectManager.svelte.ts`)
- Project manager → Global context: updates list (evidence: `src/modules/ProjectManager.svelte.ts`)
- Project manager → Toast and dialog state: reports results (evidence: `src/modules/ProjectManager.svelte.ts`)
- Project manager → Project detail: navigates to (evidence: `src/modules/ProjectManager.svelte.ts`)
- Project list → Project item: renders (evidence: `src/components/layout/projects.svelte`)
- Project item → Project manager: gets or removes (evidence: `src/components/layout/project-list-item.svelte`)
- Project item → Project detail: links to (evidence: `src/components/layout/project-list-item.svelte`)
- Project item → Toast and dialog state: reports deletion (evidence: `src/components/layout/project-list-item.svelte`)
- Message layer → Toast and dialog state: reads messages (evidence: `src/components/message-layer.svelte`)
- Message layer → Alert: renders alerts (evidence: `src/components/message-layer.svelte`)
- Message layer → Confirmation dialog: renders dialogs (evidence: `src/components/message-layer.svelte`)
- Tauri runtime → Project store: registers plugin (evidence: `src-tauri/src/lib.rs`)
- Tauri runtime → Folder picker: registers plugin (evidence: `src-tauri/src/lib.rs`)
