# a-shygun/dripfetch architecture

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

- Interactive diagram: https://gitdiagram.com/a-shygun/dripfetch
- Repository: https://github.com/a-shygun/dripfetch

## Overview

Dripfetch is a configurable terminal dashboard: users select or edit YAML settings, then the CLI starts a curses app that renders movable information boxes alongside animated rain. The map includes box layout and rendering, dashboard content sources, and rain simulation. README-documented features include presets, logo selection, weather and network displays, and keyboard/mouse movement. Several box implementations and CLI branches were not excerpted, so their internal call links are omitted rather than inferred.

Main entry points: [`src/dripfetch/box/manager.py`](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/manager.py) (Box manager), [`src/dripfetch/app/app.py`](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/app.py) (Dashboard loop), [`src/dripfetch/rain/manager.py`](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/manager.py) (Rain manager), [`src/dripfetch/app/cli.py`](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/cli.py) (CLI and presets)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Application entry"]
  node_cli["CLI and presets<br/>[cli.py]"]
  node_config["YAML configuration<br/>[config.py]"]
  node_app["Dashboard loop<br/>[app.py]"]
  node_terminal["Terminal renderer<br/>[terminal.py]"]
end

subgraph group_dashboard["Dashboard and boxes"]
  node_boxmgr["Box manager<br/>[manager.py]"]
  node_layout["Box layout<br/>[layout.py]"]
  node_placement["Box placement<br/>[placement.py]"]
  node_border["Borders<br/>[border.py]"]
  node_colors["Box colors<br/>[colors.py]"]
  node_registry["Box registry<br/>[registry.py]"]
  node_basebox["Box base<br/>[base.py]"]
end

subgraph group_content["Box content"]
  node_logo["Logo box<br/>[logo.py]"]
  node_sysinfo["System information<br/>[sysinfo.py]"]
  node_clock["Clock box<br/>[clock.py]"]
  node_calendar["Calendar box<br/>[calendar.py]"]
  node_weather["Weather box<br/>[weather.py]"]
  node_net["Network graph<br/>[net.py]"]
  node_text["Text box<br/>[text.py]"]
  node_commands["System commands<br/>[commands.py]"]
  node_parsing["Value parsing<br/>[parsing.py]"]
  node_units["Rate units<br/>[units.py]"]
  node_validation["Box validation<br/>[validation.py]"]
  node_web["Web requests<br/>[web.py]"]
end

subgraph group_rain["Rain animation"]
  node_rainmgr["Rain manager<br/>[manager.py]"]
  node_physics["Drop physics<br/>[physics.py]"]
  node_spawning["Drop spawning<br/>[spawning.py]"]
  node_rainrender["Rain rendering<br/>[rendering.py]"]
end

node_user(("Terminal user"))

node_user -->|"runs commands"| node_cli
node_cli -->|"selects config"| node_config
node_cli -->|"starts app"| node_app
node_app -->|"loads and saves"| node_config
node_app -->|"sets up renderer"| node_terminal
node_app -->|"updates boxes"| node_boxmgr
node_app -->|"updates rain"| node_rainmgr
node_boxmgr -->|"positions boxes"| node_layout
node_boxmgr -->|"moves boxes"| node_placement
node_boxmgr -->|"creates colors"| node_colors
node_boxmgr -->|"selects type"| node_registry
node_layout -->|"sizes borders"| node_border
node_boxmgr -.->|"draws boxes"| node_terminal
node_registry -->|"registers base"| node_basebox
node_boxmgr -.->|"creates box"| node_sysinfo
node_sysinfo -->|"queries system"| node_commands
node_net -->|"parses values"| node_parsing
node_net -->|"formats rates"| node_units
node_weather -.->|"fetches forecasts"| node_web
node_boxmgr -.->|"creates box"| node_logo
node_boxmgr -.->|"creates box"| node_clock
node_boxmgr -.->|"creates box"| node_calendar
node_boxmgr -.->|"creates box"| node_weather
node_boxmgr -.->|"creates box"| node_net
node_boxmgr -.->|"creates box"| node_text
node_rainmgr -->|"updates drops"| node_physics
node_rainmgr -->|"spawns drops"| node_spawning
node_rainmgr -->|"draws drops"| node_rainrender
node_rainmgr -.->|"checks collisions"| node_boxmgr

