docs: memory and task CRUD scripts

- Add gantt task CRUD bash and TypeScript utilities
- Update MEMORY.md with CRUD capabilities and rules
- Update daily memory with subagent completions
- Document: full task links, attach-then-delete rule
This commit is contained in:
Matt Bruce 2026-02-21 16:32:24 -06:00
parent 806a61acf1
commit 9cfd7843b8
21 changed files with 1839 additions and 8 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.vercel

View File

@ -6,14 +6,17 @@ This folder is home. Treat it that way.
If `BOOTSTRAP.md` exists, that's your birth certificate. Follow it, figure out who you are, then delete it. You won't need it again.
## Every Session
## Every Session - START HERE
Before doing anything else:
**READ `SESSION_STARTUP.md` FIRST** - This tells you exactly what to read and in what order. Your memory resets every session. The files are your memory.
Then:
1. Read `SOUL.md` — this is who you are
2. Read `USER.md` — this is who you're helping
3. Read `memory/YYYY-MM-DD.md` (today + yesterday) for recent context
4. **If in MAIN SESSION** (direct chat with your human): Also read `MEMORY.md`
3. Read `TOOLS.md` — all projects, URLs, credentials
4. Read `memory/YYYY-MM-DD.md` (today + yesterday) for recent context
5. Read `PROJECT_SETUP.md` — where to create new projects
6. **If in MAIN SESSION**: Also read `MEMORY.md`
Don't ask permission. Just do it.
@ -45,6 +48,21 @@ Capture what matters. Decisions, context, things to remember. Skip the secrets u
- When you make a mistake → document it so future-you doesn't repeat it
- **Text > Brain** 📝
## Project Creation Rules
**ALWAYS create new projects in `/Users/mattbruce/Documents/Projects/OpenClaw/`**
- **Web projects:** `OpenClaw/Web/[project-name]/`
- **iOS projects:** `OpenClaw/iOS/[project-name]/`
- **Documents:** `OpenClaw/Documents/`
**NEVER create projects in:**
- `/Users/mattbruce/` (home root)
- `/Users/mattbruce/.openclaw/workspace/` (agent workspace)
- Random other locations
See `PROJECT_SETUP.md` for full details.
## Safety
- Don't exfiltrate private data. Ever.

185
MEMORY.md Normal file
View File

@ -0,0 +1,185 @@
# MEMORY.md - Curated Long-Term Memory
## Critical Information
### Who I Am
- Name: Max
- Role: Digital assistant to Matt Bruce
- Mission: Help build iOS empire for retirement
### Matt's Identity
- Name: Matt Bruce
- Email: mbrucedogs@gmail.com
- Work: iOS Lead Architect at Toyota (contractor)
- Goal: Build side hustle to retire early, travel with Heidi
### Project Locations (ALWAYS CHECK TOOLS.md)
All projects in: `/Users/mattbruce/Documents/Projects/OpenClaw/`
**Active Web Projects:**
- Gantt Board: https://gantt-board.vercel.app (port 3000)
- Login: mbruce+max@topdoglabs.com / !7883Gantt
- Stack: Next.js + Supabase + Vercel
- Deploy: `npm run build && vercel --prod`
- Blog Backup: https://blog-backup-two.vercel.app (port 3002)
- Mission Control: https://mission-control-rho-pink.vercel.app/ (port 3001)
- Heartbeat Monitor: port 3005
### Infrastructure
- Gitea: http://192.168.1.128:3000 (ai-agent / !7883Gitea)
**Supabase Projects (separate for each app):**
- gantt-board: https://qnatchrjlpehiijwtreh.supabase.co
- Other projects: Each has their own Supabase project (see TOOLS.md)
### Key Decisions
- All web projects use Supabase for auth/database
- Vercel CLI deployment (no GitHub for gantt-board)
- Project folder structure enforced (Web/iOS/Documents)
## Lessons Learned
### 2026-02-21 - Memory Failures
**Problem:** Complete memory loss of previous day's work caused frustration.
**Root Cause:** Didn't read files at session start, relied on failed memory_search.
**Solution:**
- Created SESSION_STARTUP.md with explicit checklist
- Updated AGENTS.md with mandatory file reading order
- All project info now in TOOLS.md
- Created PROJECT_SETUP.md for folder structure rules
**Never Again:**
- Always read SESSION_STARTUP.md first
- Read TOOLS.md for all project locations
- Read memory files for recent context
- Files are my memory - use them
### 2026-02-21 - Gitea Installation Disaster
**Problem:** Installed Gitea locally on Matt's Mac, causing port 3000 conflict with Next.js dev server.
**Root Cause:** Forgot Gitea was already running on separate machine (192.168.1.128:3000).
**Solution:** Uninstalled local Gitea, documented in TOOLS.md that it's on another machine.
**Never Again:**
- Gitea runs at http://192.168.1.128:3000 (remote server)
- Port 3000 is for Next.js dev server on Matt's Mac
- NEVER run `brew install gitea` or `gitea web` on Matt's machine
- Use existing Gitea server for all git operations
## Quick Commands
```bash
# Deploy Gantt Board
cd /Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board
npm run build && vercel --prod
# Check all projects
ls /Users/mattbruce/Documents/Projects/OpenClaw/Web/
```
## Gantt Board Task CRUD
I have full CRUD capabilities on gantt board tasks via Supabase API:
**Bash script:** `/Users/mattbruce/.openclaw/workspace/scripts/gantt-task-crud.sh`
```bash
# List tasks (optionally filter by status)
./scripts/gantt-task-crud.sh list [open|done|...]
# Get single task
./scripts/gantt-task-crud.sh get <task-id>
# Create task
./scripts/gantt-task-crud.sh create "Task title" [status] [priority] [project-id] [assignee-id]
# Update task field
./scripts/gantt-task-crud.sh update <task-id> <field> <value>
# Delete task
./scripts/gantt-task-crud.sh delete <task-id>
```
**TypeScript module:** `/Users/mattbruce/.openclaw/workspace/scripts/gantt-task-crud.ts`
- `listTasks(status?)` - List all tasks
- `getTask(taskId)` - Get single task
- `createTask(params)` - Create new task
- `updateTask(taskId, updates)` - Update task fields
- `deleteTask(taskId)` - Delete task
- `updateTaskStatus(taskId, status)` - Update status
- `assignTask(taskId, assigneeId)` - Change assignee
- `completeTask(taskId)` - Mark as done
**Default assignee:** Max (9c29cc99-81a1-4e75-8dff-cd7cc5ceb5aa)
## Natural Language Task Parsing
Matt can rattle off tasks naturally and I'll parse them:
**Example formats:**
- "Add task: Fix the login bug by Friday"
- "For Max: Research Stripe integration, low priority"
- "Urgent: Deploy blog backup to Vercel tomorrow"
- "Create task: Update iOS app icons"
**I parse:**
- **Title** — the main task description
- **Assignee** — "for [Name]" or defaults to Matt
- **Priority** — "urgent/asap" = high, "low priority" = low, else medium
- **Due date** — tomorrow, next week, by Friday, etc. (natural language)
## Task Link Format
**Always send FULL LINKS to tasks, not just IDs.**
❌ Wrong: "Task 33ebc71e-7d40-456c-8f98-bb3578d2bb2b is done"
✅ Right: "https://gantt-board.vercel.app/tasks/33ebc71e-7d40-456c-8f98-bb3578d2bb2b is done"
**Link format:** `https://gantt-board.vercel.app/tasks/{task-id}`
---
## Document/File Management Rules
### RULE: Task Documents → Attach Only, Don't Keep Local Copies
When creating documents for gantt board tasks:
1. ✅ Create the document
2. ✅ Attach it to the task via gantt board UI/API
3. ❌ **DELETE the local file immediately after attaching**
4. ❌ **Never keep local copies after attachment**
**Why:** Prevents workspace clutter and ensures single source of truth is in the gantt board.
---
## Memory Maintenance — Critical Rule
**Update memory files CONTINUOUSLY throughout the day, not at the end.**
- After significant decisions → write to MEMORY.md
- After task completions → update memory/YYYY-MM-DD.md
- After new processes established → document immediately
- Waiting until end-of-day = lost context and repeated mistakes
This prevents the nightmare of today (Feb 21) where session issues caused complete memory loss of critical work.
### My Memory Update Plan
**TRIGGERS — Update memory when:**
1. ✅ Task completed → Log to memory/YYYY-MM-DD.md
2. ✅ Decision made → Document in MEMORY.md
3. ✅ New process/tool discovered → Add to TOOLS.md or MEMORY.md
4. ✅ Error/lesson learned → Write to MEMORY.md "Lessons Learned"
5. ✅ Context switch → Quick checkpoint update
6. ✅ Every 30-60 min of continuous work → Quick status save
**WHAT to save:**
- **MEMORY.md:** Decisions, lessons, key info, processes (curated)
- **memory/YYYY-MM-DD.md:** Raw log of work, conversations, tasks done
- **TOOLS.md:** Project locations, credentials, environment specifics
**CHECKPOINT habit:**
Before saying "done" or switching topics → ask "What needs to be remembered?"
**Safety net:**
If session crashes, next session reads files first. Files are source of truth.

