Log

What I got done each week, project by project.

Commits logged
2,666
Weeks with commits
20
Current run
14 weeks
Rocheport Times2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · 459 commits2026-W29 · 156 commits2026-W30 · 374 commits2026-W31 · 208 commits2026-W32 · 12 commits2026-W33 · 46 commits2026-W34 · no entry2026-W35 · 15 commits2026-W36 · no entry2026-W37 · no entry2026-W38 · 18 commits2026-W39 · 36 commits2026-W40 · 145 commits2026-W41 · 127 commits2026-W42 · no entry1,597
Bow & Bridge2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · 186 commits2026-W34 · 261 commits2026-W35 · 85 commits2026-W36 · 155 commits2026-W37 · 34 commits2026-W38 · 74 commits2026-W39 · 35 commits2026-W40 · 36 commits2026-W41 · 8 commits2026-W42 · no entry874
Earlier work2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · 22 commits2025-W50 · 13 commits2025-W51 · 3 commits2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · no entry2026-W34 · no entry2026-W35 · no entry2026-W36 · no entry2026-W37 · no entry2026-W38 · no entry2026-W39 · no entry2026-W40 · no entry2026-W41 · no entry2026-W42 · no entry38
romanclarkson.us2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · no entry2026-W34 · no entry2026-W35 · no entry2026-W36 · no entry2026-W37 · no entry2026-W38 · no entry2026-W39 · no entry2026-W40 · 6 commits2026-W41 · 1 commits2026-W42 · no entry7
Noble Strings2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · 3 commits2026-W34 · no entry2026-W35 · no entry2026-W36 · 4 commits2026-W37 · no entry2026-W38 · no entry2026-W39 · no entry2026-W40 · 7 commits2026-W41 · no entry2026-W42 · no entry14
Purfle2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · 8 commits2026-W14 · 128 commits2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · no entry2026-W34 · no entry2026-W35 · no entry2026-W36 · no entry2026-W37 · no entry2026-W38 · no entry2026-W39 · no entry2026-W40 · no entry2026-W41 · no entry2026-W42 · no entry136
Commits by week, 2025-W43 to 2026-W42. The busiest week had 459.
  1. 202627 weeks logged2,627
  2. W415 Oct

    romanclarkson.us

    Track this site’s own repo as romanclarkson-us

    • Changelog: track this site's own repo as romanclarkson-us (1 commit)
    1commits
  3. W415 Oct

    Rocheport Times

    Rundown event line carries the place

    • Newsroom desk: rundown event line carries the place (18 commits)
    • Local news: more from Rocheport block and Next in Section link replace the comment form (13 commits)
    • Events: home page on a phone opens with the events calendar, above Did You Know (11 commits)
    and 4 more
    127commits
  4. W415 Oct

    Bow & Bridge

    Status publish read every maker

    • Maker records: status publish read every maker (4 commits)
    • Citations: assorted smaller changes (1 commit)
    • Guards: assorted smaller changes (1 commit)
    and 1 more
    8commits
  5. W4028 Sep

    romanclarkson.us

    AI Bench replaces Skills, and the site says what I do now

    • Added a second line to the footer linking to the sitemap, llms.txt, and a download of the whole site as text or JSON. It reuses the existing footer styles and adds no CSS.
    • Changed the home page opening paragraph, llms.txt and the site's JSON-LD to say that I have done agentic coding since August 2025: directing AI coding agents like Claude Code in parallel, writing the instructions and skills they work from, and building MCP servers that connect them to real systems.
    • Renamed the Skills page to AI Bench, at /ai-bench/. The nav label, the page allowlists in the MCP and record plugins, the About page link and the llms.txt entry all changed with it. Old /skills/ links now answer with a 301 to the new address; I added that redirect myself because WordPress's built-in old-slug redirect skips pages. I checked locally that /ai-bench/ returns 200 and /skills/ redirects
    and 2 more
    6commits
  6. W4028 Sep

    Noble Strings

    Deploy script, MCP access past GoDaddy, and Event schema for Noble Strings

    • Added build/push-code.sh, which syncs the theme and the google-reviews and noble-instruments plugins to the live site and flushes the cache. GoDaddy requires both the SSH key and the password on every login, so the script reuses a connection I have already opened with ssh -MNf and only prompts, then closes, when none is open.
    • Added a small plugin, noble-rest-auth. GoDaddy strips the Authorization header before PHP sees it, so application passwords never reached WordPress and the MCP Adapter endpoint always answered rest_not_logged_in. The plugin reads the same Basic credentials from an X-WP-Authorization header; core still validates them as an application password. It is added to the deploy script.
    • Added a google-reviews/refresh-reviews ability so reviews can be refreshed over MCP (plugin 1.1.0), then changed the fetch to try the legacy Place Details endpoint first and fall back to the Places API (New) (plugin 1.2.0).
    and 2 more
    7commits
  7. W4028 Sep

    Rocheport Times

    Events from chat, a river profile, and a community security review

    • Events: four MCP action tools (events, event_edit, event_queue, event_feeds) now create, edit, trash, review and merge events, folded down from 17 so the connector shows them all. A weekly walker looks for calendars on directory businesses' own websites, a text reader parses events posted as plain page text, a business's own listing wins duplicates, and past events are retired daily with a redirec
    • Events listings put Rocheport first within each day and label regional events by town. The Daniel Boone Regional Library and MU calendars were added and Visit Columbia turned off by default. The MCP server also gained update_post for corrections, and its tool list went from 40 tools to 19.
    • River: all 50 gauge pages now draw the river in side view from Toston to St. Charles, with a 7-day observed and forecast timeline, NWS flood-stage lines, Upstream/Downstream panning and a /river/profile/ hub. The gauge reading now survives a cache flush instead of showing 'River data unavailable.'
    and 6 more
    145commits
  8. W4028 Sep

    Bow & Bridge

    7,038 makers live, and 753 non-makers found

    • Added incremental deploys that ship only the rows and records production does not already hold. Measured against the 26 Sep release, a full deploy is 1,006 MB raw (206 MB gzipped) and an incremental one 155 MB (29 MB). A data-only sync followed, which refuses if the host's code differs from mine.
    • Retired 753 non-makers: 610 players and quartets from Bachmann's players' section, 47 junk lines such as captions and sheet-music titles, and 96 makers of instruments that are not bowed. 26 records were retitled, and a towns pass cut published makers with neither town nor years from 4,333 to 300.
    • Fixed twin labels, which stored the laptop's post id; production numbers posts differently, so Robert Barnes's page read "May be the same person as Busas, Domenico". They now resolve by slug.
    and 6 more
    36commits
  9. W3921 Sep

    Rocheport Times

    Five games, a broadsheet front, and the home page as a front door

    • Launched five games: The Mini, a Weekly Quiz, Four Corners, Letterpress and Night Sky, with their own page type and layout.
    • Made the home page a front door: no news on it, just live vitals, events, sports and games; /news/ carries the news. Events gained a 'Pin to Front Page' flag.
    • Built the MR340 race hub's stats band (the MR340 is a 340-mile Missouri River paddle race): entered, finished, DNF, DNS, by division, with a map preview that opens the full-screen race map, and two-column year pages.
    and 6 more
    36commits
  10. W3921 Sep

    Bow & Bridge

    A facsimile is not a second edition

    • Added /labels/: every checked maker's label on a published record, A to Z, with the book, scan page and line it was read from.
    • Fixed the edition rule: a facsimile counts as the edition it reproduces. 105 records resting on one reprinted book were demoted to draft, and 583 same-person questions were answered in the same pass, leaving 569 published makers.
    • Fixed the OCR loop check, which had rejected 1,019 honest pages across 429 volumes because a row of dot leaders looked like a decoding loop.
    and 6 more
    35commits
  11. W3814 Sep

    Rocheport Times

    Open sign-up, chat, and a front page that looks like a newspaper

    • Opened sign-up: a self-serve /register/ page with editor approval, passwordless login links, a members' Messages badge in the utility bar, and a privacy note.
    • Built member messaging as a chat UI on the existing direct-message store, with block, report and moderation, and a flag-gated daily digest.
    • Marked every member-gated page uncacheable after the edge cache served logged-out copies to signed-in members.
    and 3 more
    18commits
  12. W3814 Sep

    Bow & Bridge

    First production deploy: 605 makers live

    • First production deployment on 18 Sep, second and third on 20 Sep; the deploy is one command, dry by default, ships the tables as data and rewrites URLs on the host.
    • Applied a ninety-year rule: a maker whose cited printing is at least ninety years old clears the possibly-living check. The export went from 191 to 648 published records in one pass; 605 were live after the second deploy.
    • Site review for a trade reader, eight findings fixed: search finds makers, every published maker in one A–Z table, the citation stays open on every page, each printing links to its scan.
    and 3 more
    74commits
  13. W377 Sep

    Bow & Bridge

    Fifteen ceilings the pipeline must stay under

    • Fixed the admit storm: one volume the station could never fit had been asked 10,506 times; the admission rung is now paced by work done, and the drain front rotates instead of starving.
    • Wrote the operations contract: fifteen ceilings (queue depths, run times, log sizes) read from one file, with a nightly uncapped guard pass and a station ledger that records every page ask.
    • Stopped the miner minting bare surnames: a single-token name is refused, and a guard catches any that got through.
    and 2 more
    34commits
  14. W3631 Aug

    Noble Strings

    Instruments for Sale becomes a photo-first plate gallery

    • Replaced the specs-table, per-instrument detail page with one photo-first gallery: a single plate per instrument showing all four sides, so no click-through is needed.
    • Gave each plate its own bordered, shadowed card with real spacing between instruments, instead of a stacked list separated only by hairlines, and dropped a dead reviews filter left over from the old layout.
    • Moved the single instrument photo shown on Home into the sidebar under the search widget, hid a duplicate search icon in the main navigation, and dropped the No. label from each plate's identifier while keeping the identifier itself.
    and 1 more
    4commits
  15. W3631 Aug

    Bow & Bridge

    An admission door for every book, and a site a stranger can read

    • Built the admission door: a volume is sampled, profiled and given a rule-table verdict before any mining; the miner, the prose stage and the import step all refuse a volume the door has not admitted.
    • Rewrote every public page and template string for a general reader, rebuilt the maker index around search with a random cut of 18 records, and added a public /progress/ page that counts the pipeline stage by stage from a snapshot.
    • Closed every code path that could mint a second live record for the same name, then restored 177 merges that an August rebuild had silently undone.
    and 3 more
    155commits
  16. W3524 Aug

    Rocheport Times

    Quick Approve for the editor, six more trails

    • Added Quick Approve to the Editorial Desk for the three daily draft types, with the full post body open inline so nothing is approved unread.
    • Made the desk hold any draft carrying raw HTML in its prose before it can publish, with a test case for the gate.
    • Gave the MCP newsroom two event-writing tools so an approved calendar item can be corrected or published from the assistant.
    and 2 more
    15commits
  17. W3524 Aug

    Bow & Bridge

    Two verification bugs that hid 3,500 good claims

    • Fixed the verbatim verifier's apparatus detector: attested claims went from 0 to 3,545 in one run.
    • Fixed page-locator resolution in the batch verifier from 0.3% to 99.0% of claims landing on their exact page, and stopped it spending model calls on retired records.
    • Indexed the transcript table so a per-claim lookup dropped from a 92-second full scan to 2 seconds.
    and 3 more
    85commits
  18. W3417 Aug

    Bow & Bridge

    Teaching the miner what is not a name

    • Wrote a set of name rules into the miner: an author is not a maker, a dash is not a forename, a middle initial is not a death date, a courtesy title or a printed place never sits in the name slot, and one printed line naming two makers becomes two mentions.
    • Verified 2,893 claims that quote a printed line directly against the page text, with no language model involved.
    • Retired 126 junk drafts (index lines, death notices, catalogue prices) that had been minted as makers, and deduplicated 1,307 byte-identical mention rows across 40 records.
    and 3 more
    261commits
  19. W3310 Aug

    Noble Strings

    Evidence markers for the maker research, and code finally in git

    • Added claim and dispute shortcodes: an inline pill for a single-sourced or secondary claim, a callout box for the rare case where the primary record contradicts the popular account, in four tiers from reported to unverified.
    • Moved the site's custom styling out of Appearance > Additional CSS, which stored it only in the database, into a tracked custom.css file in the child theme, loaded after every other stylesheet so it wins.
    • Started tracking the site's own code in git for the first time: the instrument showcase, the news digest, the Google reviews display and the child theme, leaving WordPress core, the database and uploads to Studio.
    3commits
  20. W3310 Aug

    Rocheport Times

    Public-domain river data and a 47-trail explorer

    • Swapped the river-channel geometry for public-domain USACE data on both the desktop map and the server, and regenerated the mobile encoding to match.
    • Fixed the 2026 replay's phantom leader: the first hour of tracking was mis-seeded field-wide, and pre-gun pings were being drawn as race progress.
    • Escaped feed-supplied boat names at four tooltip sinks (a cross-site-scripting fix), hardened magic-link sign-in per a security audit, and added WordPress-free GitHub Actions checks: PHP lint, template lint and the MR340 regression suite.
    and 2 more
    46commits
  21. W3310 Aug

    Bow & Bridge

    Bow & Bridge goes live as a sourced reference site

    • Stood up the site: maker records where every claim carries its own citation, an instrument register, source pages, a citation block on each record, and llms.txt and robots.txt so crawlers and AI tools read it correctly.
    • Read the complete 1916 American directory of makers from page images (412 entries) and published it as evidence rather than biography, each entry linked to its printed page.
    • Ran an adversarial review of the published records (3 critical, 12 major, 21 minor findings) and re-read 79 published claims against their sources; four unsupported claims were corrected and five withdrawn, with the corrections filed on the site.
    and 3 more
    186commits
  22. W323 Aug

    Rocheport Times

    The 2026 race results, frozen and replayable

    • Gave each race year its own address under /mr340/ with a rewrite rule, since WordPress pages cannot have purely numeric slugs.
    • Froze the real 2026 results and wired the 2026 replay onto the year page; the every-boat results table pages 10 at a time.
    • Polished the race hub: year cards over a hub map, replay badges, and a rail call-to-action on the homepage.
    and 1 more
    12commits
  23. W3127 Jul

    Rocheport Times

    Race day: 395 boats wrongly marked out, fixed live

    • Snapped live positions to the river channel instead of raw GPS, added dead-reckoning so boats glide between feed polls instead of freezing and teleporting, and fixed the OUT label that had marked about 395 racing boats as quit.
    • Moved feed validation to the server proxy (bad tracker data is flagged once, at the door) and wrote regression fixtures for every race-day defect, pinned to real feed data.
    • Built the phone view for people standing at a ramp: scrollable live standings, a watch-a-stop screen with approaching boats plotted upstream and honest ETAs, and stale trackers labelled rather than guessed.
    and 3 more
    208commits
  24. W3020 Jul

    Rocheport Times

    Building the MR340 race tracker in seven days

    • Reverse-engineered the race's public tracker feed and built a tracker module: leaderboard and checkpoint watch from a 3-minute server-side cache with stale fallback, pinned by 27 fixture checks.
    • Moved the replay map from Leaflet to MapLibre GL: vector basemap with no API key, optional 3D terrain and buildings, a satellite toggle, a cinematic tour that chases a chosen boat, and checkpoints placed at real ramp coordinates.
    • Rebuilt the 2024 field from 405 real GPS tracks, snapped to the official river-channel line from a 2012 survey, and lazy-loaded it so the page shrank from 1.45 MB to 360 KB.
    and 3 more
    374commits
  25. W2913 Jul

    Rocheport Times

    Members, invites, and a newsroom the AI reaches only through MCP

    • Built the member layer: a Neighbor role gated on bespoke capabilities instead of generic WordPress ones, editor-issued and member-sent invites with a per-member cap, an onboarding tour, and a Community admin menu (Neighbors, Approvals, Invites, Activity, Alerts).
    • Shipped the newsroom MCP server: public read tools, an editorial tier behind OAuth or an application password, a draft-only create_draft tool, and lead tools with a code-enforced trust floor. The daily drafting, rundown and lead routines now go through it; SSH access was retired.
    • Turned on post-moderation by default: wall posts, listings and suggestions hold for review, with a stop-word filter and an optional tone check.
    and 3 more
    156commits
  26. W286 Jul

    Rocheport Times

    Rocheport Times relaunches on one platform plugin

    • Consolidated all custom code into one plugin with 30 modules and a loader that guards against collisions; the mobile app's API surface was kept frozen so nothing on the app side had to change.
    • Fixed four security bugs in the existing community code before launch: an account takeover through social login that trusted an unverified email, a forced-friendship request, an unsanitized public wall (stored XSS), and Microsoft sign-in trusting a user-editable email field.
    • Built the Editorial Desk: a review queue in wp-admin for AI-drafted articles with threaded change requests, an automatic link checker, and approve or request-changes actions on the post itself. Nothing publishes without a person.
    and 3 more
    459commits
  27. W1430 Mar

    Purfle

    Building the loop that refuses to load a tampered agent

    • Wrote the manifest identity spec and the trust loop around it: JSON Schema, RFC 0001 on JWS/ES256, a ManifestLoader, and live signature verification against the Azure key registry, complete with tamper detection.
    • Built the scheduler and sandbox that enforce what a manifest declares: five trigger types (interval, cron, startup, window, event), a sandbox fix that blocks and logs an out-of-bounds write, crash isolation between agents, and backoff on LLM timeouts and 429s.
    • Wired five LLM adapters, Anthropic, Gemini, OpenClaw, Ollama and a built-in tool executor, each reporting token usage, then tested that usage all the way from the adapter through the agent runner into the run log.
    and 3 more
    128commits
  28. W1323 Mar

    Purfle

    Scaffolding the manifest schema and the CLI

    • Wired Ajv into purfle/core and aligned the root JSON Schema with the spec, so a manifest with a missing or malformed field fails validation before anything tries to load it.
    • Wrote the CLI commands, fixed module resolution in purfle/core, then added CLI tests that check init scaffolding validates cleanly against Ajv.
    • Added the first tests for identity and schema validation in purfle/core, ahead of any code that would depend on them passing.
    and 2 more
    8commits
  29. 20253 weeks logged38
  30. W5115 Dec

    Earlier work

    Podcasts, YouTube, and browsing by resource type

    • Added podcast and YouTube sources to the resource model.
    • Expanded public resource browsing with search and filtering by type.
    • Last commits to the C# version; the project resumed in August 2026 as a WordPress site with the same goal.
    3commits
  31. W508 Dec

    Earlier work

    Scrapers, Archive.org, and a test suite

    • Built the scraping pipeline: sitemap-driven crawling, normalization and background job processing, plus EPUB import.
    • Added a page-quality analysis system so low-value scraped pages are scored before they clutter the catalogue.
    • Unified books, scraped pages and Archive.org items into one resources model with quality analytics.
    and 3 more
    13commits
  32. W491 Dec

    Earlier work

    The first Bow & Bridge: a .NET book-and-luthier catalogue

    • Created the solution with a single Entity Framework context holding Book and Luthier entities, database-generated IDs, and a seed-and-reset script for a repeatable local database.
    • Added chapters and book images with a tagging system, image tags, and dialogs for editing them.
    • Split data access from business logic into separate service layers, with better loading and logging feedback.
    and 2 more
    22commits
  33. 20231 week logged1
  34. W3024 Jul

    Rocheport Times

    A rough first try at a Rocheport Times app

    • A rough .NET MAUI scaffold, one page and a Post class: the first sketch of a Rocheport Times mobile app
    1commits