dev-app-optimizer
Systematic app optimization via multi-dimensional scoring, competitive benchmarking, and Quick Wins sprints. Use when the user wants to improve, optimize, audit, or enhance any web app or app suite —
Файлы1
Открыть в GitHubSKILL.mdskills/dev-app-optimizer/SKILL.md
GitHubApp Optimizer
Holistic app optimization — not just endpoint counts, but real product quality across 6 dimensions.
When to Use
- User says "optimize", "improve", "audit", "what's missing", "quick wins"
- User has a web app (or suite) and wants to systematically improve it
- User wants to benchmark against competitors
- User wants to rapidly add many small features
The 6-Phase Workflow
Phase 1: Explore → Phase 2: Score → Phase 3: Prioritize → Phase 4: Execute → Phase 5: Verify → Phase 6: Record
Always start by asking: "Which phase are we in?" If the user already has test results, skip to Phase 3. If they just want to execute, skip to Phase 4.
Phase 1: Exploratory Testing
Goal: Understand what each app actually DOES, not just count endpoints.
Per-App Checklist (read app.py + pages/index.html)
Backend Depth — not just route count, but:
- Does it have CRUD? (create/read/update/delete)
- Does it persist data? (JSON, vault, SQLite)
- Does it use LLM? (self.think for smart features)
- Does it call other apps? (call_app for composition)
- Does it emit events? (for reactor/staff to react to)
UI Quality — open the page:
- Does it have a custom page or auto-generated?
- Does it show data meaningfully? (charts, lists, cards)
- Can user interact? (add/edit/delete from UI)
- Mobile responsive? (test at 390px)
- Uses shared components? (eos-components.css/js)
Integration — how connected is it?
- Which apps depend on it?
- Which apps does it depend on?
- Events emitted/listened?
- Used by staff agents?
- Used by dashboard/hub?
LLM Quality — how smart is it?
- Does it use LLM for data entry? (smart-add, parsing)
- Does it use LLM for insights? (trends, recommendations)
- Does it use LLM for generation? (content, suggestions)
- Does it support streaming?
- Per-app provider configurable?
Phase 2: Multi-Dimensional Scoring
Goal: Score each app on 6 dimensions, not just endpoints.
The 8 Dimensions (each 0-15 points, total 0-120)
| Dimension | What to Measure | 0 pts | 8 pts | 15 pts |
|---|---|---|---|---|
| Backend | API completeness | 1-2 endpoints | 5-10 CRUD | 15+ full lifecycle |
| Frontend | UI quality | No custom UI | Basic list/form | Rich interactive, charts, modals |
| AI Utilization | How deeply LLM is used | No LLM | Basic think() for one task | Smart-add + insights + streaming + multi-provider |
| App Collaboration | Inter-app connections | Standalone island | Emits events | call_app + events + staff agent + dashboard + slash command |
| Vault Integration | Obsidian vault usage | No vault interaction | Reads from vault | Read + write + wikilinks + frontmatter + vault watcher |
| User Innovation | Creative interaction patterns | Static CRUD | Search + filter | Voice I/O, AI chat, drag actions, real-time, /commands |
| Data | Persistence + history | No persistence | JSON state | Vault + JSON + JSONL + export + import |
| UX Polish | Experience details | Broken/ugly | Functional | Streaks, heatmaps, achievements, mobile, themes |
Dimension Deep-Dives
AI Utilization (0-15)
How deeply does the app leverage AI? Not "does it call think()" but "does AI make this app fundamentally better?"
| Score | Description | Example |
|---|---|---|
| 0 | No LLM | git, run, tmpl |
| 3 | Basic think() — one-shot answer | divination (interpretation) |
| 6 | Smart input parsing | expense (smart-add parses "20 woolworths grocery") |
| 9 | Analysis + recommendations | healing (mood-activity correlations + care alerts) |
| 12 | Multi-modal AI pipeline | search (LLM keyword expansion → RAG → markdown render) |
| 15 | AI-native workflow | staff (OBSERVE→DECIDE→ACT autonomous agents), assistant (multi-session streaming chat) |
App Collaboration (0-15)
How well does this app work WITH other apps? An island app scores 0.
| Score | Description | Example |
|---|---|---|
| 0 | No connections | cable-pulling |
| 3 | Emits events only | meditation (emits meditation:completed) |
| 6 | Emits + listened by reactor | capture (reactor logs, staff processes) |
| 9 | call_app() composition | dashboard (pulls from 5+ apps), review (aggregates week) |
| 12 | Full ecosystem participant | task (called by staff, briefing, focus, dashboard, assistant /tasks) |
| 15 | Hub/orchestrator | hub (aggregates all), assistant (slash commands to 13 apps), staff (22 agents calling 20+ apps) |
Vault Integration (0-15)
How deeply integrated with the Obsidian vault?
| Score | Description | Example |
|---|---|---|
| 0 | No vault interaction | app-analytics, billing |
| 3 | Reads from vault (one folder) | media (scans Books/, Entertainment/) |
| 6 | Read + write vault notes | journal (creates daily notes), capture (appends to inbox) |
| 9 | Full vault CRUD + frontmatter | contacts (creates @Person.md, parses frontmatter, quick log) |
| 12 | Vault-native data model | task (scans 3 folders, checkbox syntax, due dates from markdown) |
| 15 | Vault as primary storage + wikilinks | dictionary (saves words as notes, SRS metadata in frontmatter, [[wikilinks]] between notes) |
User Innovation (0-15)
Does the app offer creative, engaging interaction beyond basic CRUD?
| Score | Description | Example |
|---|---|---|
| 0 | No interaction (backend only) | reactor |
| 3 | Basic form input | capture (text input → save) |
| 6 | Rich UI interactions | expense (smart-add, category chips, heatmap click) |
| 9 | AI-powered interactions | search (semantic search + AI Ask + provider retry) |
| 12 | Multi-modal | speaking (voice I/O + AI feedback), studio (prompt + style + gallery) |
| 15 | Conversational + autonomous | assistant (WebSocket chat, slash commands, streaming, sessions), staff (autonomous agents that act on your behalf) |
Score Card Template
| App | Backend | Frontend | AI | Collab | Vault | Innovation | Data | UX | Total | Grade |
|-----|---------|----------|----|--------|-------|------------|------|----|-------|-------|
| assistant | 12 | 14 | 15 | 15 | 9 | 15 | 10 | 12 | 102 | A |
| nutrition | 15 | 14 | 12 | 10 | 6 | 9 | 15 | 12 | 93 | A- |
| task | 12 | 12 | 6 | 15 | 15 | 6 | 12 | 10 | 88 | B+ |
| reactor | 2 | 0 | 0 | 15 | 0 | 0 | 3 | 0 | 20 | F |
Grade Scale
- A (96+): Best-in-class, could be a standalone product
- A- (84-95): Excellent, daily driver quality
- B+ (72-83): Strong, minor gaps
- B (60-71): Good, usable daily but missing features
- C (40-59): Functional but thin
- D (20-39): Stub, barely usable
- F (<20): Placeholder or broken
Key Principle: Balance > Total
An app scoring 60 with all dimensions ≥ 6 is BETTER than one scoring 75 with three dimensions at 0. Balance matters — a beautiful UI with no data persistence is worse than a plain UI that saves everything.
Competitive Benchmark
For each app, compare against the BEST in category:
| App | vs Competitor | Our Score | Their Score | Gap | Key Missing |
|-----|--------------|-----------|-------------|-----|-------------|
| expense | YNAB | 64% | 100% | -36% | Bank linking, multi-currency |
Don't inflate scores. A 60% against Todoist is honest and useful. A fake 85% hides real gaps.
Phase 3: Prioritize (Quick Win Selection)
Goal: Sort improvements by ROI across ALL dimensions, not just backend.
Impact × Effort Matrix
| Low Effort | Medium Effort | High Effort | |
|---|---|---|---|
| High Impact | 🔥 DO FIRST | ⭐ Priority | 📋 Plan |
| Medium Impact | ⭐ Priority | 📋 Plan | 🔜 Later |
| Low Impact | 📋 Plan | 🔜 Later | ❌ Skip |
Quick Win Patterns by Dimension
Backend patterns:
| Pattern | Example | Effort |
|---|---|---|
| Stats endpoint | Totals, averages, breakdowns | Low |
| History endpoint | Last N items | Low |
| Search/filter | Query params on list | Low |
| Export (JSON/CSV) | Download data | Low |
| Streak calculation | Consecutive days | Low |
Frontend patterns:
| Pattern | Example | Effort |
|---|---|---|
| Hero stats cards | 2-4 key numbers at top | Low |
| Heatmap | GitHub-style activity grid | Medium |
| Progress ring/bar | SVG circle or bar fill | Low |
| Filter chips | Type/status/category toggles | Low |
| Sort dropdown | A-Z, date, rating | Low |
| Empty state | Helpful message when no data | Low |
| Toast notifications | Feedback on actions | Low |
Data patterns:
| Pattern | Example | Effort |
|---|---|---|
| Vault write | Save to Obsidian note | Low |
| Activity log | JSONL append (use self.log_activity) | Low |
| Daily/monthly aggregation | Stats by period | Medium |
| Import from file | CSV/JSON upload | Medium |
Intelligence patterns:
| Pattern | Example | Effort |
|---|---|---|
| Smart-add | LLM parses natural language input | Medium |
| AI insight | LLM analyzes trends + suggests | Medium |
| Auto-categorize | LLM classifies input | Low |
| Reflection/summary | LLM generates narrative | Medium |
Integration patterns:
| Pattern | Example | Effort |
|---|---|---|
| Emit events | Other apps can react | Low |
| Manifest events declared | Reactor can listen | Low |
| Dashboard widget | Hub/dashboard shows summary | Low |
| Staff agent | Autonomous monitoring | Medium |
| Slash command | /expense in assistant | Low |
UX Polish patterns:
| Pattern | Example | Effort |
|---|---|---|
| Streak display | "7 day streak 🔥" | Low |
| Achievement badges | Milestones (10, 50, 100) | Low |
| Trend indicator | ↑12% vs last week | Low |
| Mobile responsive | Stack layout <400px | Low |
| Keyboard shortcuts | Enter to submit | Low |
| Loading skeleton | Shimmer while fetching | Low |
Select Top 10
Pick improvements across DIFFERENT dimensions. Don't just add 10 endpoints — add 3 endpoints + 2 UI features + 2 integrations + 3 UX polish items.
Phase 4: Batch Execution
Goal: Rapidly implement Quick Wins in mixed batches.
Batch Rhythm
Pick 4-6 QWs (mixed dimensions) → Backend → Frontend → Integration → Verify → Commit
Execution Rules
- Search before building —
grepthe codebase first. - Backend first — API endpoint, verify with
curl, then build UI. - Minimal changes — Don't refactor. Just add the feature.
- Mixed batches — Each batch should touch at least 2 dimensions.
- Commit every batch with descriptive message.
EmptyOS-Specific Patterns
# Backend: new endpoint
@web_route("GET", "/api/feature")
async def api_feature(self, request):
return {"key": "value"}
# Intelligence: LLM-powered
result = await self.think("Analyze this data...", domain="text")
# Integration: call another app
tasks = await self.call_app("task", "list_tasks")
# Integration: emit event
await self.emit("myapp:action", {"detail": "..."})
# Data: activity logging (platform service)
self.log_activity({"action": "created", "item": name})
# Data: vault write
self.vault_write("report.md", content)
Frontend Template (EmptyOS style)
<script src="/static/realtime.js"></script>
<script src="/static/eos.js"></script>
<script src="/static/eos-components.js"></script>
<script>EOS.nav('appname');</script>
<!-- Use: EOS.api(), EOS.post(), EOS_UI.toast(), EOS_UI.renderMarkdown() -->
<!-- Use: EOS.viewNote(), EOS.editNote(), EOS.noteActions() for vault notes -->
Phase 5: Verification
Goal: Verify across all dimensions, not just API responses.
Multi-Dimension Verification
- Backend:
curleach endpoint, check JSON response - Frontend: Open page, check rendering, try interactions
- Data: Check persistence (JSON file exists, vault note created)
- Intelligence: Test LLM feature (does smart-add actually parse?)
- Integration: Check events emitted (
/api/events?type=myapp:*) - UX: Test mobile (390px), check streaks/achievements update
Regression Checks
- New features don't break existing ones
- CSS class conflicts (use app-specific prefixes)
- API response format unchanged
- Events still firing correctly
Phase 6: Record & Measure
Goal: Document improvement across all dimensions.
Score Card Update
| App | Before | After | Delta | Key Improvements |
|-----|--------|-------|-------|-----------------|
| expense | 74/120 (C+) | 94/120 (A) | +20 | YTD endpoint, budget UI, staff agent, streak |
Metrics to Track
| Metric | How |
|---|---|
| Total score delta | Sum of all dimension deltas |
| Endpoints added | grep count |
| UI pages added/improved | ls pages/ |
| Events declared | grep manifest emits |
| Staff agents connected | count observe_apps references |
| LLM features added | grep self.think |
| Code quality | /simplify review |
Overall System Health
| Dimension | Average Score | Best App | Worst App |
|-----------|--------------|----------|-----------|
| Backend | 14/20 | nutrition (18) | reactor (2) |
| Frontend | 12/20 | expense (16) | run (0) |
| Data | 13/20 | reader (16) | _example (0) |
| Intelligence | 10/20 | search (18) | git (0) |
| Integration | 11/20 | task (16) | cable-pulling (2) |
| UX Polish | 9/20 | focus (14) | tmpl (0) |
Decision Frameworks
"Which dimension to improve?"
- Backend < 8: App is a stub — add core CRUD first
- Frontend = 0: No custom UI — build one (biggest user impact)
- Intelligence = 0: No LLM — add smart-add or AI insight (differentiator)
- Integration < 4: Island app — add events + manifest declarations
- UX < 6: Functional but ugly — add streaks, empty states, mobile
"Should I Build This?"
- Does it already exist? → Search first
- Which dimension does it improve?
- Will the user notice it daily? → High impact
- Can I build it in <30 min? → Low effort = do it
"80% Rule"
- 80% = all 6 dimensions ≥ 12/20
- Don't over-invest in one dimension while others are at 0
- A balanced 70/120 is better than lopsided 90/120 with 0 frontend
Anti-Patterns
| Don't | Do Instead |
|---|---|
| Count only endpoints | Score across 6 dimensions |
| Add 10 endpoints to one app | Add 2 endpoints + UI + integration to 3 apps |
| Refactor while adding features | Add only, refactor later |
| Build abstractions for one use | Write direct code |
| Skip frontend work | Every backend feature needs a UI |
| Ignore integration | Events + manifest + staff = system value |
| Aim for 100% | Stop at 80% (all dimensions ≥ 12) |
Reference
EmptyOS Architecture Cheat Sheet
App = manifest.toml + app.py + pages/index.html
API = @web_route("METHOD", "/api/path")
WS = @ws_route("/ws/path")
CLI = @cli_command("name")
Events = @on_event("type") + await self.emit("type", data)
LLM = await self.think(prompt) / self.think_stream() / self._think_with_provider()
Apps = await self.call_app("app_id", "method", **kwargs)
Data = self.data_dir (JSON) / self.vault_write() (markdown) / self.log_activity() (JSONL)
UI = EOS.api() / EOS.post() / EOS_UI.toast() / EOS_UI.renderMarkdown()
Free APIs for Features
| API | Use | Key Required |
|---|---|---|
| Open-Meteo | Weather | No |
| Datamuse | Word suggestions | No |
| Free Dictionary | English definitions | No |
| MyMemory | Translation | No |