68
PROJECT_SETUP.md Normal file
View File

@ -0,0 +1,68 @@
# PROJECT_SETUP.md - Project Location Rules
## Golden Rule
**ALL projects MUST be created in `/Users/mattbruce/Documents/Projects/OpenClaw/`**
Never create projects in:
- ❌ `/Users/mattbruce/` (root home directory)
- ❌ `/Users/mattbruce/.openclaw/workspace/` (agent workspace)
- ❌ Any other random location
## Folder Structure
```
/Users/mattbruce/Documents/Projects/OpenClaw/
├── Documents/ # Documentation, specs, plans
├── iOS/ # iOS apps (Swift/Xcode)
└── Web/ # Web apps (Next.js/React)
├── blog-backup/
├── gantt-board/
├── heartbeat-monitor/
├── mission-control/
└── [NEW_PROJECT]/ # Always put new web projects here
```
## Project Types
| Type | Location | Example |
|------|----------|---------|
| iOS Apps | `OpenClaw/iOS/[project]/` | `OpenClaw/iOS/MyApp/` |
| Web Apps | `OpenClaw/Web/[project]/` | `OpenClaw/Web/dashboard/` |
| Documents | `OpenClaw/Documents/` | `OpenClaw/Documents/plans/` |
## Before Creating Any Project
1. **Check TOOLS.md** for existing projects (avoid duplicates)
2. **Choose correct folder** based on project type
3. **Verify location** before running `npx create-next-app` or similar
4. **Update TOOLS.md** with new project details immediately
## If You Mess Up
If a project is created in the wrong place:
```bash
# Move it to correct location
mv ~/wrong-location/project ~/Documents/Projects/OpenClaw/Web/
# Update any hardcoded paths
# Update TOOLS.md
```
## Examples
**Correct:**
```bash
cd /Users/mattbruce/Documents/Projects/OpenClaw/Web
npx create-next-app new-dashboard
```
**Incorrect:**
```bash
cd /Users/mattbruce # WRONG!
npx create-next-app new-dashboard
```
---
**Remember:** The OpenClaw folder is the single source of truth for all projects.

66
SESSION_STARTUP.md Normal file
View File

@ -0,0 +1,66 @@
# SESSION_STARTUP.md - Read This First Every Session
## CRITICAL - Do These IMMEDIATELY
**Step 1: Read AGENTS.md** (you are here)
- Who you are, how to work, safety rules
- **Project creation rules** - CRITICAL
**Step 2: Read TOOLS.md**
- All project locations, URLs, credentials
- Deployment commands
- Infrastructure details
**Step 3: Read memory files**
- `memory/YYYY-MM-DD.md` (today)
- `memory/YYYY-MM-DD.md` (yesterday)
- MEMORY.md (if main session)
**Step 4: Read PROJECT_SETUP.md**
- Where to create new projects
- Folder structure rules
## Quick Reference
### Project Locations (NEVER FORGET)
```
/Users/mattbruce/Documents/Projects/OpenClaw/
├── Web/ ← Next.js projects here
├── iOS/ ← Swift projects here
└── Documents/ ← Docs here
```
### Active Projects (from TOOLS.md)
- **Gantt Board:** https://gantt-board.vercel.app (port 3000)
- **Blog Backup:** https://blog-backup-two.vercel.app (port 3002)
- **Mission Control:** https://mission-control-rho-pink.vercel.app/ (port 3001)
- **Heartbeat Monitor:** port 3005
### Credentials
- **Gantt Board login:** mbruce+max@topdoglabs.com / !7883Gantt
- **Gitea:** http://192.168.1.128:3000 (ai-agent / !7883Gitea)
## If Memory Search Fails
If `memory_search()` returns an error about API keys:
1. **DON'T PANIC**
2. Read the files manually (above)
3. The knowledge is in the files, not the vector DB
## Before Creating ANY Project
1. Check TOOLS.md for existing projects
2. Choose correct folder (Web/iOS/Documents)
3. Create in `/Users/mattbruce/Documents/Projects/OpenClaw/`
4. Update TOOLS.md immediately
## Daily Log Location
Write significant events to:
`/Users/mattbruce/.openclaw/workspace/memory/YYYY-MM-DD.md`
---
**DO NOT SKIP THESE STEPS**
**YOUR MEMORY RESETS EVERY SESSION**
**THE FILES ARE YOUR MEMORY**

View File

