Add graphify knowledge graph and agent rules; use freezmo.png; bump to 2.2.15

This commit is contained in:
Martin Dvořák 2026-10-15 21:48:30 +02:00
commit 6702ca8d6f
13 changed files with 1186 additions and 16 deletions

6
.gitignore vendored
View file

@ -73,3 +73,9 @@ next-env.d.ts
# build artifacts # build artifacts
*.tgz *.tgz
# graphify: commit the graph; keep machine-local artifacts out
graphify-out/cache/
graphify-out/cost.json
graphify-out/.graphify_python
graphify-out/.graphify_root

View file

@ -0,0 +1,62 @@
// graphify OpenCode plugin
// Injects a knowledge graph reminder before the first shell command of a
// session when the graph exists.
//
// One file for both runtimes. OpenCode 2 reads `id` and `setup()` from the
// default export; OpenCode 1 (1.3.4 and later) reads `server()` from it. Each
// ignores the other's function. Nothing is imported from an opencode package:
// a plain file in .opencode/plugins/ cannot resolve one.
//
// IMPORTANT: keep the reminder string free of backticks and $(...) constructs.
// The hook prepends `echo "<reminder>" ; <cmd>` to the user's shell command;
// backticks inside the double-quoted echo trigger command substitution,
// which both corrupts tool output and silently executes the very graphify
// command we are only suggesting. Plain words render fine in opencode's TUI.
import { existsSync } from "fs";
import { join } from "path";
// ';' not '&&' — Windows PowerShell 5.1 rejects '&&' as a statement
// separator, breaking the first shell command of the session (#1646).
const REMINDER =
'echo "[graphify] knowledge graph at graphify-out/. For focused questions, run graphify query with your question (scoped subgraph, usually much smaller than GRAPH_REPORT.md) instead of grepping raw files. Read GRAPH_REPORT.md only for broad architecture context." ; ';
const hasGraph = (directory) => existsSync(join(directory, "graphify-out", "graph.json"));
// A project and a directory above it (often ~) can each hold a copy of this
// file, and OpenCode loads both. OpenCode 2 fails the second plugin with the
// same id ("Duplicate plugin ID"), so the id carries this file's location. The
// copies share one record of who was reminded, so a command gets one reminder.
const location = [...import.meta.url].reduce((hash, ch) => (Math.imul(hash, 31) + ch.charCodeAt(0)) >>> 0, 7);
const reminded = (globalThis.__graphifyReminded ??= new Set());
export default {
id: `graphify-${location.toString(16)}`,
// OpenCode 2: the command tool is "shell", and one server outlives many
// sessions, so the reminder is tracked per session.
async setup(ctx) {
await ctx.tool.hook("execute.before", (event) => {
if (event.tool !== "shell" || typeof event.input?.command !== "string") return;
if (reminded.has(event.sessionID)) return;
if (!hasGraph(ctx.location.directory)) return;
event.input = { ...event.input, command: REMINDER + event.input.command };
reminded.add(event.sessionID);
});
},
// OpenCode 1: the command tool is "bash", and the server lives as long as
// the session, so the reminder is tracked per project directory.
async server({ directory }) {
return {
"tool.execute.before": async (input, output) => {
if (input.tool !== "bash" || typeof output.args?.command !== "string") return;
if (reminded.has(directory)) return;
if (!hasGraph(directory)) return;
output.args.command = REMINDER + output.args.command;
reminded.add(directory);
},
};
},
};

View file

