18dd5aa44d92ab210918e3ad54ad65e61966fd25
## 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>
Gitea CI Workflows
security.yml
Runs on push/PR to master. Three jobs:
- dependency-audit —
npm audit --audit-level=highfor budget and frontend - secret-scanning — checks for tracked .env/.db files and hardcoded secret patterns
- dockerfile-lint — verifies all Dockerfiles have
USER(non-root) andHEALTHCHECK
Runner Setup
The runner is configured in the Gitea docker-compose at /media/yusiboyz/Media/Scripts/gitea/docker-compose.yml.
What was done:
- Added
[actions] ENABLED = trueto Gitea'sapp.ini - Added
runnerservice (gitea/act_runner) to Gitea's docker-compose - Generated runner token via
docker exec -u git gitea gitea actions generate-runner-token - Token stored in
/media/yusiboyz/Media/Scripts/gitea/.envasRUNNER_TOKEN - Runner registered as
platform-runnerwith 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
Languages
Svelte
51.2%
Python
24.2%
Swift
13.5%
JavaScript
5.4%
TypeScript
3.3%
Other
2.4%