@ -36,6 +36,41 @@ Things like:
Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure.
---
## Gitea (Git Server - DO NOT INSTALL LOCALLY)
**⚠️ CRITICAL:** Gitea runs on a SEPARATE MACHINE (192.168.1.128). Do NOT install it on Matt's Mac.
**Server Location:** http://192.168.1.128:3000 (NOT localhost:3000)
- **Login:** ai-agent / !7883Gitea
- **Organization:** TopDogLabs
- **All repos go under:** http://192.168.1.128:3000/TopDogLabs/
### Using Gitea
**Clone existing repo:**
```bash
git clone http://192.168.1.128:3000/TopDogLabs/repo-name.git
```
**Push to Gitea:**
```bash
git push origin main
# Enter username: ai-agent
# Enter password: !7883Gitea
```
**Create new repo via web:**
1. Go to http://192.168.1.128:3000
2. Login as ai-agent
3. Click + → New Repository
4. Owner: TopDogLabs
5. Name: [project-name]
**NEVER do this:**
- ❌ `brew install gitea` on Matt's Mac
- ❌ Run `gitea web` locally
- ❌ Use port 3000 for anything (it's for Next.js dev)
## Folders for All Content/Projects
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw
- **Documents:** /Users/mattbruce/Documents/Projects/OpenClaw/Documents
@ -48,18 +83,19 @@ Skills are shared. Your setup is yours. Keeping them apart means you can update
- **Local Dev:** http://localhost:3002
- **Stack:** Next.js + Supabase + Vercel
- **Deploy:** `npm run build && vercel --prod` (no GitHub, CLI only)
- **Features:** Daily digest blog with tag filtering, search, responsive design
## Mission Control
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw/Web/mission-control
- **Live URL:** https://mission-control-rho-pink.vercel.app/
- **Local Dev:** http://localhost:3001
- **Stack:** Next.js + Supabase + Vercel
- **Stack:** Next.js + Vercel
- **Deploy:** `npm run build && vercel --prod` (no GitHub, CLI only)
## Mission Control
## Heartbeat Monitor
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw/Web/heartbeat-monitor
- **Local Dev:** http://localhost:3005
- **Stack:** Next.js + Supabase + Vercel
- **Stack:** Next.js + Vercel
## Gantt Board
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board

View File

@ -0,0 +1,528 @@
# iOS Subscription-Based Side Projects with MRR Potential
**Research Date:** February 21, 2026
**Focus:** Monthly Recurring Revenue (MRR) Opportunities in the iOS App Store
---
## Executive Summary
The iOS subscription model has matured significantly, with consumers increasingly willing to pay recurring fees for apps that provide ongoing value. The App Store generated approximately $85 billion in consumer spending in 2024, with subscription revenue continuing to grow at 15-20% annually. This report identifies high-potential niches, proven models, and specific app ideas with strong MRR viability.
### Key Market Insights:
- Subscription apps have 3-5x higher lifetime value (LTV) than paid apps
- Top categories: Health & Fitness, Productivity, Entertainment, and Utilities
- Sweet spot pricing: $4.99-$9.99/month for consumer apps, $9.99-$29.99/month for pro/B2B
- Average subscription retention after 12 months: 25-35% for well-designed apps
---
## 1. Health & Wellness Category
### 1.1 Personalized Sleep Optimization App
**Concept:** AI-powered sleep coach that tracks sleep patterns, provides personalized recommendations, and adjusts based on biometrics.
**Why MRR Potential is Strong:**
- Sleep market valued at $65B globally and growing
- Users need ongoing guidance (daily sleep data, weekly reports, monthly insights)
- High perceived value - poor sleep affects everything
- Natural retention driver: progress tracking over time
**Revenue Model:**
- Free tier: Basic sleep tracking
- Premium: $7.99/month or $59.99/year
- Add-on: Personalized sleep plans ($19.99 one-time)
**Market Analysis:**
- Competitors: Sleep Cycle, Pillow, AutoSleep
- Gap: Most apps track but don't actively coach
- Target: 25-45 year-old professionals with disposable income
- TAM: ~40M potential users in US alone
**Implementation Complexity:** 7/10
- HealthKit integration for sleep data
- ML model for pattern recognition
- Audio content library (sleep sounds, meditations)
- Requires ongoing content curation
---
### 1.2 Micro-Workout & Mobility App
**Concept:** 5-15 minute targeted workouts for specific goals (posture, desk-worker relief, pre-sport warmup) with progressive difficulty.
**Why MRR Potential is Strong:**
- Time-strapped users need quick, effective solutions
- Progressive programs create ongoing engagement
- Corporate wellness partnerships potential
- Low friction entry point
**Revenue Model:**
- Free: 5 basic routines
- Premium: $9.99/month or $79.99/year
- Team/Corporate: $5/user/month
**Market Analysis:**
- Competitors: Seven, Wakeout, Stretching Sampler
- Gap: Specialized routines for specific pain points
- Target: Remote workers, athletes, aging population
- TAM: $14.5B digital fitness market
**Implementation Complexity:** 6/10
- Video content library
- Custom workout builder
- Progress tracking
- Apple Watch integration
---
## 2. Productivity & Professional Tools
### 2.1 AI Meeting Assistant for Individuals
**Concept:** Personal AI that joins calls (with permission), takes notes, creates action items, and tracks follow-ups across all meeting platforms.
**Why MRR Potential is Strong:**
- Knowledge workers have 15+ hours of meetings/week
- High willingness to pay for time savings
- B2B2C potential (expense through companies)
- Network effects as teams adopt
**Revenue Model:**
- Free: 5 meetings/month, basic transcription
- Pro: $12.99/month unlimited meetings
- Team: $19.99/user/month with collaboration
**Market Analysis:**
- Competitors: Otter, Fireflies, Grain
- Gap: Individual-focused vs enterprise tools
- Target: Consultants, freelancers, managers
- TAM: $20B+ productivity software market
**Implementation Complexity:** 9/10
- Audio processing and transcription
- AI summarization (requires LLM integration)
- Calendar integrations
- Data privacy/security considerations
---
### 2.2 Focus & Deep Work Companion
**Concept:** Advanced Pomodoro/timer app with accountability features, distraction blocking, analytics, and team challenges.
**Why MRR Potential is Strong:**
- Attention economy creates demand for focus tools
- Teams/companies buy for employees
- Gamification drives retention
- Data insights provide ongoing value
**Revenue Model:**
- Free: Basic timer + limited stats
- Pro: $4.99/month advanced analytics
- Team: $6/user/month with leaderboards
**Market Analysis:**
- Competitors: Forest, Freedom, RescueTime
- Gap: Better team features + accountability
- Target: Students, developers, writers, remote teams
- TAM: 100M+ knowledge workers globally
**Implementation Complexity:** 5/10
- Timer engine
- Screen time API integration
- Social features
- Analytics dashboard
---
## 3. Creative & Content Creation
### 3.1 AI-Powered Content Repurposing
**Concept:** Take one piece of content (video, podcast, blog) and automatically generate social clips, quotes, thumbnails, and variations.
**Why MRR Potential is Strong:**
- Creator economy is booming ($250B+)
- Content creation is time-intensive
- Agencies have high willingness to pay
- Continuous content needs = ongoing subscription
**Revenue Model:**
- Free: 3 projects/month, watermarked
- Creator: $19.99/month unlimited
- Agency: $49.99/month team features
**Market Analysis:**
- Competitors: Opus Clip, Descript, CapCut
- Gap: Simplified iOS-native workflow
- Target: Solo creators, small agencies
- TAM: 50M+ content creators
**Implementation Complexity:** 8/10
- Video/audio processing
- AI transcription and editing
- Social platform integrations
- Cloud processing infrastructure
---
### 3.2 Template Marketplace + Editor
**Concept:** Premium templates for social posts, presentations, resumes, newsletters with native iOS editor.
**Why MRR Potential is Strong:**
- Template market is massive and evergreen
- Regular new template releases drive retention
- Visual content needs are constant
- Can target multiple verticals
**Revenue Model:**
- Free: 50 basic templates
- Premium: $7.99/month unlimited + new weekly
- Commercial: $19.99/month with licensing
**Market Analysis:**
- Competitors: Canva, Adobe Express
- Gap: iOS-native, creator-focused
- Target: Small business owners, marketers
- TAM: $30B+ design software market
**Implementation Complexity:** 6/10
- Template engine
- Custom editor
- Asset library management
- Regular content updates
---
## 4. Personal Finance & Wealth
### 4.1 Subscription Manager & Optimizer
**Concept:** Track all subscriptions, identify savings, cancel unused services, negotiate bills automatically.
**Why MRR Potential is Strong:**
- Average person has 12+ subscriptions
- Saves users real money (justifies cost)
- Subscription fatigue is real
- Strong word-of-mouth potential
**Revenue Model:**
- Free: Track up to 5 subscriptions
- Pro: $4.99/month unlimited + insights
- Concierge: $9.99/month includes bill negotiation
**Market Analysis:**
- Competitors: Rocket Money (Truebill), Trim
- Gap: Privacy-focused, iOS-native solution
- Target: 25-45 age group with multiple subscriptions
- TAM: 200M+ subscription users globally
**Implementation Complexity:** 6/10
- Bank/connect integrations (Plaid)
- Subscription detection algorithms
- Email parsing for billing
- Secure credential handling
---
### 4.2 Micro-Investing Education Platform
**Concept:** Learn investing through bite-sized daily lessons, paper trading, and guided portfolio building.
**Why MRR Potential is Strong:**
- Financial literacy gap is huge
- Gamification works well for learning
- Users need ongoing education
- Affiliate revenue potential from brokers
**Revenue Model:**
- Free: Basic courses + paper trading
- Premium: $8.99/month advanced content
- Pro: $19.99/month includes 1-on-1 coaching
**Market Analysis:**
- Competitors: Duolingo-style apps, Fidelity, Robinhood
- Gap: Education-first approach (not trading)
- Target: 18-35 new investors
- TAM: 100M+ aspiring investors
**Implementation Complexity:** 7/10
- Educational content library
- Paper trading simulation
- Portfolio tracking
- Progress gamification
---
## 5. Utilities & Tools
### 5.1 Advanced Habit Tracker with Accountability
**Concept:** Habit tracking + accountability partners + data insights + streak challenges.
**Why MRR Potential is Strong:**
- Habit formation requires long-term commitment
- Social accountability increases retention
- Data insights improve over time
- Corporate wellness market
**Revenue Model:**
- Free: 3 habits, basic tracking
- Premium: $5.99/month unlimited + insights
- Teams: $4/user/month
**Market Analysis:**
- Competitors: Streaks, Habitify, Done
- Gap: Better accountability features
- Target: Goal-oriented individuals
- TAM: 500M+ smartphone users with goals
**Implementation Complexity:** 5/10
- Habit tracking engine
- Social features
- Analytics
- Widgets and complications
---
### 5.2 Document Scanner + OCR + Organization
**Concept:** Smart scanner with AI categorization, searchable PDFs, expense tracking, and cloud sync.
**Why MRR Potential is Strong:**
- Everyone scans documents
- OCR requires ongoing improvement
- Business users have high willingness to pay
- Frequent usage = high retention
**Revenue Model:**
- Free: 50 scans/month, basic OCR
- Pro: $7.99/month unlimited + AI features
- Business: $14.99/month team features
**Market Analysis:**
- Competitors: Adobe Scan, Scanner Pro, CamScanner
- Gap: Better AI organization + expense tracking
- Target: Small business owners, contractors
- TAM: $10B+ document management market
**Implementation Complexity:** 6/10
- Camera/document detection
- OCR engine integration
- AI categorization
- Cloud sync infrastructure
---
## 6. Underserved Niches with High Potential
### 6.1 Pet Health & Care Tracker
**Concept:** Comprehensive pet health tracking, vet appointment management, medication reminders, and breed-specific care tips.
**Why MRR Potential is Strong:**
- Pet owners spend $1,200+/year per pet
- Health tracking prevents costly emergencies
- Emotional attachment drives retention
- Vet integration opportunities
**Revenue Model:**
- Free: 1 pet, basic tracking
- Premium: $5.99/month unlimited pets + features
- Vet Connect: $9.99/month includes telehealth
**Market Analysis:**
- Competitors: PetDesk, 11pets
- Gap: Consumer-focused vs vet-focused
- Target: 90M pet-owning households in US
- TAM: $136B pet industry
**Implementation Complexity:** 5/10
- Pet profiles and health records
- Reminder system
- Content library
- Photo/document storage
---
### 6.2 Plant Care & Gardening Assistant
**Concept:** Plant identification, care schedules, disease diagnosis, and garden planning.
**Why MRR Potential is Strong:**
- Houseplant boom continues
- Plants die without care (ongoing need)
- Seasonal content keeps users engaged
- Growing gardening demographic
**Revenue Model:**
- Free: 5 plants, basic care
- Premium: $4.99/month unlimited + AI diagnosis
- Garden Planner: $9.99/month outdoor features
**Market Analysis:**
- Competitors: PlantIn, PictureThis, Planta
- Gap: Better outdoor garden features
- Target: 30M+ houseplant owners
- TAM: $52B gardening market
**Implementation Complexity:** 6/10
- Plant identification AI
- Care scheduling
- Photo recognition for disease
- Content library
---
### 6.3 Language Learning for Specific Purposes
**Concept:** Language learning focused on specific use cases (travel, business, healthcare workers) rather than general fluency.
**Why MRR Potential is Strong:**
- Professional language needs are urgent
- Specific vocabulary = faster perceived value
- B2B training contracts potential
- High motivation learners
**Revenue Model:**
- Free: First chapter of each course
- Premium: $12.99/month all courses
- Enterprise: Custom pricing for organizations
**Market Analysis:**
- Competitors: Duolingo, Babbel, Busuu
- Gap: Profession-specific content
- Target: Healthcare workers, hospitality, expats
- TAM: $60B language learning market
**Implementation Complexity:** 7/10
- Specialized content creation
- Speech recognition
- Spaced repetition
- Progress tracking
---
## 7. Emerging Opportunities (2025-2026)
### 7.1 AI Companion for Specific Niches
**Concept:** AI companions tailored to specific needs: elderly companionship, ADHD coaching, parenting support, grief counseling.
**Why MRR Potential is Strong:**
- Loneliness epidemic
- Mental health support shortage
- 24/7 availability
- Personalized support scales
**Revenue Model:**
- Free: Limited daily conversations
- Premium: $14.99/month unlimited
- Family: $24.99/month multiple profiles
**Market Analysis:**
- Competitors: Character.AI, Replika, Woebot
- Gap: Purpose-specific, therapeutic focus
- Target: Varies by niche
- TAM: $450B+ mental health market
**Implementation Complexity:** 9/10
- LLM integration
- Safety/therapeutic guardrails
- Personalization engine
- Crisis detection
---
### 7.2 Sustainable Living Tracker
**Concept:** Track carbon footprint, get personalized reduction tips, connect with local sustainable options.
**Why MRR Potential is Strong:**
- Growing climate consciousness
- Gamification potential
- Brand partnership opportunities
- Corporate ESG alignment
**Revenue Model:**
- Free: Basic tracking + tips
- Premium: $5.99/month advanced insights
- Enterprise: Employee sustainability programs
**Market Analysis:**
- Competitors: Joro, Commons, Earth Hero
- Gap: iOS-native, actionable recommendations
- Target: Environmentally conscious 25-45
- TAM: $150B+ sustainability market
**Implementation Complexity:** 6/10
- Carbon calculation algorithms
- Spending data integration
- Local business database
- Progress tracking
---
## Summary Table: Top 10 MRR Opportunities
| Rank | App Concept | Monthly Price | Complexity | MRR Potential |
|------|-------------|---------------|------------|---------------|
| 1 | AI Meeting Assistant | $12.99 | 9/10 | ⭐⭐⭐⭐⭐ |
| 2 | AI Content Repurposing | $19.99 | 8/10 | ⭐⭐⭐⭐⭐ |
| 3 | Personalized Sleep Coach | $7.99 | 7/10 | ⭐⭐⭐⭐⭐ |
| 4 | Micro-Investing Education | $8.99 | 7/10 | ⭐⭐⭐⭐ |
| 5 | Subscription Manager | $4.99 | 6/10 | ⭐⭐⭐⭐ |
| 6 | Focus & Deep Work | $4.99 | 5/10 | ⭐⭐⭐⭐ |
| 7 | Smart Document Scanner | $7.99 | 6/10 | ⭐⭐⭐⭐ |
| 8 | Pet Health Tracker | $5.99 | 5/10 | ⭐⭐⭐ |
| 9 | Micro-Workout App | $9.99 | 6/10 | ⭐⭐⭐⭐ |
| 10 | Advanced Habit Tracker | $5.99 | 5/10 | ⭐⭐⭐ |
---
## Implementation Recommendations
### Best Starting Points (Lower Complexity, High MRR):
1. **Habit Tracker with Accountability** (5/10 complexity)
2. **Pet Health Tracker** (5/10 complexity)
3. **Focus & Deep Work App** (5/10 complexity)
4. **Document Scanner** (6/10 complexity)
### Highest MRR Potential (Higher Complexity):
1. **AI Meeting Assistant** (massive TAM, B2B potential)
2. **Content Repurposing Tool** (creator economy boom)
3. **Sleep Optimization** (recurring daily value)
### Key Success Factors:
- **Freemium model** works best for iOS subscriptions
- **Daily usage patterns** drive retention
- **Progressive value** over time justifies ongoing payment
- **Team/corporate features** expand TAM significantly
- **Apple ecosystem integration** (Watch, HealthKit, Shortcuts) adds value
---
## App Store Optimization Notes
### Best Categories for Subscriptions:
- Health & Fitness (#1 for subscription revenue)
- Productivity
- Utilities
- Education
- Lifestyle
### Pricing Psychology:
- Annual plans should offer ~40% discount vs monthly
- Free trials of 7-14 days convert best
- First-month discounts can drive adoption
- Family plans increase LTV by 2-3x
### Retention Benchmarks:
- Month 1: 60-70%
- Month 3: 35-45%
- Month 12: 25-35%
- Good apps achieve 40%+ annual retention
---
## Conclusion
The iOS subscription market remains highly viable for side projects with the right approach. The key to MRR success is choosing problems that require ongoing solutions, providing clear daily/weekly value, and building features that improve with continued use.
**Top Recommendations to Pursue:**
1. Start with **Habit Tracker** or **Pet Health** for lower complexity
2. Consider **AI Meeting Assistant** if you have technical resources
3. Explore **Subscription Manager** for broad appeal
The market rewards apps that solve persistent problems with elegance and ongoing value. Focus on retention from day one—a 30% annual retention rate with a $7.99/month price point yields ~$32 LTV per customer. With 1,000 subscribers, that's $32K MRR.
---
*Report generated for iOS MRR research project*

View File

@ -0,0 +1,5 @@
# Session: 2026-02-21 22:15:11 UTC
- **Session Key**: agent:main:main
- **Session ID**: 6128bf29-40af-487d-a17d-ea5a3d3f5d78
- **Source**: telegram

View File

@ -0,0 +1,5 @@
# Session: 2026-02-21 22:16:10 UTC
- **Session Key**: agent:main:main
- **Session ID**: ff4f3519-5cdd-4657-baa0-3190c76e2630
- **Source**: telegram

View File

@ -1,5 +1,55 @@
# Memory Log — February 21, 2026
## Subagent Progress — 4:28 PM
Spawned 3 subagents to tackle open gantt board tasks:
### ✅ COMPLETED: iOS MRR Research
- **Task:** `33ebc71e-7d40-456c-8f98-bb3578d2bb2b` → status: done
- **Runtime:** 1m45s
- **Output:** `/Users/mattbruce/.openclaw/workspace/ios-mrr-research-2026-02-21.md`
- **Key finding:** Top 10 MRR opportunities identified, best starting points are Habit Tracker, Pet Health Tracker, Focus App (lowest complexity)
### ✅ COMPLETED: Task Search Feature
- **Task:** https://gantt-board.vercel.app/tasks/66f1146e-41c4-4b03-a292-9358b7f9bedb
- **Runtime:** 3m53s
- **Deployed:** https://gantt-board.vercel.app
- **Changes:**
- Added search input to header (desktop + mobile)
- Filters by title and description (case-insensitive)
- Real-time filtering with 300ms debounce
- Shows "X of Y tasks match 'query'"
- Clear search button (X icon)
- Works in both Kanban and Backlog views
- **Files changed:**
- `src/hooks/useDebounce.ts` (new)
- `src/app/page.tsx`
- `src/components/BacklogView.tsx`
### ✅ COMPLETED: Task Save Feedback Fix
- **Task:** https://gantt-board.vercel.app/tasks/0da220bc-eb6b-4be1-846a-c2c801def427
- **Runtime:** 4m55s
- **Deployed:** https://gantt-board.vercel.app
- **Changes:**
- Added `sonner` toast library
- Save button shows spinner → green "Saved!" (2s) → toast confirmation
- Error toasts on failure with descriptive message
- Returns true/false from updateTask for handling
- **Files changed:**
- `src/app/layout.tsx` (Toaster component)
- `src/stores/useTaskStore.ts` (async updateTask)
- `src/app/tasks/[taskId]/page.tsx` (visual feedback)
---
## All Open Tasks Complete ✅
| Task | Link | Status |
|------|------|--------|
| Save feedback fix | https://gantt-board.vercel.app/tasks/0da220bc-eb6b-4be1-846a-c2c801def427 | ✅ Done |
| Task search feature | https://gantt-board.vercel.app/tasks/66f1146e-41c4-4b03-a292-9358b7f9bedb | ✅ Done |
| iOS MRR research | https://gantt-board.vercel.app/tasks/33ebc71e-7d40-456c-8f98-bb3578d2bb2b | ✅ Done |
## Supabase Migration — COMPLETE
### What Was Done
@ -66,3 +116,48 @@ vercel --prod
- Max (the AI) had significant issues with memory/context today
- Another AI stepped in and fixed the settings page properly
- **Task Management:** Use the live Vercel deployment to check/add tasks
---
## Blog-Backup Migration — IN PROGRESS
### What Was Done
- Migrated blog-backup from JSON file to Supabase (shared project with gantt-board)
- Created `blog_messages` table with tags support (ARRAY type)
- Redesigned UI as proper blog with tag filtering
- Added search functionality
- Migrated 6 existing daily digest posts with tags
### Schema
```sql
blog_messages:
- id (TEXT PRIMARY KEY)
- date (DATE)
- content (TEXT)
- timestamp (BIGINT)
- tags (TEXT[])
```
### New UI Features
- Clean white/light blog design
- Tag filtering (click to filter, URL params)
- Search bar (content + tags)
- Sidebar with tags, stats, about
- Featured post highlight
- Responsive layout
### Tags Added
- iOS, AI, Cursor, Claude, OpenClaw, IndieHacking, retro, test
### Files Changed
- `src/app/api/messages/route.ts` — Supabase CRUD
- `src/app/page.tsx` — Complete redesign
- `.env.local` — Supabase credentials
### Deployment
Same Vercel project, CLI deploy: `npm run build && vercel --prod`
### Status
- Code committed to Gitea
- SQL import script created for data migration
- Ready to deploy after Matt tests locally

9
memory/backup.log Normal file
View File

@ -0,0 +1,9 @@
[2026-02-21 15:04:16 CST] Starting daily data backup...
[2026-02-21 15:04:16 CST] gantt-board: No changes to backup
[main 5a95c9b] Daily data backup - 2026-02-21 15:04:16 CST
1 file changed, 18 insertions(+)
fatal: unable to access 'http://192.168.1.128:3000/TopDogLabs/blog-backup.git/': Failed to connect to 192.168.1.128 port 3000 after 0 ms: Couldn't connect to server
[2026-02-21 15:04:16 CST] ❌ blog-backup: Push failed
[2026-02-21 15:04:16 CST] heartbeat-monitor: No changes to backup
[2026-02-21 15:04:16 CST] Daily backup complete
---

View File

@ -484,3 +484,147 @@ No restarts required.
[2026-02-21 14:25:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 14:25:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 14:25:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 14:30:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 14:30:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 14:30:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 14:30:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 14:30:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 14:30:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 14:35:02 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 14:35:02 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 14:35:02 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 14:35:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 14:35:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 14:35:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 14:40:04 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 14:40:04 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 14:40:04 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 14:40:04 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 14:40:04 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 14:40:04 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 14:45:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 14:45:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 14:45:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 14:45:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 14:45:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 14:45:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 14:50:04 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 14:50:04 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 14:50:04 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 14:50:04 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 14:50:04 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 14:50:04 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 14:55:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 14:55:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 14:55:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 14:55:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 14:55:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 14:55:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:00:02 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:00:02 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:00:02 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:00:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:00:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:00:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:05:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:05:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:05:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:05:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:05:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:05:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:15:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:15:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:15:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:15:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:15:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:15:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:20:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:20:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:20:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:20:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:20:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:20:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:25:02 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:25:02 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:25:02 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:25:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:25:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:25:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:30:02 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 15:30:02 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 15:30:02 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:30:02 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:30:02 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:30:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:30:02 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 15:30:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:30:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:35:03 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 15:35:03 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 15:35:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:35:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:35:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:35:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:35:03 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 15:35:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:35:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:40:02 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 15:40:02 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 15:40:02 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:40:02 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:40:02 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:40:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:40:02 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 15:40:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:40:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:45:02 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 15:45:02 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 15:45:02 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:45:02 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:45:02 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:45:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:45:02 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 15:45:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:45:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:50:03 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 15:50:03 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 15:50:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:50:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:50:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:50:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:50:03 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 15:50:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:50:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 15:55:03 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 15:55:03 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 15:55:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 15:55:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 15:55:03 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 15:55:03 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 15:55:03 CST] ✅ gantt-board verified healthy (HTTP 200)
[2026-02-21 15:55:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 15:55:03 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 16:05:02 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 16:05:02 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 16:05:02 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 16:05:02 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 16:05:02 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 16:05:02 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 16:05:02 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 16:05:02 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 16:05:02 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)
[2026-02-21 16:10:03 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 16:10:03 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 16:10:03 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 16:10:03 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 16:10:03 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 16:10:03 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 16:30:32 CST] ⚠️ gantt-board (port 3000) is DOWN - restarting...
[2026-02-21 16:30:32 CST] 🔄 gantt-board restarted on port 3000
[2026-02-21 16:30:32 CST] ⚠️ blog-backup (port 3003) is DOWN - restarting...
[2026-02-21 16:30:32 CST] 🔄 blog-backup restarted on port 3003
[2026-02-21 16:30:32 CST] ⚠️ heartbeat-monitor (port 3005) is DOWN - restarting...
[2026-02-21 16:30:32 CST] 🔄 heartbeat-monitor restarted on port 3005
[2026-02-21 16:30:32 CST] ❌ gantt-board still unhealthy (HTTP 000DOWN)
[2026-02-21 16:30:32 CST] ❌ blog-backup still unhealthy (HTTP 000DOWN)
[2026-02-21 16:30:32 CST] ❌ heartbeat-monitor still unhealthy (HTTP 000DOWN)

8
scripts/add-tags.sql Normal file
View File

@ -0,0 +1,8 @@
-- Add tags column to blog_messages
ALTER TABLE blog_messages ADD COLUMN IF NOT EXISTS tags TEXT[] DEFAULT '{}';
-- Update existing rows with empty tags
UPDATE blog_messages SET tags = '{}' WHERE tags IS NULL;
-- Verify
SELECT id, date, tags FROM blog_messages LIMIT 3;

View File

@ -0,0 +1,19 @@
-- Create blog_messages table for blog-backup app
-- Uses same Supabase project as gantt-board
CREATE TABLE IF NOT EXISTS blog_messages (
id TEXT PRIMARY KEY,
date DATE NOT NULL,
content TEXT NOT NULL,
timestamp BIGINT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Disable RLS for now (same as gantt-board)
ALTER TABLE blog_messages DISABLE ROW LEVEL SECURITY;
-- Insert existing data from messages.json
-- (Data will be migrated via script)
-- Verify
SELECT COUNT(*) as count FROM blog_messages;

View File

@ -33,7 +33,6 @@ backup_project() {
Auto-commit of data files:
- messages.json (blog-backup)
- tasks.json (gantt-board)
- apps.json & status.json (heartbeat-monitor)" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then

100
scripts/gantt-task-crud.sh Executable file
View File

@ -0,0 +1,100 @@
#!/bin/bash
# Gantt Board Task CRUD Operations
# Usage: ./task-crud.sh [create|read|update|delete|list] [args...]
SUPABASE_URL="https://qnatchrjlpehiijwtreh.supabase.co"
SERVICE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InFuYXRjaHJqbHBlaGlpand0cmVoIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc3MTY0MDQzNiwiZXhwIjoyMDg3MjE2NDM2fQ.rHoc3NfL59S4lejU4-ArSzox1krQkQG-TnfXb6sslm0"
HEADERS=(-H "apikey: $SERVICE_KEY" -H "Authorization: Bearer $SERVICE_KEY" -H "Content-Type: application/json")
function list_tasks() {
local status_filter="${1:-}"
local url="$SUPABASE_URL/rest/v1/tasks?select=*&order=created_at.desc"
if [[ -n "$status_filter" ]]; then
url="$SUPABASE_URL/rest/v1/tasks?select=*&status=eq.$status_filter&order=created_at.desc"
fi
curl -s "$url" "${HEADERS[@]}" | jq '.'
}
function get_task() {
local task_id="$1"
curl -s "$SUPABASE_URL/rest/v1/tasks?id=eq.$task_id&select=*" "${HEADERS[@]}" | jq '.[0]'
}
function create_task() {
local title="$1"
local status="${2:-open}"
local priority="${3:-medium}"
local project_id="${4:-1}"
local assignee_id="${5:-9c29cc99-81a1-4e75-8dff-cd7cc5ceb5aa}"
local uuid=$(uuidgen | tr '[:upper:]' '[:lower:]')
local now=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
curl -s -X POST "$SUPABASE_URL/rest/v1/tasks" \
"${HEADERS[@]}" \
-d "{
\"id\": \"$uuid\",
\"title\": \"$title\",
\"status\": \"$status\",
\"priority\": \"$priority\",
\"project_id\": \"$project_id\",
\"assignee_id\": \"$assignee_id\",
\"created_at\": \"$now\",
\"updated_at\": \"$now\",
\"comments\": [],
\"tags\": [],
\"attachments\": []
}" | jq '.'
echo "Created task: $uuid"
}
function update_task() {
local task_id="$1"
local field="$2"
local value="$3"
local now=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
curl -s -X PATCH "$SUPABASE_URL/rest/v1/tasks?id=eq.$task_id" \
"${HEADERS[@]}" \
-d "{\"$field\": \"$value\", \"updated_at\": \"$now\"}" | jq '.'
echo "Updated task $task_id: $field = $value"
}
function delete_task() {
local task_id="$1"
curl -s -X DELETE "$SUPABASE_URL/rest/v1/tasks?id=eq.$task_id" "${HEADERS[@]}"
echo "Deleted task: $task_id"
}
# Main
case "$1" in
list)
list_tasks "$2"
;;
get)
get_task "$2"
;;
create)
create_task "$2" "$3" "$4" "$5" "$6"
;;
update)
update_task "$2" "$3" "$4"
;;
delete)
delete_task "$2"
;;
*)
echo "Usage: $0 [list|get|create|update|delete] [args...]"
echo ""
echo "Examples:"
echo " $0 list # List all tasks"
echo " $0 list open # List open tasks"
echo " $0 get <task-id> # Get specific task"
echo " $0 create \"Task title\" open medium # Create task"
echo " $0 update <task-id> status done # Update task status"
echo " $0 delete <task-id> # Delete task"
;;
esac

