Yusuf Suleman 18dd5aa44d
All checks were successful
Security Checks / dependency-audit (push) Successful in 13s
Security Checks / secret-scanning (push) Successful in 4s
Security Checks / dockerfile-lint (push) Successful in 3s
fix: mark-read on first open + eliminate long-article scroll freeze
## Bug 1: First open didn't mark as read

ROOT CAUSE: Race condition. markAsRead set local status="read",
then getEntry returned the server's status="unread" (API sync
hadn't completed yet) and overwrote the local mutation.

FIX:
- markAsRead runs FIRST, before getEntry (was concurrent before)
- After getEntry, merge server response but PRESERVE local
  status/starred (which may differ from server due to race)
- currentEntry syncs from vm.entries after markAsRead, ensuring
  the toolbar reflects the correct state

## Bug 2: Long articles freeze before scrollable

ROOT CAUSE: WKWebView.scrollView.isScrollEnabled = false, embedded
inside SwiftUI ScrollView with .frame(height: webViewHeight).
For a 15000px article, WebKit had to render the entire document,
JavaScript measured document.body.scrollHeight, SwiftUI relaid out
the 15000px frame — all blocking before scroll became responsive.

FIX:
- WKWebView now handles its own scrolling (isScrollEnabled = true)
- Removed SwiftUI ScrollView wrapper around article
- Removed contentHeight binding and height measurement JavaScript
- Removed the Coordinator's didFinish height evaluation
- Article header (title, feed, time) moved into the HTML document
  so it scrolls naturally with the content
- WKWebView fills available space, scrolls natively via WebKit's
  compositor thread — immediate scroll response

Both fixes preserve the shared WKWebView architecture.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:28:24 -05:00

Gitea CI Workflows

security.yml

Runs on push/PR to master. Three jobs:

  1. dependency-auditnpm audit --audit-level=high for budget and frontend
  2. secret-scanning — checks for tracked .env/.db files and hardcoded secret patterns
  3. dockerfile-lint — verifies all Dockerfiles have USER (non-root) and HEALTHCHECK

Runner Setup

The runner is configured in the Gitea docker-compose at /media/yusiboyz/Media/Scripts/gitea/docker-compose.yml.

What was done:

  1. Added [actions] ENABLED = true to Gitea's app.ini
  2. Added runner service (gitea/act_runner) to Gitea's docker-compose
  3. Generated runner token via docker exec -u git gitea gitea actions generate-runner-token
  4. Token stored in /media/yusiboyz/Media/Scripts/gitea/.env as RUNNER_TOKEN
  5. Runner registered as platform-runner with labels: ubuntu-latest, ubuntu-24.04, ubuntu-22.04

To regenerate token (if needed):

cd /media/yusiboyz/Media/Scripts/gitea
docker exec -u git gitea gitea actions generate-runner-token
# Update .env with new RUNNER_TOKEN value
docker compose up -d runner

To check runner status:

docker logs gitea-runner
Description
Second Brain Platform - Dashboard, Fitness, Budget, Inventory, Trips, Reader, Media
Readme 31 MiB
Languages
Svelte 51.2%
Python 24.2%
Swift 13.5%
JavaScript 5.4%
TypeScript 3.3%
Other 2.4%