Dashboard

43
Total
10
Active
6
Dormant
19
Stale
8
Abandoned

Today's diary

2026-05-20
# 2026-05-20

## sherpa-hub

Took the new sherpa-hub from "deployed but empty" to "deployed and serving real
data." Two stacked bugs blocked the first sync end-to-end — peeled them off in
order.

### What we did

- Provisioned the Render service via the Blueprint config. Hub came up clean,
  Basic Auth worked, `/healthz` returned OK with `cache_age_seconds: null`.
- Generated a GitHub fine-grained PAT for `klill6506`. First attempt had no
  permissions assigned — GitHub silently issued a token with zero scope. Fixed
  by editing the token to add Contents + Metadata read-only on All Repositories.
  Eventually swapped to a classic PAT (`ghp_…`) because the fine-grained flow
  has too many UI gotchas. Both formats work since the sync uploader just sends
  `Authorization: Bearer <token>`.
- Filled out `sync/.env` with GitHub token, Render API key, Hub URL, upload
  secret, dev/personal roots, and diary dir.

### The hard bug: Cloudflare DLP

First sync ran the whole pipeline successfully — GitHub, Render, filesystem,
diary — then choked on the upload with a `403 Forbidden` and an HTML "Blocked"
page from Render's edge layer.

Traced through several false leads:
- User-Agent change (no fix — the WAF wasn't checking that)
- Renamed `/admin/refresh` → `/sync/upload` (helped a known rule but not the
  real blocker)
- Truncated READMEs and memory files from full content to 2000 chars each
  (415 KB → 178 KB cache, but still blocked)
- New `HUB_UPLOAD_SECRET` with no special characters (still blocked because
  this wasn't about the secret value — 403 fires before auth)

The actual fix was **gzip the body**. Render's edge runs Cloudflare-style DLP
scanning that looks for "leaked credential" patterns in POST bodies. Our cache
contains memory files that *mention* env var names like `GITHUB_TOKEN` and
`HUB_UPLOAD_SECRET` — those substrings trip the leaked-credentials scanner.
Gzipping the body turns it into a binary blob the scanner can't parse, so it
passes through. As a bonus the wire size drops 4x (178 KB → 46 KB).

After the gzip fix landed, the request reached our FastAPI app for the first
time — and got a clean `401 Invalid bearer token`. Different problem, but
visible only once the WAF stopped swallowing requests. The 401 was
self-inflicted: I had typed `HUB_UPLOAD_SECRET=$secret=` into `.env`. The
file is read literally by python-dotenv — `$secret` is not a variable
reference, it's just a literal six-character string. Replaced with a clean
40-char alphanumeric value on both sides (Render env + local `.env`).

Next sync run: `200 OK`, `Done.`

### Numbers from first successful sync

- 41 GitHub repos pulled
- 20 Render services matched by name
- 19 local folders matched (across `D:\dev` + `D:\Personal`)
- 10 orphan folders (local-only, no GitHub repo)
- 3 diary entries loaded
- Cache: 178 KB raw → 46 KB gzipped
- Total runtime: ~12 seconds end-to-end

The deployed dashboard now shows everything. Health page surfaces real items
(the 10 orphans + apps missing memory files). Big payoff for the rebuild —
exactly the "wrap your arms around it all" view that was the original goal.

### Decisions recorded today

- **D-009:** Upload route is `/sync/upload`, not `/admin/refresh`
- **D-010:** Truncate READMEs + memory files to 2000 chars in the cache
- **D-011:** Gzip the upload body to bypass Cloudflare DLP

## ideas

- **UI redesign (queued for tomorrow).** Functionality is in; appearance is
  basic. Asks: an icon per app, separate tabs by activity bucket (active /
  dormant / stale / abandoned) instead of one mixed grid, generally prettier.
  Brainstorming skill was invoked but paused at the visual-companion offer —
  resume there.
- **Lesson worth keeping in mind for other apps deployed on Render:** if you
  ever POST a body that contains things that *look like* credentials (env var
  names, API key prefixes, even keywords like "secret" or "token"), Cloudflare
  will block it at the edge regardless of whether they're actual credentials.
  Gzip the body or accept that you'll need to keep stripping keyword content.
- **Lesson on PATs:** Fine-grained PATs in GitHub start with **zero** scope by
  default. The UI lets you generate one without selecting any access. Verify
  the token detail page shows actual permissions before debugging deeper.

## notes

- Force-pushed `rebuild-v1` branch to `main` and deleted the branch. New
  preference recorded: for solo projects with no prod risk, work directly on
  `main` — branches in GitHub feel like clutter. Captured as
  `feedback_branches.md` in the per-project memory dir.
- Hub URL is `https://sherpa-hub-6psj.onrender.com` (the `-6psj` is Render's
  random suffix for the auto-generated name). HTTP Basic Auth in front of all
  UI routes; Bearer on `/sync/upload`.
- Still on the "Phase 1 only" milestone — diary auto-write hook and Obsidian
  diary migration remain queued as adjacent tasks. Neither is blocking the
  next UI work.
Last 5 days →

Apps

AcroForm-Creator

dormant dev

AcroForm Creator

https://github.com/klill6506/AcroForm-Creator →

boston-trip

abandoned none

Providence/Boston 2025 Itinerary

https://github.com/klill6506/boston-trip →

boston2

abandoned none

https://github.com/klill6506/boston2 →

cfb-picks

stale personal

CFB Handicapping

https://github.com/klill6506/cfb-picks →

claude-mlb

dormant none

https://github.com/klill6506/claude-mlb →

dev-academy

stale personal

A curriculum to help me learn development software packages and what they do.

https://github.com/klill6506/dev-academy →

election-tracker

active personal

Georgia 2026 primary winner predictor (Flask + weighted scoring model)

https://github.com/klill6506/election-tracker →

games-mahjong

active none

Georgianna's American Mahjong — tutorial + practice + online multiplayer

https://github.com/klill6506/games-mahjong →

half-training-app

active personal

Personal half marathon training tracker + AI coach for AthHalf 2026

https://github.com/klill6506/half-training-app →

kens-daily-dashboard

dormant personal

https://github.com/klill6506/kens-daily-dashboard →

matchups

stale personal

Classic Concentration Game

https://github.com/klill6506/matchups →

move-to-taxdome

abandoned none

https://github.com/klill6506/move-to-taxdome →

Pips

abandoned none

Game similar to Pips

https://github.com/klill6506/Pips →

sherpa-1099

●live dormant dev

This is an app to electronically file 1099s directly with IRS for ourselves and clients.

https://sherpa-1099.onrender.com →

sherpa-amortization

stale none

https://github.com/klill6506/sherpa-amortization →

sherpa-assistant

●live stale dev

AI assistant for The Tax Shelter — replaces Clawdbot with better memory, security, and cost control

https://sherpa-assistant.onrender.com →

sherpa-brain-todo

stale none

Slack bot for task management and note capture via Google Sheets and Obsidian

https://github.com/klill6506/sherpa-brain-todo →

sherpa-check-in

●live stale dev

This an app to allow our clients to check in for an appointment.

https://sherpa-check-in.onrender.com →

sherpa-client-folders

stale none

This is an app that can create folders for clients and move files to the proper client folder.

https://github.com/klill6506/sherpa-client-folders →

sherpa-creditcard-je

stale none

This is an app that creates a journal entry from scanned in bank statements and credit card statements.

https://github.com/klill6506/sherpa-creditcard-je →

sherpa-dashboard

●live stale none

Project dashboard - track apps, status, and progress

https://sherpa-dashboard.onrender.com →

sherpa-depreciation

●live stale dev

Depreciation Module

https://sherpa-depreciation.onrender.com →

sherpa-email

stale none

This is an app that moves emails to subfolders and creates rules based on classification assigned by user.

https://github.com/klill6506/sherpa-email →

sherpa-hub

●live active dev

Hub to track my app development

https://sherpa-hub.onrender.com →

sherpa-marketing

●live active dev

Simultaneous Posts to Social Networks for businesses

https://sherpa-marketing.onrender.com →

sherpa-memory-sync

dormant dev

Mirror memory-style files from local projects to a Google Drive hub for Claude cross-session context.

https://github.com/klill6506/sherpa-memory-sync →

sherpa-pdf

stale none

https://github.com/klill6506/sherpa-pdf →

sherpa-portal

●suspended dormant dev

Sherpa Client Portal — secure client-facing portal for tax practice management

https://sherpa-portal.onrender.com →

sherpa-property-tax

stale dev

GA Personal Property Tax Application

https://github.com/klill6506/sherpa-property-tax →

sherpa-tax-rule-studio

●live active dev

https://sherpa-tax-rule-studio.onrender.com →

sherpa-todo

●suspended stale none

To do list to be hosted on the web.

https://sherpa-todo.onrender.com →

Spooler-Move

stale none

Watches TaxWise Spooler folder and moves returns to PDF Returns directory

https://github.com/klill6506/Spooler-Move →

stthomas-itin

abandoned none

https://github.com/klill6506/stthomas-itin →

Tanks

abandoned none

https://github.com/klill6506/Tanks →

tax-shelter-website

stale none

The Tax Shelter - Professional Tax & Accounting Services

https://github.com/klill6506/tax-shelter-website →

tts-tax-app

●live active dev

Professional tax preparation software for small/mid accounting firms

https://tts-tax-app.onrender.com →

tv-tracker

stale none

https://github.com/klill6506/tv-tracker →

vac-2026-08-alaska

active none

2026 Summer Vacation - Just Ken & Georgianna

https://github.com/klill6506/vac-2026-08-alaska →

vacay

abandoned none

2025 Vacation

https://github.com/klill6506/vacay →

whats-on

●live active personal

TV show tracker - What's On tonight?

https://whats-on.onrender.com →

worth-the-run

●live active none

https://worth-the-run.onrender.com →

your-pie-trivia

stale none

https://github.com/klill6506/your-pie-trivia →

YPTHosted

abandoned none

https://github.com/klill6506/YPTHosted →