Crafter Hours Development Log

2025

January

Wednesday, January 8 2025

Stream RecordingProject Code

  • Set up basic HTTP server with Guile Fibers
  • Established basic route handlers
  • Basic page rendering with SXML
  • Created record type for the package model

Monday, January 13 2025

Stream RecordingProject Code

  • Created a basic sqlite schema for the package model
  • Implemented basic CRUD operations for package
  • Split out package model into its own module
  • Updated the package list and detail pages to load from the database
  • Attempted to set up a coop REPL server to no avail

Wednesday, January 15 2025

Stream RecordingProject Code

  • Figure out how ELPA repositories expose their package information
  • Download the archive-contents file and process the contents, determine structure
  • Insert initial package details into our sqlite database
  • Update package details page to display version and description

Monday, January 20 2025

Stream RecordingProject Code

  • Fleshed out data model to add package-author and package-source
  • Revamped SQL schemas to add tables for package_author, package_authors (relation table), and package_source
  • Updated insert-package! procedure to update package and related tables with information from package metadata
  • Attempted to update code to import package archives but failed due to technicalities

Wednesday, January 22 2025

Stream RecordingProject Code

  • Integrated trev’s fixes for syncing package archives
  • Split out database population into a Scheme script sync-archives
  • Split out server startup to a script start-server
  • Split server handling into the (site server) module
  • Split current view templating into (site views *) modules
  • Established basic (site db) module to abstract database handling
  • Integrated existing scss->css code to generate a cached stylesheet for all pages

Monday, January 27 2025

Stream RecordingProject Code

  • Set up a REPL-driven workflow for live UI development
  • Add routes and views to show all keywords and packages by keyword
  • Add SQL queries for keyword IDs by name and packages by keyword
  • Improve the site CSS somewhat to make it more readable

Wednesday, January 29 2025

Stream RecordingProject Code

  • Created basic routes, views, and schema for the user type
  • Create route and form for user login (no cookies yet)
  • Created the schema for package tips

Wednesday, February 5 2025

Stream RecordingProject Code

  • Draft out basic package tip authoring experience with Datastar (no users, no SQL)
  • Write a basic Datastar SSE library

Monday, February 10 2025

Stream RecordingProject Code

  • Implemented a full login/logout flow with Datastar
  • Used jwt tokens to store session details
  • Added an authenticated wrapper for abstracting session checks in handlers

Wednesday, February 12 2025

Stream Recording (Part 2) ⋅ Project Code

  • Finished tip authoring experience with DB interaction
  • Added link to tip author profile
  • Added initial Markdown formatting for tip text
  • Added basic tip voting (not backed by DB yet)

Monday, February 17 2025

Stream RecordingProject Code

  • Created a DB schema update framework
  • Created a table to store applied migrations
  • Wrote unit tests to verify that the framework works
  • Moved current table initialization queries to first migration

Wednesday, February 19 2025

Stream RecordingProject Code

  • Prepared the site for deployment with Guix
  • Packaged the current site code in Guix
  • Set up a basic server configuration
  • Set up a Shepherd service to run the Guile app
  • Set up an nginx reverse proxy for hosting the site
  • Set up a place to host the database file (under /var/db)

Monday, February 24 2025

Stream RecordingProject Code

  • Finished password salting algoritm
  • Discussed how to handle session token secret, deferred until certbot is set up
  • Figured out stable package ID strategy
  • Designed the first-pass package sync/update strategy (with disambiguation)

Wednesday, February 26 2025

Stream RecordingProject Code

  • Deployed a staging build of the site to a VPS
  • Set up certbot to auto-provision a certificate for HTTPS
  • Set up the new server-configurations repository

Wednesday, March 5 2025

Stream RecordingProject CodeServer Configuration

  • Converted emacspackages.com repo into a Guix channel
  • Updated server-configurations repository to use the new channel
  • Ensured that the database is working after running sync-archives.scm manually
  • Created a one-shot Shepherd service that runs sync-archives.scm to populate the DB
  • Cleaned the manual GUILE_LOAD_PATH manipulation in script files

Monday, March 10 2025

Stream RecordingProject CodeServer Configuration

  • Figured out why the site is down
  • Made sure initial data sync is working correctly
  • Made sure there are no lingering issues from the channel conversion

Monday, March 17 2025

Stream RecordingProject Code

  • Implemented the user registration page
  • Created a basic framework for forms with validation

Wednesday, March 19 2025

  • Links
  • Progress
    • Finished up validation on user registration page
    • Prevented sync of archives if DB already exists
    • Create guile-webframe repo to host reusable web library code (css and datastar for now)
    • Packaged the libraries with Guix and used them in the project for dev and deployment

Next Time

  • Move over more library code to guile-webframe
    • form validation (or larger UI framework?)
    • database migration
    • logger
    • site backend utils (session, password, etc)
  • Delete the existing database one last time
  • Provide an interface for a user to pick which packages they use
  • Ensure tip creation requests are being authenticated
  • Ensure that DB migrations are being applied by sync-archives with existing DB

Soon

  • Switch to PostgreSQL
  • Implement package repo data sync/merge?

Backlog

  • Add migrations for:
    • Tip votes
    • Vote count per tip
    • Add a link to user’s Emacs config repo in profile
    • Adding the “I use this” mapping for packages
  • Add author details page to list which packages they wrote/maintained
  • Implement proper session expiration
  • Load session token secret from an environment variable, etc
  • Improve the internal API for generating reponses with page bodies
  • Flesh out CSS for all pages
  • Finish porting ELPA, NonGNU ELPA, and MELPA package details into our database
  • Search for packages by name on the site
  • Improve package details page to display all information
  • Package listing page should use a table with columns
  • Define the strategy for periodically updating package details (upserts?)
  • Store the last updated time for a package record
  • Make sure to log the source of the package (elpa, nongnu-elpa, melpa, melpa-stable)
  • Deduplicate package information if they share the same name?
  • Sort package listing alphabetically? (query parameter?)
  • Need a way to represent package dependencies across package sources but tie them together at the higher level of packages
  • Consider changing ID strategy for packages to not use an auto-incremented, numeric ID
Subscribe to the System Crafters Newsletter!
Stay up to date with the latest System Crafters news and updates! Read the Newsletter page for more information.
Name (optional)
Email Address