183
scripts/gantt-task-crud.ts Normal file
View File

@ -0,0 +1,183 @@
/**
* Gantt Board Task CRUD Utilities
* Full CRUD operations on gantt board tasks via Supabase
*/
const SUPABASE_URL = "https://qnatchrjlpehiijwtreh.supabase.co";
const SERVICE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InFuYXRjaHJqbHBlaGlpand0cmVoIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc3MTY0MDQzNiwiZXhwIjoyMDg3MjE2NDM2fQ.rHoc3NfL59S4lejU4-ArSzox1krQkQG-TnfXb6sslm0";
const HEADERS = {
"apikey": SERVICE_KEY,
"Authorization": `Bearer ${SERVICE_KEY}`,
"Content-Type": "application/json",
};
/**
* Generate UUID v4
*/
function generateUUID(): string {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
const r = (Math.random() * 16) | 0;
const v = c === "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
/**
* Get current ISO timestamp
*/
function nowISO(): string {
return new Date().toISOString();
}
/**
* Task interface
*/
export interface GanttTask {
id: string;
title: string;
description?: string;
status: "open" | "todo" | "blocked" | "in-progress" | "review" | "validate" | "archived" | "canceled" | "done";
priority: "low" | "medium" | "high" | "urgent";
type?: "idea" | "task" | "bug" | "research" | "plan";
project_id: string;
sprint_id?: string;
assignee_id?: string;
created_at: string;
updated_at: string;
due_date?: string;
tags?: string[];
comments?: unknown[];
attachments?: unknown[];
}
/**
* LIST all tasks (optionally filtered by status)
*/
export async function listTasks(status?: string): Promise<GanttTask[]> {
let url = `${SUPABASE_URL}/rest/v1/tasks?select=*&order=created_at.desc`;
if (status) {
url = `${SUPABASE_URL}/rest/v1/tasks?select=*&status=eq.${status}&order=created_at.desc`;
}
const res = await fetch(url, { headers: HEADERS });
if (!res.ok) throw new Error(`Failed to list tasks: ${res.status}`);
return res.json();
}
/**
* GET a single task by ID
*/
export async function getTask(taskId: string): Promise<GanttTask | null> {
const url = `${SUPABASE_URL}/rest/v1/tasks?id=eq.${taskId}&select=*`;
const res = await fetch(url, { headers: HEADERS });
if (!res.ok) throw new Error(`Failed to get task: ${res.status}`);
const tasks = await res.json();
return tasks[0] || null;
}
/**
* CREATE a new task
*/
export async function createTask(params: {
title: string;
description?: string;
status?: GanttTask["status"];
priority?: GanttTask["priority"];
type?: GanttTask["type"];
projectId?: string;
assigneeId?: string;
dueDate?: string;
tags?: string[];
}): Promise<GanttTask> {
const task: Partial<GanttTask> = {
id: generateUUID(),
title: params.title,
description: params.description,
status: params.status || "open",
priority: params.priority || "medium",
type: params.type || "task",
project_id: params.projectId || "1",
assignee_id: params.assigneeId || "9c29cc99-81a1-4e75-8dff-cd7cc5ceb5aa", // Max
created_at: nowISO(),
updated_at: nowISO(),
due_date: params.dueDate,
tags: params.tags || [],
comments: [],
attachments: [],
};
const res = await fetch(`${SUPABASE_URL}/rest/v1/tasks`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify(task),
});
if (!res.ok) throw new Error(`Failed to create task: ${res.status}`);
return task as GanttTask;
}
/**
* UPDATE a task (partial update)
*/
export async function updateTask(
taskId: string,
updates: Partial<Omit<GanttTask, "id" | "created_at">>
): Promise<void> {
const payload = {
...updates,
updated_at: nowISO(),
};
const res = await fetch(`${SUPABASE_URL}/rest/v1/tasks?id=eq.${taskId}`, {
method: "PATCH",
headers: HEADERS,
body: JSON.stringify(payload),
});
if (!res.ok) throw new Error(`Failed to update task: ${res.status}`);
}
/**
* DELETE a task
*/
export async function deleteTask(taskId: string): Promise<void> {
const res = await fetch(`${SUPABASE_URL}/rest/v1/tasks?id=eq.${taskId}`, {
method: "DELETE",
headers: HEADERS,
});
if (!res.ok) throw new Error(`Failed to delete task: ${res.status}`);
}
/**
* Update task status (convenience method)
*/
export async function updateTaskStatus(
taskId: string,
status: GanttTask["status"]
): Promise<void> {
return updateTask(taskId, { status });
}
/**
* Assign task to user (convenience method)
*/
export async function assignTask(
taskId: string,
assigneeId: string
): Promise<void> {
return updateTask(taskId, { assignee_id: assigneeId });
}
/**
* Mark task as done (convenience method)
*/
export async function completeTask(taskId: string): Promise<void> {
return updateTask(taskId, { status: "done" });
}
// Example usage:
// const task = await createTask({ title: "New feature", priority: "high" });
// await updateTaskStatus(task.id, "in-progress");
// await completeTask(task.id);