@ -1,11 +1,11 @@
# agents.md — cold-boot notes # AGENTS.md — cold-boot notes
Quick context so a fresh session (no memory of this project) can be productive in Quick context so a fresh session (no memory of this project) can be productive in
a minute. Read this first, then skim the files it points at. a minute. Read this first, then skim the files it points at.
--- ---
## Keep README.md AND agents.md in sync — do this on EVERY prompt ## Keep README.md AND AGENTS.md in sync — do this on EVERY prompt
**Before you finish any task, update the docs so they still match the code.** **Before you finish any task, update the docs so they still match the code.**
This is a standing requirement, not a one-off, so treat it as part of "done": This is a standing requirement, not a one-off, so treat it as part of "done":
@ -15,10 +15,10 @@ a feature, script, route, app, theme, file or dependency, reflect it in `README.
(Features, Tech Stack, API Routes, Project Structure, Scripts, running/deploying (Features, Tech Stack, API Routes, Project Structure, Scripts, running/deploying
sections — whichever apply). sections — whichever apply).
**`agents.md`** (this file) is the cold-boot doc for the next session. Update it in **`AGENTS.md`** (this file) is the cold-boot doc for the next session. Update it in
the same task whenever a change touches anything it describes — architecture, the key the same task whenever a change touches anything it describes — architecture, the key
files and their invariants, conventions/gotchas, history, or testing notes. A stale files and their invariants, conventions/gotchas, history, or testing notes. A stale
`agents.md` is worse than none: it actively misleads the next session. `AGENTS.md` is worse than none: it actively misleads the next session.
For both docs: For both docs:
- Re-read the doc and the files you touched; fix anything the change made stale. - Re-read the doc and the files you touched; fix anything the change made stale.
@ -27,7 +27,7 @@ For both docs:
- If a task genuinely changes nothing that either doc describes, it's fine to leave - If a task genuinely changes nothing that either doc describes, it's fine to leave
that doc untouched — use judgement, don't churn it for nothing. that doc untouched — use judgement, don't churn it for nothing.
When in doubt, prefer updating. A stale README **or** agents.md is treated as a bug. When in doubt, prefer updating. A stale README **or** AGENTS.md is treated as a bug.
--- ---
@ -56,7 +56,7 @@ frosted-glass **web** site, and an alternate KDE/Plasma **desktop simulation**
utilities in the components (Tailwind is present via PostCSS but the look is utilities in the components (Tailwind is present via PostCSS but the look is
hand-written CSS). hand-written CSS).
- Path alias: `@/*` → `src/*`. - Path alias: `@/*` → `src/*`.
- Version: `2.2.14` (see `package.json`). - Version: `2.2.15` (see `package.json`).
### Scripts ### Scripts
```bash ```bash
@ -173,7 +173,7 @@ Themes: `web` = default frosted-glass website (sidebar + content, light/dark),
along with the row hairlines (`--index-line`). Above the split, the full-width along with the row hairlines (`--index-line`). Above the split, the full-width
**Freezmo** launch panel (`.web-freezmo` — app-tinted glow, floating orbs, **Freezmo** launch panel (`.web-freezmo` — app-tinted glow, floating orbs,
gradient wordmark + "new" badge, feature bullets, Try/Source CTAs) is the one gradient wordmark + "new" badge, feature bullets, Try/Source CTAs) is the one
place a **real screenshot** is used (`public/freezmo-app.webp`, the live place a **real screenshot** is used (`public/freezmo.png`, the live
study app). The two remaining feature panels (`.web-split`) stretch study app). The two remaining feature panels (`.web-split`) stretch
to equal height and share a fixed `16 / 10` `.fw` window (the `FeatureWindow` to equal height and share a fixed `16 / 10` `.fw` window (the `FeatureWindow`
component) — decorative, **asset-free CSS mock-ups** rather than screenshots: component) — decorative, **asset-free CSS mock-ups** rather than screenshots:
@ -195,7 +195,7 @@ Themes: `web` = default frosted-glass website (sidebar + content, light/dark),
feature/app previews are `FeatureWindow` mock windows, feature/app previews are `FeatureWindow` mock windows,
and `.win-desktop` carries a layered gradient "wallpaper" (there is no and `.win-desktop` carries a layered gradient "wallpaper" (there is no
`wallpaper.jpg`). Only the social SVGs, the site logo (`src/app/icon.png`), `wallpaper.jpg`). Only the social SVGs, the site logo (`src/app/icon.png`),
the Freezmo screenshot (`public/freezmo-app.webp`), the the Freezmo screenshot (`public/freezmo.png`), the
Joker easter egg (`joker.webp`) and the Gentoo mark (`gentoo.svg`) remain as Joker easter egg (`joker.webp`) and the Gentoo mark (`gentoo.svg`) remain as
real image files. real image files.
- **Not a terminal.** The web theme deliberately has no TUI chrome: the hero is - **Not a terminal.** The web theme deliberately has no TUI chrome: the hero is
@ -540,8 +540,8 @@ knows about icon ids, via `APP_BY_ID`.
## After finishing — push to git ## After finishing — push to git
First make sure `README.md` **and** `agents.md` are up to date (see "Keep First make sure `README.md` **and** `AGENTS.md` are up to date (see "Keep
README.md AND agents.md in sync" at the top), then run **only** these three README.md AND AGENTS.md in sync" at the top), then run **only** these three
commands (no extra flags, no rebasing, no force-push): commands (no extra flags, no rebasing, no force-push):
```bash ```bash
@ -551,3 +551,17 @@ git push origin main
``` ```
Replace `<WHAT CHANGED>` with a short, specific summary of the change. Replace `<WHAT CHANGED>` with a short, specific summary of the change.
## graphify
This project has a knowledge graph at graphify-out/ with god nodes, community structure, and cross-file relationships.
When the user types `/graphify`, use the installed graphify skill or instructions before doing anything else.
Rules:
- When graphify-out/graph.json exists, run `graphify query "<question>"` before your first grep, search or source-file read for a codebase question, and put this rule in every subagent prompt that explores code. Read raw files only for lines the graph or an earlier read already located. Use `graphify path "<A>" "<B>"` for relationships and `graphify explain "<concept>"` for focused concepts. These return a scoped subgraph, usually much smaller than GRAPH_REPORT.md or raw grep output.
- Dirty graphify-out/ files are expected after hooks or incremental updates; dirty graph files are not a reason to skip graphify. Only skip graphify if the task is about stale or incorrect graph output, or the user explicitly says not to use it.
- If graphify-out/wiki/index.md exists, use it for broad navigation instead of raw source browsing.
- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context.
- After modifying code, run `graphify update .` to keep the graph current (AST-only, no API cost).
- A committed graphify-out/graph.json is rewritten whole on every build, so a large diff to it in a pull request is expected. Do not flag it as churn or suggest skipping the graph rebuild or its hooks.

View file

@ -84,7 +84,7 @@ more.
used by the desktop theme's SMP menu and the in-desktop terminal. used by the desktop theme's SMP menu and the in-desktop terminal.
- **Images:** `next/image` — only the logo (`src/app/icon.png`), the social SVGs, the Joker - **Images:** `next/image` — only the logo (`src/app/icon.png`), the social SVGs, the Joker
easter egg and the Gentoo mark; all cards, feature/app previews and the wallpaper are CSS. easter egg and the Gentoo mark; all cards, feature/app previews and the wallpaper are CSS.
- **Version:** `2.2.14` (see `package.json`) - **Version:** `2.2.15` (see `package.json`)
- **Dependencies:** `npm audit` reports **0 vulnerabilities**. `next` is kept at a patched - **Dependencies:** `npm audit` reports **0 vulnerabilities**. `next` is kept at a patched
release (`>=16.3.6`) for the `next/og` RCE, and `brace-expansion` is force-upgraded via release (`>=16.3.6`) for the `next/og` RCE, and `brace-expansion` is force-upgraded via
`overrides`. `braces` (a transitive ESLint/`fast-glob` dependency) has **no upstream fix**, `overrides`. `braces` (a transitive ESLint/`fast-glob` dependency) has **no upstream fix**,

View file

@ -0,0 +1 @@
{"0": "Desktop App Catalog", "1": "Deployment & Ops Docs", "2": "braces Package Metadata", "3": "Theme & Clock Components", "4": "braces Parsing Engine", "5": "Project Index Data", "6": "braces Character Constants", "7": "Next Config & API Routes", "8": "TypeScript Compiler Config", "9": "Root Package Dependencies", "10": "Root Dev Dependencies", "11": "Custom Dev Server", "12": "Debian Dependency Installer", "13": "brace-expansion Overrides", "14": "npm Scripts", "15": "Freezmo Icon Visual Identity", "16": "braces Public API Methods", "17": "Eye Logo & Favicon Assets", "18": "ESLint Configuration", "19": "Runtime Dependencies", "20": "Discord Icon Asset", "21": "Freezmo App Screenshot", "22": "Instagram Icon Asset", "23": "Gentoo Logo Asset", "24": "Reddit Icon Asset", "25": "Revival Inc. Game Favicon", "26": "TikTok Icon Asset", "27": "System Service Installer", "28": "Package allowScripts Overrides", "29": "PostCSS Configuration", "30": "GitHub Icon Asset", "31": "itch.io Icon Asset", "32": "Joker Character Image", "33": "LinkedIn Icon Asset", "34": "Quipee Logo Asset", "35": "Snapchat Icon Asset", "36": "SoundCloud Icon Asset", "37": "Twitter/X Icon Asset", "38": "Activities API Route", "39": "Heatmap API Route", "40": "Revival Inc. Page"}

View file

@ -0,0 +1,232 @@
# Graph Report - dvorakmortonxd.dev (2026-10-15)
## Corpus Check
- 63 files · ~107,169 words
- Verdict: corpus is large enough that graph structure adds value.
- Unclassified: 19 file(s) not represented in the graph (top: (none) 6, .ttf 3, .css 3)
## Summary
- 414 nodes · 577 edges · 41 communities (26 shown, 15 thin omitted)
- Extraction: 93% EXTRACTED · 7% INFERRED · 0% AMBIGUOUS · INFERRED: 39 edges (avg confidence: 0.85)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
- Desktop App Catalog
- Deployment & Ops Docs
- braces Package Metadata
- Theme & Clock Components
- braces Parsing Engine
- Project Index Data
- braces Character Constants
- Next Config & API Routes
- TypeScript Compiler Config
- Root Package Dependencies
- Root Dev Dependencies
- Custom Dev Server
- Debian Dependency Installer
- brace-expansion Overrides
- npm Scripts
- Freezmo Icon Visual Identity
- braces Public API Methods
- Eye Logo & Favicon Assets
- ESLint Configuration
- Runtime Dependencies
- Discord Icon Asset
- Freezmo App Screenshot
- Instagram Icon Asset
- Gentoo Logo Asset
- Reddit Icon Asset
- Revival Inc. Game Favicon
- TikTok Icon Asset
- System Service Installer
- Package allowScripts Overrides
- PostCSS Configuration
- GitHub Icon Asset
- itch.io Icon Asset
- Joker Character Image
- LinkedIn Icon Asset
- Quipee Logo Asset
- Snapchat Icon Asset
- SoundCloud Icon Asset
- Twitter/X Icon Asset
## God Nodes (most connected - your core abstractions)
1. `WebLayout()` - 16 edges
2. `compilerOptions` - 16 edges
3. `react` - 15 edges
4. `next` - 12 edges
5. `FeatureWindow()` - 11 edges
6. `useTheme()` - 11 edges
7. `WindowsDesktop()` - 8 edges
8. `Clock()` - 7 edges
9. `ContributionHeatmap()` - 7 edges
10. `CodingProjectIndex()` - 7 edges
## Surprising Connections (you probably didn't know these)
- `Revival Inc. Game` --conceptually_related_to--> `FeatureWindow CSS Mock Windows` [INFERRED]
public/llms.txt → README.md
- `GitDXD (Forgejo Git Forge)` --conceptually_related_to--> `Site API Proxy Routes` [INFERRED]
public/llms.txt → README.md
- `Vendored braces CVE Patch` --conceptually_related_to--> `Brace Bomb DoS / Geometric Complexity` [INFERRED]
agents.md → vendor/braces/README.md
- `FeatureWindow CSS Mock Windows` --references--> `Revival Inc. Pygbag Web Build` [EXTRACTED]
README.md → public/revival-inc/index.html
- `Vendored braces Patch` --references--> `braces Library` [EXTRACTED]
README.md → vendor/braces/README.md
## Import Cycles
- None detected.
## Hyperedges (group relationships)
- **Two-Shell Theming Architecture** — readme_two_shells, readme_web_shell, readme_skeuo_shell, agents_theme_root [INFERRED 0.85]
- **Host-Allowlisted Proxy API Routes** — agents_ping_ssrf_allowlist, agents_frame_proxy, readme_api_routes [INFERRED 0.85]
- **Vendored braces CVE Patch Flow** — readme_vendored_braces_patch, agents_vendored_braces_patch, vendor_braces_readme_braces, vendor_braces_readme_brace_bomb [INFERRED 0.85]
- **Freezmo AI-graded quiz flow (app, quiz UI, sample question)** — public_freezmo_app_webp_image, public_freezmo_app_webp_freezmo_app, public_freezmo_app_webp_quiz_screen, public_freezmo_app_webp_schuman_plan_question [INFERRED 0.85]
- **** — public_revival_inc_favicon_png_image, public_revival_inc_favicon_png_revival_inc_game, public_revival_inc_favicon_png_game_controller_mark [INFERRED 0.75]
- **Site identity: eye logo used as app icon and in-page logo** — src_app_icon_png_image, src_app_icon_png_eye_logo, src_app_icon_png_favicon, src_app_components_jokerlogo_tsx_logo [INFERRED 0.85]
- **Freezmo Icon Visual Identity** — public_freezmo_icon, public_freezmo_snowflake_symbol, public_freezmo_stacked_cards, public_freezmo_dark_squircle_frame [EXTRACTED 1.00]
## Communities (41 total, 15 thin omitted)
### Community 0 - "Desktop App Catalog"
Cohesion: 0.06
Nodes (41): react, ALACRITTY_APP, APP_BY_ID, AppDef, APPS, ContributionsApp(), createWebsiteApp(), EmbeddedSite() (+33 more)
### Community 1 - "Deployment & Ops Docs"
Cohesion: 0.07
Nodes (37): agents.md Cold-Boot Notes, Custom Dev Server (dev-server.mjs), Header-Stripping Frame Proxy (api/frame), SSRF Host Allowlist (api/ping), ThemeRoot Shell Router, Desktop Icon Grid (useDesktopIcons.ts), Vendored braces CVE Patch, Autostart on Boot (systemd / OpenRC) (+29 more)
### Community 2 - "braces Package Metadata"
Cohesion: 0.05
Nodes (37): ansi-colors, bash-path, gulp-format-md, mocha, author, bugs, url, contributors (+29 more)
### Community 3 - "Theme & Clock Components"
Cohesion: 0.10
Nodes (29): WelcomeApp(), Clock(), getTime(), subscribe(), JokerLogo(), ThemeRoot(), ColorScheme, DEFAULT_SCHEME (+21 more)
### Community 4 - "braces Parsing Engine"
Cohesion: 0.10
Nodes (17): compile, expand, parse, stringify, compile(), fill, utils, append() (+9 more)
### Community 5 - "Project Index Data"
Cohesion: 0.13
Nodes (21): HardwareApp(), ProjectsApp(), CodingProjectIndex(), CodingRow(), Group(), HARDWARE_GROUPS, HardwareProjectIndex(), HardwareRow() (+13 more)
### Community 6 - "braces Character Constants"
Cohesion: 0.11
Nodes (3): {
MAX_LENGTH,
CHAR_BACKSLASH, /* \ */
CHAR_BACKTICK, /* ` */
CHAR_COMMA, /* , */
CHAR_DOT, /* . */
CHAR_LEFT_PARENTHESES, /* ( */
CHAR_RIGHT_PARENTHESES, /* ) */
CHAR_LEFT_CURLY_BRACE, /* { */
CHAR_RIGHT_CURLY_BRACE, /* } */
CHAR_LEFT_SQUARE_BRACKET, /* [ */
CHAR_RIGHT_SQUARE_BRACKET, /* ] */
CHAR_DOUBLE_QUOTE, /* " */
CHAR_SINGLE_QUOTE, /* ' */
CHAR_NO_BREAK_SPACE,
CHAR_ZERO_WIDTH_NOBREAK_SPACE
}, parse(), stringify
### Community 7 - "Next Config & API Routes"
Cohesion: 0.15
Nodes (13): nextConfig, next, ALLOWED_HOSTS, clickShim(), fail(), GET(), isAllowedHost(), ALLOWED_HOSTS (+5 more)
### Community 8 - "TypeScript Compiler Config"
Cohesion: 0.11
Nodes (18): compilerOptions, allowJs, esModuleInterop, incremental, isolatedModules, jsx, lib, module (+10 more)
### Community 9 - "Root Package Dependencies"
Cohesion: 0.13
Nodes (14): fill-range, name, private, version, autoprefixer, postcss, react-dom, @svgr/webpack (+6 more)
### Community 10 - "Root Dev Dependencies"
Cohesion: 0.15
Nodes (13): devDependencies, autoprefixer, eslint, eslint-config-next, fill-range, postcss, @svgr/webpack, tailwindcss (+5 more)
### Community 11 - "Custom Dev Server"
Cohesion: 0.29
Nodes (7): app, hasForwardedHeaders(), isDevDebugRequest(), isLocalDebugRequest(), isLoopback(), port, server
### Community 12 - "Debian Dependency Installer"
Cohesion: 0.43
Nodes (6): die(), log(), node_ok(), install-dependencies-deb.sh script, usage(), warn()
### Community 13 - "brace-expansion Overrides"
Cohesion: 0.33
Nodes (6): brace-expansion, brace-expansion, overrides, braces, minimatch@^10.0.0, minimatch@^3.0.0
### Community 14 - "npm Scripts"
Cohesion: 0.33
Nodes (6): scripts, build, dev, dev:next, lint, start
### Community 15 - "Freezmo Icon Visual Identity"
Cohesion: 0.53
Nodes (5): Dark Navy Rounded-Square (Squircle) Frame, Freeze / Preserve State, Freezmo App Icon, Blue Snowflake Symbol, Stacked Card / Document Metaphor
### Community 17 - "Eye Logo & Favicon Assets"
Cohesion: 0.50
Nodes (4): JokerLogo Component Logo Image, Eye Logo Mark (amber iris and pupil), App Icon - Macro Photograph of a Human Eye, All-Seeing Eye / Surveillance Motif
### Community 18 - "ESLint Configuration"
Cohesion: 0.50
Nodes (3): eslintConfig, eslint, eslint-config-next
### Community 19 - "Runtime Dependencies"
Cohesion: 0.50
Nodes (4): dependencies, next, react, react-dom
### Community 20 - "Discord Icon Asset"
Cohesion: 0.50
Nodes (4): Discord (chat platform brand mark), Discord Icon (SVG social link asset), Profile social link icon, SVG Repo (icon asset source)
### Community 21 - "Freezmo App Screenshot"
Cohesion: 0.83
Nodes (4): Freezmo study app, Freezmo App Screenshot (AI-graded quiz screen), Freezmo quiz screen with AI grading feedback, Schuman Plan history question (EU history 1945-1974)
### Community 22 - "Instagram Icon Asset"
Cohesion: 0.67
Nodes (4): Instagram Color Icon (SVG), Instagram Brand/Service, Social Media Link Asset, SVG Repo (Icon Source)
### Community 23 - "Gentoo Logo Asset"
Cohesion: 0.67
Nodes (3): Creative Commons BY-SA 2.5 License, Gentoo Linux ('g' Logo Mark), Gentoo Logo Vector
### Community 24 - "Reddit Icon Asset"
Cohesion: 0.67
Nodes (3): Reddit Logo Icon (SVG), Reddit, SVG Repo
### Community 25 - "Revival Inc. Game Favicon"
Cohesion: 0.67
Nodes (3): Game Controller Logo Mark, Revival Inc. Favicon (yellow character with game controller), Revival Inc. (pygame game for Mini Jame Gam #55)
### Community 26 - "TikTok Icon Asset"
Cohesion: 0.67
Nodes (3): TikTok, TikTok Logo Icon, SVG Repo
## Knowledge Gaps
- **53 isolated node(s):** `react-dom`, `@svgr/webpack`, `@tailwindcss/postcss`, `@types/node`, `@types/react` (+48 more)
These have ≤1 connection - possible missing edges or undocumented components. (Counts symbols only; 212 node(s) total have ≤1 connection when file, concept and rationale nodes are included.)
- **15 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `react` connect `Desktop App Catalog` to `Root Package Dependencies`, `Theme & Clock Components`, `Project Index Data`, `Next Config & API Routes`?**
_High betweenness centrality (0.109) - this node is a cross-community bridge._
- **What connects `react-dom`, `@svgr/webpack`, `@tailwindcss/postcss` to the rest of the system?**
_53 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Desktop App Catalog` be split into smaller, more focused modules?**
_Cohesion score 0.05584415584415584 - nodes in this community are weakly interconnected._
- **Why does `next` connect `Next Config & API Routes` to `Desktop App Catalog`, `Root Package Dependencies`, `Custom Dev Server`, `Theme & Clock Components`?**
_High betweenness centrality (0.092) - this node is a cross-community bridge._
- **Should `Deployment & Ops Docs` be split into smaller, more focused modules?**
_Cohesion score 0.07396870554765292 - nodes in this community are weakly interconnected._
- **Why does `KDE Plasma Desktop Simulation Shell` connect `Deployment & Ops Docs` to `Desktop App Catalog`?**
_High betweenness centrality (0.054) - this node is a cross-community bridge._
- **Should `braces Package Metadata` be split into smaller, more focused modules?**
_Cohesion score 0.05263157894736842 - nodes in this community are weakly interconnected._

474
graphify-out/graph.html Normal file

File diff suppressed because one or more lines are too long

1
graphify-out/graph.json Normal file

File diff suppressed because one or more lines are too long

380
graphify-out/manifest.json Normal file
View file

@ -0,0 +1,380 @@
{
"deploy/install-system-service.sh": {
"mtime": 1791733935.6445713,
"seen": 1792088878.5675395,
"ast_hash": "9abfcfc7d7a91086399567bedb70cf1b",
"semantic_hash": "9abfcfc7d7a91086399567bedb70cf1b"
},
"eslint.config.mjs": {
"mtime": 1791733935.6445713,
"seen": 1792088878.567546,
"ast_hash": "c38fbd8e2b4f1979d62aa0378953faf4",
"semantic_hash": "c38fbd8e2b4f1979d62aa0378953faf4"
},
"install-dependencies-deb.sh": {
"mtime": 1791733935.6445713,
"seen": 1792088878.567549,
"ast_hash": "a6491716d226a87668faa53c605793ba",
"semantic_hash": "a6491716d226a87668faa53c605793ba"
},
"next.config.ts": {
"mtime": 1791733935.6445713,
"seen": 1792088878.567551,
"ast_hash": "03388a201be8750ddcddb14dfbc34411",
"semantic_hash": "03388a201be8750ddcddb14dfbc34411"
},
"package.json": {
"mtime": 1791733935.6445713,
"seen": 1792088878.5675533,
"ast_hash": "9dc8d0f30ee052e4d46bfd2ee4ac5f61",
"semantic_hash": "9dc8d0f30ee052e4d46bfd2ee4ac5f61"
},
"postcss.config.mjs": {
"mtime": 1790099669.0082622,
"seen": 1792088878.5675554,
"ast_hash": "675899342e765a4d16acd75a53389101",
"semantic_hash": "675899342e765a4d16acd75a53389101"
},
"scripts/dev-server.mjs": {
"mtime": 1791733935.6445713,
"seen": 1792088878.5675573,
"ast_hash": "efaaa5b58912a9ed8acbe0357af9dee5",
"semantic_hash": "efaaa5b58912a9ed8acbe0357af9dee5"
},
"src/app/api/activities/route.ts": {
"mtime": 1790198894.317407,
"seen": 1792088878.5675657,
"ast_hash": "5a36ba33a9e53094b5b12c8cea9aaf38",
"semantic_hash": "5a36ba33a9e53094b5b12c8cea9aaf38"
},
"src/app/api/frame/route.ts": {
"mtime": 1791733935.6445713,
"seen": 1792088878.5675678,
"ast_hash": "d3b5c01d3dddc131cffbda522e30abdd",
"semantic_hash": "d3b5c01d3dddc131cffbda522e30abdd"
},
"src/app/api/heatmap/route.ts": {
"mtime": 1791733935.6445713,
"seen": 1792088878.5675697,
"ast_hash": "e5759aac7f197c16dae54978b4218b14",
"semantic_hash": "e5759aac7f197c16dae54978b4218b14"
},
"src/app/api/ping/route.ts": {
"mtime": 1791733935.6454856,
"seen": 1792088878.5675719,
"ast_hash": "6b03fc03bf5b697654a794b4abd41686",
"semantic_hash": "6b03fc03bf5b697654a794b4abd41686"
},
"src/app/components/Clock.tsx": {
"mtime": 1790099669.0268312,
"seen": 1792088878.567574,
"ast_hash": "5e778da11f81f03e049c95984ace3308",
"semantic_hash": "5e778da11f81f03e049c95984ace3308"
},
"src/app/components/ContributionHeatmap.tsx": {
"mtime": 1791733935.6454856,
"seen": 1792088878.5675762,
"ast_hash": "7e4726a71926285f271502d61f24c60c",
"semantic_hash": "7e4726a71926285f271502d61f24c60c"
},
"src/app/components/FeatureWindow.tsx": {
"mtime": 1791733935.6454856,
"seen": 1792088878.567578,
"ast_hash": "4f3c02b1818cc96a47ccb4f42159c9e4",
"semantic_hash": "4f3c02b1818cc96a47ccb4f42159c9e4"
},
"src/app/components/JokerLogo.tsx": {
"mtime": 1790099669.0268312,
"seen": 1792088878.5675802,
"ast_hash": "ff265a30441bfbb9747eda8995585e47",
"semantic_hash": "ff265a30441bfbb9747eda8995585e47"
},
"src/app/components/ProjectIndex.tsx": {
"mtime": 1791748183.6609728,
"seen": 1792088878.5675821,
"ast_hash": "bf08ee83fbbf3649818f5ce91f6d45dd",
"semantic_hash": "bf08ee83fbbf3649818f5ce91f6d45dd"
},
"src/app/components/ServiceButton.tsx": {
"mtime": 1791733935.6454856,
"seen": 1792088878.567584,
"ast_hash": "26155305f67ac7f5410ea25003720742",
"semantic_hash": "26155305f67ac7f5410ea25003720742"
},
"src/app/components/ThemeRoot.tsx": {
"mtime": 1791733935.6454856,
"seen": 1792088878.567586,
"ast_hash": "46dcb83e61433c3499ade21cd60d7f82",
"semantic_hash": "46dcb83e61433c3499ade21cd60d7f82"
},
"src/app/components/ThemeScript.tsx": {
"mtime": 1791733935.6454856,
"seen": 1792088878.5675883,
"ast_hash": "20e25c727b4bb982e5a22d65efece143",
"semantic_hash": "20e25c727b4bb982e5a22d65efece143"
},
"src/app/components/WebLayout.tsx": {
"mtime": 1792092782.574,
"seen": 1792093031.8826597,
"ast_hash": "323262c6d5c5735b3707d2421d89dbd1",
"semantic_hash": "323262c6d5c5735b3707d2421d89dbd1"
},
"src/app/components/WinWindow.tsx": {
"mtime": 1791733935.6454856,
"seen": 1792088878.5675924,
"ast_hash": "336cb738822d73c0689bf760db468bdc",
"semantic_hash": "336cb738822d73c0689bf760db468bdc"
},
"src/app/components/WindowsDesktop.tsx": {
"mtime": 1791733935.6454856,
"seen": 1792088878.5675943,
"ast_hash": "f9a28298808e2cf91d700252a89e4768",
"semantic_hash": "f9a28298808e2cf91d700252a89e4768"
},
"src/app/components/apps.tsx": {
"mtime": 1791752129.879261,
"seen": 1792088878.5675964,
"ast_hash": "a4d5915c8dfa3313e1722ed0a5a1fe8c",
"semantic_hash": "a4d5915c8dfa3313e1722ed0a5a1fe8c"
},
"src/app/components/useColorScheme.ts": {
"mtime": 1791733935.6464856,
"seen": 1792088878.5675986,
"ast_hash": "b3f1f21c487b13ffb3e5ea98048fb27b",
"semantic_hash": "b3f1f21c487b13ffb3e5ea98048fb27b"
},
"src/app/components/useDesktopIcons.ts": {
"mtime": 1791733935.6464856,
"seen": 1792088878.5676007,
"ast_hash": "b6ffc5acc6e6be3026e42f09366b9fd1",
"semantic_hash": "b6ffc5acc6e6be3026e42f09366b9fd1"
},
"src/app/components/useTheme.ts": {
"mtime": 1791733935.6464856,
"seen": 1792088878.5676026,
"ast_hash": "310fcaa91369d6bc5e741a618ed7e497",
"semantic_hash": "310fcaa91369d6bc5e741a618ed7e497"
},
"src/app/data.ts": {
"mtime": 1791752129.875261,
"seen": 1792088878.5676048,
"ast_hash": "014c9a0639032f6d6174b41f7e8a8cfc",
"semantic_hash": "014c9a0639032f6d6174b41f7e8a8cfc"
},
"src/app/layout.tsx": {
"mtime": 1791733935.6464856,
"seen": 1792088878.5676067,
"ast_hash": "18f380fe272fab5884f0cf69e82dc32b",
"semantic_hash": "18f380fe272fab5884f0cf69e82dc32b"
},
"src/app/page.tsx": {
"mtime": 1791733935.6464856,
"seen": 1792088878.5676088,
"ast_hash": "28a1132f8ed6e3535605628ded40a06c",
"semantic_hash": "28a1132f8ed6e3535605628ded40a06c"
},
"src/app/revival-inc/page.tsx": {
"mtime": 1790099669.0272624,
"seen": 1792088878.567611,
"ast_hash": "156ec7340a49eea1d5ef4ea25d819531",
"semantic_hash": "156ec7340a49eea1d5ef4ea25d819531"
},
"tsconfig.json": {
"mtime": 1790099669.0282624,
"seen": 1792088878.567613,
"ast_hash": "77cde76abc2f77404a39eb82c83f93f2",
"semantic_hash": "77cde76abc2f77404a39eb82c83f93f2"
},
"vendor/braces/index.js": {
"mtime": 1791733935.6484516,
"seen": 1792088878.567615,
"ast_hash": "c930a02f71a7a9e836b9f5dd5ae5ee28",
"semantic_hash": "c930a02f71a7a9e836b9f5dd5ae5ee28"
},
"vendor/braces/lib/compile.js": {
"mtime": 1791733935.6484516,
"seen": 1792088878.567617,
"ast_hash": "a5d79ddc6c8ac559eb67ccada22eac10",
"semantic_hash": "a5d79ddc6c8ac559eb67ccada22eac10"
},
"vendor/braces/lib/constants.js": {
"mtime": 1791733935.648663,
"seen": 1792088878.5676193,
"ast_hash": "b0ea09ec9d44fe804b39baeb7a61dbd1",
"semantic_hash": "b0ea09ec9d44fe804b39baeb7a61dbd1"
},
"vendor/braces/lib/expand.js": {
"mtime": 1791733935.648663,
"seen": 1792088878.5676212,
"ast_hash": "d0363b99cf426d943316c9a59a569553",
"semantic_hash": "d0363b99cf426d943316c9a59a569553"
},
"vendor/braces/lib/parse.js": {
"mtime": 1791733935.648663,
"seen": 1792088878.5676231,
"ast_hash": "9502a7b0b34e5aa38c4ecb698d69a764",
"semantic_hash": "9502a7b0b34e5aa38c4ecb698d69a764"
},
"vendor/braces/lib/stringify.js": {
"mtime": 1791733935.648663,
"seen": 1792088878.5676253,
"ast_hash": "854eede33eb006466c3cd3c1806b59f8",
"semantic_hash": "854eede33eb006466c3cd3c1806b59f8"
},
"vendor/braces/lib/utils.js": {
"mtime": 1791733935.648663,
"seen": 1792088878.5676272,
"ast_hash": "d1d327410bc14133ade065aa70b4d277",
"semantic_hash": "d1d327410bc14133ade065aa70b4d277"
},
"vendor/braces/package.json": {
"mtime": 1791733935.648663,
"seen": 1792088878.5676293,
"ast_hash": "3cf412b93228122553b7fde369773e30",
"semantic_hash": "3cf412b93228122553b7fde369773e30"
},
"DEPLOYMENT.md": {
"mtime": 1790099669.0079331,
"seen": 1792088878.5676312,
"ast_hash": "b81dea2175efa2b0b6c38451ab5a4bbd",
"semantic_hash": "b81dea2175efa2b0b6c38451ab5a4bbd"
},
"README.md": {
"mtime": 1791752424.8048594,
"seen": 1792088878.5676332,
"ast_hash": "56b4d66dfd84d63c081e89f9b83a2473",
"semantic_hash": "56b4d66dfd84d63c081e89f9b83a2473"
},
"agents.md": {
"mtime": 1791754434.7755237,
"seen": 1792088878.5676353,
"ast_hash": "0f3349e68bf149d70a6a28ae4b46b75e",
"semantic_hash": "0f3349e68bf149d70a6a28ae4b46b75e"
},
"public/llms.txt": {
"mtime": 1790099669.0182621,
"seen": 1792088878.5676372,
"ast_hash": "c78b6098bfcb915f16f6cec548f2c0bc",
"semantic_hash": "c78b6098bfcb915f16f6cec548f2c0bc"
},
"public/revival-inc/index.html": {
"mtime": 1790099669.021069,
"seen": 1792088878.5676398,
"ast_hash": "82047937d12fa42abb1997311df592ab",
"semantic_hash": "82047937d12fa42abb1997311df592ab"
},
"public/robots.txt": {
"mtime": 1790099669.021069,
"seen": 1792088878.567642,
"ast_hash": "c6693e078404de1e6e9a6372e48e604b",
"semantic_hash": "c6693e078404de1e6e9a6372e48e604b"
},
"vendor/braces/README.md": {
"mtime": 1791733935.6484516,
"seen": 1792088878.567644,
"ast_hash": "1a5800b8ce5218a9a54e4de6d0de66dc",
"semantic_hash": "1a5800b8ce5218a9a54e4de6d0de66dc"
},
"public/discord.svg": {
"mtime": 1790099669.0142622,
"seen": 1792088878.567646,
"ast_hash": "3ade8600c72a99dac523ad990bd59e8b",
"semantic_hash": "3ade8600c72a99dac523ad990bd59e8b"
},
"public/freezmo-app.webp": {
"mtime": 1791751264.7117522,
"seen": 1792088878.5676477,
"ast_hash": "8cb16536265245385e56bda1eac49439",
"semantic_hash": "8cb16536265245385e56bda1eac49439"
},
"public/gentoo.svg": {
"mtime": 1790099669.0142622,
"seen": 1792088878.5676498,
"ast_hash": "9e88566be5538fdd93868dc98818b9ff",
"semantic_hash": "9e88566be5538fdd93868dc98818b9ff"
},
"public/github.svg": {
"mtime": 1790099669.0142622,
"seen": 1792088878.5676517,
"ast_hash": "86a06412a2ae8f9ae304d60a95aa6454",
"semantic_hash": "86a06412a2ae8f9ae304d60a95aa6454"
},
"public/instagram.svg": {
"mtime": 1790099669.0172622,
"seen": 1792088878.5676537,
"ast_hash": "0bdc0f84a7ca0d7048702145ae66cea0",
"semantic_hash": "0bdc0f84a7ca0d7048702145ae66cea0"
},
"public/itchio.svg": {
"mtime": 1790099669.0172622,
"seen": 1792088878.5676556,
"ast_hash": "0732b23e4e3278b5040ca2c6b5e19332",
"semantic_hash": "0732b23e4e3278b5040ca2c6b5e19332"
},
"public/joker.webp": {
"mtime": 1790099669.0172622,
"seen": 1792088878.5676577,
"ast_hash": "aef446a911b72c0921f719ba0ac511dd",
"semantic_hash": "aef446a911b72c0921f719ba0ac511dd"
},
"public/linkedin.svg": {
"mtime": 1790099669.0182621,
"seen": 1792088878.5676599,
"ast_hash": "1afd545bf403f6c131c2d5a008802469",
"semantic_hash": "1afd545bf403f6c131c2d5a008802469"
},
"public/quip.svg": {
"mtime": 1790099669.0192623,
"seen": 1792088878.5676618,
"ast_hash": "01cf69893c109da07f143f960918cc07",
"semantic_hash": "01cf69893c109da07f143f960918cc07"
},
"public/reddit.svg": {
"mtime": 1790099669.0192623,
"seen": 1792088878.567664,
"ast_hash": "2d7c840f35b64499e0dbf488383fea6e",
"semantic_hash": "2d7c840f35b64499e0dbf488383fea6e"
},
"public/revival-inc/favicon.png": {
"mtime": 1790099669.0192623,
"seen": 1792088878.5676658,
"ast_hash": "51589f25eb6e3fd068c04d4b44a62283",
"semantic_hash": "51589f25eb6e3fd068c04d4b44a62283"
},
"public/snapchat.svg": {
"mtime": 1790099669.0232623,
"seen": 1792088878.567668,
"ast_hash": "39326ab4c6c6b7c51058315987addb56",
"semantic_hash": "39326ab4c6c6b7c51058315987addb56"
},
"public/soundcloud.svg": {
"mtime": 1790099669.0232623,
"seen": 1792088878.56767,
"ast_hash": "898729511991ec9506221654220c2dca",
"semantic_hash": "898729511991ec9506221654220c2dca"
},
"public/tiktok.svg": {
"mtime": 1790099669.0232623,
"seen": 1792088878.567672,
"ast_hash": "62f0b987b0c084d6d0446f3281a46615",
"semantic_hash": "62f0b987b0c084d6d0446f3281a46615"
},
"public/twitter.svg": {
"mtime": 1790099669.0232623,
"seen": 1792088878.5676744,
"ast_hash": "d6987792e52df7ef416d72d8c73e80d1",
"semantic_hash": "d6987792e52df7ef416d72d8c73e80d1"
},
"src/app/icon.png": {
"mtime": 1790099669.0272624,
"seen": 1792088878.5676763,
"ast_hash": "df0e23deb9fd1cdfc389578a3be34f7c",
"semantic_hash": "df0e23deb9fd1cdfc389578a3be34f7c"
},
"public/freezmo.png": {
"mtime": 1792092771.5786166,
"seen": 1792093031.8827293,
"ast_hash": "6f69e16823f10d9c7af1625eff2b32e8",
"semantic_hash": "6f69e16823f10d9c7af1625eff2b32e8"
}
}

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "dvorakmortonxd", "name": "dvorakmortonxd",
"version": "2.2.14", "version": "2.2.15",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "dvorakmortonxd", "name": "dvorakmortonxd",
"version": "2.2.14", "version": "2.2.15",
"dependencies": { "dependencies": {
"next": "^16.3.8", "next": "^16.3.8",
"react": "^19.3.0", "react": "^19.3.0",

View file

@ -1,6 +1,6 @@
{ {
"name": "dvorakmortonxd", "name": "dvorakmortonxd",
"version": "2.2.14", "version": "2.2.15",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "node scripts/dev-server.mjs", "dev": "node scripts/dev-server.mjs",

BIN
public/freezmo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

View file

@ -273,7 +273,7 @@ export default function WebLayout() {
</div> </div>
<div className="web-freezmo-shot"> <div className="web-freezmo-shot">
<Image <Image
src="/freezmo-app.webp" src="/freezmo.png"
alt="Freezmo quiz screen — a history question about the Schuman plan with AI grading feedback" alt="Freezmo quiz screen — a history question about the Schuman plan with AI grading feedback"
width={1941} width={1941}
height={942} height={942}
@ -340,7 +340,7 @@ export default function WebLayout() {
</Section> </Section>
<footer className="web-footer glass"> <footer className="web-footer glass">
<span className="web-footer-label">v2.2.14</span> <span className="web-footer-label">v2.2.15</span>
© 2025-2026 Martin Dvořák. All rights reserved (not really I dont care, just © 2025-2026 Martin Dvořák. All rights reserved (not really I dont care, just
follow the GPL3.0 License) follow the GPL3.0 License)
</footer> </footer>