click node_cli "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/cli.py"
click node_config "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/config.py"
click node_app "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/app.py"
click node_terminal "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/terminal.py"
click node_boxmgr "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/manager.py"
click node_layout "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/layout.py"
click node_placement "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/placement.py"
click node_border "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/border.py"
click node_colors "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/colors.py"
click node_registry "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/registry.py"
click node_basebox "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/base.py"
click node_logo "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/logo.py"
click node_sysinfo "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/sysinfo.py"
click node_clock "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/clock.py"
click node_calendar "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/calendar.py"
click node_weather "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/weather.py"
click node_net "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/net.py"
click node_text "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/text.py"
click node_commands "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/commands.py"
click node_parsing "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/parsing.py"
click node_units "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/units.py"
click node_validation "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/validation.py"
click node_web "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/web.py"
click node_rainmgr "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/manager.py"
click node_physics "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/physics.py"
click node_spawning "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/spawning.py"
click node_rainrender "https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/rendering.py"

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_cli,node_config,node_app,node_terminal,node_user toneBlue
class node_boxmgr,node_layout,node_placement,node_border,node_colors,node_registry,node_basebox toneAmber
class node_logo,node_sysinfo,node_clock,node_calendar,node_weather,node_net,node_text,node_commands,node_parsing,node_units,node_validation,node_web toneMint
class node_rainmgr,node_physics,node_spawning,node_rainrender toneRose
```

## Components

### Application entry

- [CLI and presets](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/cli.py): `src/dripfetch/app/cli.py`
- [YAML configuration](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/config.py): `src/dripfetch/app/config.py`
- [Dashboard loop](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/app.py): `src/dripfetch/app/app.py`
- [Terminal renderer](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/app/terminal.py): `src/dripfetch/app/terminal.py`

### Dashboard and boxes

- [Box manager](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/manager.py): `src/dripfetch/box/manager.py`
- [Box layout](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/layout.py): `src/dripfetch/box/layout.py`
- [Box placement](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/placement.py): `src/dripfetch/box/placement.py`
- [Borders](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/border.py): `src/dripfetch/box/border.py`
- [Box colors](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/colors.py): `src/dripfetch/box/colors.py`
- [Box registry](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/registry.py): `src/dripfetch/box/registry.py`
- [Box base](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/base.py): `src/dripfetch/box/base.py`

### Box content

- [Logo box](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/logo.py): `src/dripfetch/box/types/logo.py`
- [System information](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/sysinfo.py): `src/dripfetch/box/types/sysinfo.py`
- [Clock box](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/clock.py): `src/dripfetch/box/types/clock.py`
- [Calendar box](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/calendar.py): `src/dripfetch/box/types/calendar.py`
- [Weather box](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/weather.py): `src/dripfetch/box/types/weather.py`
- [Network graph](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/net.py): `src/dripfetch/box/types/net.py`
- [Text box](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/text.py): `src/dripfetch/box/types/text.py`
- [System commands](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/commands.py): `src/dripfetch/box/types/helper/commands.py`
- [Value parsing](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/parsing.py): `src/dripfetch/box/types/helper/parsing.py`
- [Rate units](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/units.py): `src/dripfetch/box/types/helper/units.py`
- [Box validation](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/validation.py): `src/dripfetch/box/types/helper/validation.py`
- [Web requests](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/box/types/helper/web.py): `src/dripfetch/box/types/helper/web.py`

### Rain animation

- [Rain manager](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/manager.py): `src/dripfetch/rain/manager.py`
- [Drop physics](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/physics.py): `src/dripfetch/rain/physics.py`
- [Drop spawning](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/spawning.py): `src/dripfetch/rain/spawning.py`
- [Rain rendering](https://github.com/a-shygun/dripfetch/blob/main/src/dripfetch/rain/rendering.py): `src/dripfetch/rain/rendering.py`

### Other components

- **Terminal user**

## Connections

- Terminal user → CLI and presets: runs commands (evidence: `README.md`)
- CLI and presets → YAML configuration: selects config (evidence: `src/dripfetch/app/cli.py`)
- CLI and presets → Dashboard loop: starts app (evidence: `src/dripfetch/app/cli.py`)
- Dashboard loop → YAML configuration: loads and saves (evidence: `src/dripfetch/app/app.py`)
- Dashboard loop → Terminal renderer: sets up renderer (evidence: `src/dripfetch/app/app.py`)
- Dashboard loop → Box manager: updates boxes (evidence: `src/dripfetch/app/app.py`)
- Dashboard loop → Rain manager: updates rain (evidence: `src/dripfetch/app/app.py`)
- Box manager → Box layout: positions boxes (evidence: `src/dripfetch/box/manager.py`)
- Box manager → Box placement: moves boxes (evidence: `src/dripfetch/box/manager.py`)
- Box manager → Box colors: creates colors (evidence: `src/dripfetch/box/manager.py`)
- Box manager → Box registry: selects type (evidence: `src/dripfetch/box/manager.py`)
- Box layout → Borders: sizes borders (evidence: `src/dripfetch/box/layout.py`)
- Box manager → Terminal renderer: draws boxes
- Box registry → Box base: registers base (evidence: `src/dripfetch/box/registry.py`)
- Box manager → System information: creates box
- System information → System commands: queries system
- Network graph → Value parsing: parses values (evidence: `src/dripfetch/box/types/net.py`)
- Network graph → Rate units: formats rates (evidence: `src/dripfetch/box/types/net.py`)
- Weather box → Web requests: fetches forecasts
- Box manager → Logo box: creates box
- Box manager → Clock box: creates box
- Box manager → Calendar box: creates box
- Box manager → Weather box: creates box
- Box manager → Network graph: creates box
- Box manager → Text box: creates box
- Rain manager → Drop physics: updates drops (evidence: `src/dripfetch/rain/manager.py`)
- Rain manager → Drop spawning: spawns drops (evidence: `src/dripfetch/rain/manager.py`)
- Rain manager → Rain rendering: draws drops (evidence: `src/dripfetch/rain/manager.py`)
- Rain manager → Box manager: checks collisions