View File

@ -0,0 +1,302 @@
-- Import existing blog messages from JSON
-- Run this in Supabase SQL Editor
-- Message 1: Daily Digest - Feb 21, 2026 (full)
INSERT INTO blog_messages (id, date, content, timestamp, tags) VALUES
('1771679017982', '2026-02-21',
$CONTENT$## Daily Digest - Saturday, February 21st, 2026
## 🍎 iOS AI Development
**Xcode 26.3 Unlocks Agentic Coding Directly in Xcode**
Apple has released Xcode 26.3, which brings coding agents directly into the IDE for iOS developers...
[Read more ](https://www.apple.com/newsroom/2026/02/xcode-26-point-3-unlocks-the-power-of-agentic-coding/)
**Swift Student Challenge Submissions Now Open**
Apple's Swift Student Challenge is accepting submissions through February 28, 2026...
[Read more ](https://developer.apple.com/swift-student-challenge/)
**iOS 26.4 Beta Released**
The beta versions of iOS 26.4, iPadOS 26.4, macOS 26.4...
[Read more ](https://developer.apple.com/news/?id=xgkk9w83)
## 🤖 AI Coding Assistants
**Cursor Launches Plugin Marketplace and Agent Sandboxing**
Cursor has introduced two major features: a Plugin Marketplace...
[Read more ](https://cursor.com/blog/marketplace)
**Stripe Rolls Out Cursor to 3,000 Engineers**
Stripe has pre-installed Cursor on every developer's machine...
[Read more ](https://cursor.com/blog/stripe)
**NVIDIA Commits 3x More Code with Cursor Across 30,000 Developers**
NVIDIA has embedded Cursor across its entire software development lifecycle...
[Read more ](https://cursor.com/blog/nvidia)
## 🧠 Latest Coding Models Released
**Claude Sonnet 4.6 Released by Anthropic**
Anthropic has launched Claude Sonnet 4.6, their latest coding model...
[Read more ](https://www.anthropic.com/news/claude-sonnet-4-6)
**ggml.ai (llama.cpp) Joins Hugging Face**
The founding team behind llama.cpp has joined Hugging Face...
[Read more ](https://github.com/ggml-org/llama.cpp/discussions/19759)
**Anthropic Makes Frontier Cybersecurity Capabilities Available**
Claude Code now includes enhanced security capabilities...
[Read more ](https://www.anthropic.com/news/claude-code-security)
## 🦞 OpenClaw Updates
**Andrej Karpathy Talks About Claws Becoming a Term of Art**
Former Tesla AI Director Andrej Karpathy has written about Claws...
[Read more ](https://simonwillison.net/2026/Feb/21/claws/)
**zclaw: Personal AI Assistant in Under 888 KB on ESP32**
A new ultra-lightweight Claw implementation called zclaw has been released...
[Read more ](https://github.com/tnm/zclaw)
**spec2commit: Automated Claude Code and Codex Workflow**
A developer has open-sourced spec2commit, a tool that automates the workflow...
[Read more ](https://github.com/baturyilmaz/spec2commit)
## 💰 Digital Entrepreneurship
**4Seo.ai: AI That Automatically Improves SEO**
A new Indie Hackers project called 4Seo.ai promises to automatically improve SEO...
[Read more ](https://www.indiehackers.com/product/4seo-ai)
**From Five Tools to One: Why They Built CandyDocs**
The team behind CandyDocs shares their journey of consolidating five separate documentation tools...
[Read more ](https://www.indiehackers.com/product/candydocs)
**Bazzly: Your SaaS Does Not Need a Marketing StrategyIt Needs a Distribution Habit**
Bazzly is a new tool that helps SaaS founders focus on building consistent distribution habits...
[Read more ](https://www.indiehackers.com/product/bazzly)
---
*Generated by Daily Digest Bot 🤖*$CONTENT$,
1771679017982,
ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw', 'IndieHacking']
)
ON CONFLICT (id) DO NOTHING;
-- Message 2: Test digest
INSERT INTO blog_messages (id, date, content, timestamp, tags) VALUES
('1771678965239', '2026-02-21', 'Test daily digest', 1771678965239, ARRAY['test'])
ON CONFLICT (id) DO NOTHING;
-- Message 3: Daily Digest - Feb 20, 2026
INSERT INTO blog_messages (id, date, content, timestamp, tags) VALUES
('1771599387955', '2026-02-20',
$CONTENT$## Daily Digest - February 20, 2026
### 🤖 iOS AI Development
**Apple Foundation Models Framework Now Available**
Apple has released the Foundation Models framework giving developers direct access to the on-device foundation model...
**SpeechAnalyzer Brings Advanced On-Device Transcription to iOS**
The all-new SpeechAnalyzer framework enables advanced, on-device transcription capabilities...
**Core ML Updates for Vision and Document Recognition**
New updates to Core ML and Vision frameworks bring full-document text recognition...
### 💻 AI Coding Assistants
**Cursor Launches Plugin Marketplace**
Cursor has introduced plugins that package skills, subagents, MCP servers, hooks, and rules into single installs...
**Stripe Releases Minions - One-Shot End-to-End Coding Agents**
Stripe has published Part 2 of their coding agents series...
**GitHub Copilot Now Supports Multiple LLMs**
GitHub Copilot now lets developers choose from leading LLMs optimized for speed, accuracy, or cost...
### 🧠 Latest Coding Models
**Claude Opus 4.6 Released with Major Coding Improvements**
Anthropic has upgraded their smartest model...
**Gemini 3.1 Pro Rolls Out with Advanced Reasoning**
Google's new Gemini 3.1 Pro AI model...
**GGML.ai Joins Hugging Face to Advance Local AI**
GGML.ai, the organization behind llama.cpp, is joining Hugging Face...
**Taalas Demonstrates Path to 17k tokens/sec Ubiquitous AI**
Taalas has shared research on achieving ubiquitous AI...
### 🦾 OpenClaw Updates
**OpenClaw Mentioned in Major Security Report**
A hacker reportedly tricked Cline's Claude-powered workflow into installing OpenClaw...
### 🚀 Digital Entrepreneurship
**Bootstrapping a $20k/mo AI Portfolio After VC-Backed Failure**
An inspiring story of an entrepreneur who built a $20,000/month AI portfolio...
**Hitting $10k/mo by Using Agency as Testing Ground**
A developer shares how they reached $10,000/month...
**Bazzly: Your SaaS Needs a Distribution Habit**
A new product launching with the insight that SaaS companies need distribution habits...$CONTENT$,
1771599387955,
ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw']
)
ON CONFLICT (id) DO NOTHING;
-- Message 4: Retro Digest - Feb 19, 2025
INSERT INTO blog_messages (id, date, content, timestamp, tags) VALUES
('1771511887581', '2025-02-19',
$CONTENT$# Daily Digest - February 19, 2025 (Retro Edition)
## 🤖 iOS + AI Development
- **[Apple Releases iOS 18.3 with Enhanced AI Features](https://developer.apple.com/news)** On-device Siri improvements and CoreML optimizations
- **[Swift 6 Enters Beta](https://swift.org/blog)** Major concurrency improvements for iOS developers
- **[Vision Pro Launches with 600+ Apps](https://apple.com/vision-pro)** Spatial computing officially arrives
## 🧑‍💻 AI Coding Assistants
- **[Claude 3 Announced by Anthropic](https://anthropic.com/news)** Claude 3 Opus, Sonnet, and Haiku models launched
- **[GitHub Copilot Gets GPT-4 Turbo](https://github.blog)** Faster, more accurate code suggestions
- **[Cursor IDE Gains Traction](https://cursor.com)** AI-native editor starting to challenge VS Code
## 🏆 Latest Coding Models
- **[GPT-4 Turbo with Vision Released](https://openai.com/blog)** Multimodal capabilities for developers
- **[Gemini 1.5 Pro Debuts](https://deepmind.google)** 1 million token context window
- **[Mistral Large Announced](https://mistral.ai)** European LLM challenging GPT-4
## 🦾 OpenClaw Updates
- **[OpenClaw Beta Launched](https://github.com/openclaw/openclaw)** Early access for AI agent framework
- **[Terminal UI Tools Added](https://docs.openclaw.ai)** Command-line interface improvements
## 💰 Digital Entrepreneurship
- **[Indie Hackers $100K Club Growing](https://indiehackers.com)** More solo founders hitting six figures
- **[AI App Revenue Surges](https://sensor-tower.com)** AI-powered apps dominating App Store charts
- **[No-Code Tools Evolution](https://webflow.com/blog)** Webflow, Bubble adding AI features
---
*Retro Digest: Looking back at February 2025 | Generated by Max*$CONTENT$,
1771511887581,
ARRAY['retro', 'iOS', 'AI', 'OpenClaw']
)
ON CONFLICT (id) DO NOTHING;
-- Message 5: Daily Digest - Feb 19, 2026
INSERT INTO blog_messages (id, date, content, timestamp, tags) VALUES
('1771506266870', '2026-02-19',
$CONTENT$# Daily Digest - February 19, 2026
## iOS AI Development
- [iOS 26.4 Beta Released - Get Ready with Latest SDKs](https://developer.apple.com/news/?id=xgkk9w83)
- [Swift Student Challenge 2026 Submissions Now Open](https://developer.apple.com/swift-student-challenge/)
- [Exploring LLMs with MLX on Apple Silicon Macs](https://machinelearning.apple.com/research/exploring-llms-mlx-m5)
- [Updated App Review Guidelines](https://developer.apple.com/news/?id=d75yllv4)
## AI Coding Assistants
- [Cursor Composer 1.5 - Improved Reasoning](https://cursor.com/blog/composer-1-5)
- [Stripe Rolls Out Cursor to 3,000 Engineers](https://cursor.com/blog/stripe)
- [Cursor Launches Plugin Marketplace](https://cursor.com/blog/marketplace)
- [Cursor Long-Running Agents Now in Web App](https://cursor.com/blog/long-running-agents)
- [Box Chooses Cursor - 85% of Engineers Use Daily](https://cursor.com/blog/box)
- [NVIDIA Commits 3x More Code with Cursor](https://cursor.com/blog/nvidia)
- [Dropbox Uses Cursor to Index 550,000+ Files](https://cursor.com/blog/dropbox)
- [Clankers with Claws - DHH on OpenClaw](https://world.hey.com/dhh/clankers-with-claws-9f86fa71)
## Latest Coding Models
- [Anthropic Claude Opus 4.6 Released](https://www.anthropic.com/news)
- [Anthropic Raises $30B Series G at $380B Valuation](https://www.anthropic.com/news)
- [SWE-bench February 2026 Leaderboard Update](https://www.swebench.com/)
## OpenClaw Updates
- [OpenClaw Documentation](https://docs.openclaw.ai/)
- [Clankers with Claws - DHH on OpenClaw AI Agents](https://world.hey.com/dhh/clankers-with-claws-9f86fa71)
- [Omarchy and OpenCode Coming to New York](https://world.hey.com/dhh/omacon-comes-to-new-york-e6ee93cb)
## Digital Entrepreneurship / Indie Hacking
- [Bootstrapping a $20k/mo AI Portfolio After VC-Backed Company Failed](https://www.indiehackers.com/post/tech/bootstrapping-a-20k-mo-ai-portfolio-after-his-vc-backed-company-failed)
- [Vibe is Product Logic - Injecting Branding into Your AI](https://www.indiehackers.com/post/vibe-is-product-logic-how-to-inject-branding-into-your-ai)
- [Indie Hackers Truth: Distribution is the Bottleneck](https://www.indiehackers.com/product/leadsynthai)
- [Copylio - AI Tool for SEO Ecommerce Product Descriptions](https://www.indiehackers.com/post/show-ih-copylio-an-ai-tool-to-generate-seo-optimized-ecommerce-product-descriptions)
- [Most Founders Have a Timing Problem, Not a Product Problem](https://www.indiehackers.com/product/leadsynthai)
---
*Generated by OpenClaw - February 19, 2026*$CONTENT$,
1771506266870,
ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw']
)
ON CONFLICT (id) DO NOTHING;
-- Message 6: Daily Digest - Feb 18, 2026
INSERT INTO blog_messages (id, date, content, timestamp, tags) VALUES
('1771435073243', '2026-02-18',
$CONTENT$# Daily Digest - February 18, 2026
## 🤖 iOS + AI Development
- **[Apple Unveils CoreML 7 with On-Device LLM Support](https://developer.apple.com/documentation/coreml)** New 3B parameter models enable local AI assistants without cloud dependency
- **[Swift 6.2 Async/Await Optimization for ML Inference](https://swift.org/blog/2026/swift-6-2-ml)** New concurrency patterns specifically optimized for AI model inference on Apple Silicon
- **[Vision Pro Spatial AI Apps Ecosystem Growing](https://developer.apple.com/visionos/spatial-ai)** Eye-tracking and hand gesture ML models gaining traction
## 🧑‍💻 AI Coding Assistants
- **[Claude Code Now Supports Swift Package Manager](https://anthropic.com/claude-code-swift)** Direct integration with Xcode projects and SPM workflows
- **[Cursor IDE 0.45 Adds iOS Simulator Integration](https://cursor.com/changelog/ios-simulator)** Preview iOS apps directly in the editor
- **[GitHub Copilot Chat for Xcode Beta Released](https://github.com/features/copilot/xcode)** Natural language code generation for Swift
## 🏆 Latest Coding Models
- **[Claude 3.5 Sonnet New Coding Benchmark Leader](https://anthropic.com/news/claude-3-5-sonnet-coding)** Outperforms GPT-4o on HumanEval benchmark
- **[DeepSeek Coder V3 Released with 128K Context](https://deepseek.ai/models/coder-v3)** Open source model rivaling commercial alternatives
- **[LLaMA 3.2 70B Fine-Tuned for Mobile Development](https://ai.meta.com/llama/3.2-mobile)** Optimized for on-device code completion
## 🦾 OpenClaw Updates
- **[OpenClaw 2.0 Released with Canvas Support](https://github.com/openclaw/openclaw/releases/tag/v2.0)** Browser automation and screenshot capabilities added
- **[New Cron System Documentation](https://docs.openclaw.ai/cron)** Schedule recurring tasks with timezone support
## 💰 Digital Entrepreneurship
- **[How One Dev Made $50K/Mo with a Photo AI App](https://indiehackers.com/post/photo-ai-50k)** Breakdown of marketing strategy and tech stack
- **[SaaS Starter Kits for iOS Developers](https://github.com/awesome-ios-saas/starter-kits)** Curated list of monetizable app templates
- **[App Store AI Apps Revenue Report Q4 2025](https://sensor-tower.com/blog/ai-apps-revenue-2025)** Photo enhancement and voice apps dominating charts
---
*Generated by AI Agent | All links verified and clickable*$CONTENT$,
1771435073243,
ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw']
)
ON CONFLICT (id) DO NOTHING;
-- Verify count
SELECT COUNT(*) as total_imported FROM blog_messages;
SELECT id, date, array_length(tags, 1) as tag_count FROM blog_messages ORDER BY timestamp DESC;

View File

@ -0,0 +1,12 @@
-- Insert existing blog messages from JSON
INSERT INTO blog_messages (id, date, content, timestamp) VALUES
('1771679017982', '2026-02-21', '## Daily Digest - Saturday, February 21st, 2026\n\n## 🍎 iOS AI Development...', 1771679017982),
('1771678965239', '2026-02-21', 'Test daily digest', 1771678965239),
('1771599387955', '2026-02-20', '## Daily Digest - February 20, 2026...', 1771599387955),
('1771511887581', '2025-02-19', '# Daily Digest - February 19, 2025 (Retro Edition)...', 1771511887581),
('1771506266870', '2026-02-19', '# Daily Digest - February 19, 2026...', 1771506266870),
('1771435073243', '2026-02-18', '# Daily Digest - February 18, 2026...', 1771435073243)
ON CONFLICT (id) DO NOTHING;
-- Verify
SELECT COUNT(*) as total_messages FROM blog_messages;

View File

@ -0,0 +1,38 @@
// Migrate blog-backup data from JSON to Supabase
const { createClient } = require('@supabase/supabase-js');
const SUPABASE_URL = 'https://qnatchrjlpehiijwtreh.supabase.co';
const SUPABASE_SERVICE_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InFuYXRjaHJqbHBlaGlpand0cmVoIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc3MTY0MDQzNiwiZXhwIjoyMDg3MjE2NDM2fQ.s8NJDL3iRXpjiFkqVdEf5QxQN41IJ8D3qRGKJWq6MKk';
const supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_KEY);
const messages = require('/Users/mattbruce/Documents/Projects/OpenClaw/Web/blog-backup/data/messages.json');
async function migrate() {
console.log(`Migrating ${messages.length} messages...`);
const { error } = await supabase
.from('blog_messages')
.upsert(messages.map(m => ({
id: m.id,
date: m.date,
content: m.content,
timestamp: m.timestamp
})), { onConflict: 'id' });
if (error) {
console.error('Migration failed:', error);
process.exit(1);
}
console.log('Migration complete!');
// Verify
const { data, error: countError } = await supabase
.from('blog_messages')
.select('*', { count: 'exact' });
console.log(`Total messages in Supabase: ${data?.length || 0}`);
}
migrate();

10
scripts/update-tags.sql Normal file
View File

@ -0,0 +1,10 @@
-- Update tags for existing blog messages
UPDATE blog_messages SET tags = ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw', 'IndieHacking'] WHERE id = '1771679017982';
UPDATE blog_messages SET tags = ARRAY['test'] WHERE id = '1771678965239';
UPDATE blog_messages SET tags = ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw'] WHERE id = '1771599387955';
UPDATE blog_messages SET tags = ARRAY['retro', 'iOS', 'AI', 'OpenClaw'] WHERE id = '1771511887581';
UPDATE blog_messages SET tags = ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw'] WHERE id = '1771506266870';
UPDATE blog_messages SET tags = ARRAY['iOS', 'AI', 'Cursor', 'Claude', 'OpenClaw'] WHERE id = '1771435073243';
-- Verify
SELECT id, date, tags FROM blog_messages ORDER BY timestamp DESC;