Devlog 1

You're viewing a Gemini article on the web

It's much better to view it on Gemini!

I've started work on a new project. Mostly, this is just an attempt to actually build something from scratch. Everything I've worked on previously has been either something very small like a script or an established codebase that I've helped out with. I thought it was probably time to see if I can work out a project end-to-end.

As a bit of background, I'm currently unemployed. My ex-employer decided in their infinite wisdom that a product team wasn't a necessary part of a software company, and so fired us to instead piss around with ChatGPT. As a technical writer, the job market in Germany is pretty bleak. Many companies have never bothered hiring a technical writer, many more demand fluency in both German and English, and the rest seem to think that ChatGPT is good enough™ for their needs.

So I decided to go back to programming and see if I can improve my skills enough to find work. The market isn't much better for programmers (well, junior/mid-level programmers), but it is slightly better.

The project

I mulled over what I want to try and do for a while. I know I want to build a self-hosted product that enables users to replace some centralized service, but every idea I came up with was already done far better than I could hope to do it. In the end I decided that shouldn't be a blocker. After all, I'm trying to learn from this experience, not to create a killer app.

I decided to try and build something analogous to Letterboxd but with a slight twist: instead of lists, the user instead sorts their viewing intentions in columns and interacts with them in Kanban boards. The project is called "eigakanban", a portmanteau of "eigakan" (movie theater) and "kanban" (signboard).

Today's work

I actually started the project a couple of days ago, at least the planning phase. I created my initial commit yesterday and have continued today.

The last couple of days has mostly consisted of choosing my tools and learning them. I decided to challenge myself by picking a language I'm less familiar with (Go) and avoiding the use of an ORM, which has usually been my safety net. For the purposes of this project, the backend will be written using:

  • Go
  • sqlc and goose
  • Postgres

I'm planning to write the frontend using Svelte (another tool I'm less familiar with) but that's a ways away from now.

My first job after reading through the sqlc and goose docs was to get a first version of the database up-and-running. I opened some issues to guide my work and created a postgres container. I proceeded to use goose to create the initial table structure. It's pretty simple right now. I have the initial layout for:

  • Users
  • Boards
  • Items
  • Columns
  • Column/item pairings
  • Reviews

I then proceeded to write the basic CRUD queries for the operations I'm going to perform on each of these entities. Initially I went very simple, but I soon realized that I needed to lean more on SQL than I previously thought. If the plan is to have a drag-and-drop interface for the cards and enable user to move columns left and right, my SQL queries needed to get more advanced. In theory I could keep my queries quite simple and then chain them together in the Go handler code, but I don't think this would scale well. SQL is ruthlessly efficient, so I thought it best to rely on it where possible.

Right now I have code generation working and what I think are functional operations for moving columns/updating neighbors and inserting items/updating neighbors. This should be sufficient for the very basic prototype implementation.

Next steps

The next thing I need to do is create the actual endpoints that call these functions to test that my logic works as expected. I'm not aiming to create a kanban-like interface just yet, that's probably the last thing I'll do. All I want is to create CRUD endpoints for each of the different entities and maybe deploy a test page that can call these endpoints and print the results of each operation.

Once I'm done with that, I'll probably consolidate all my migration files back down to one so there isn't as much clutter. I don't know if that's considered best practice, but I'd prefer to have only one migration for the first "release".

I also want to use this opportunity to set up some basic CI/CD to automate some of the more annoying steps in the process. My friend has offered to help out with this since he's something of a CI wizard (thanks, Georg).

Is this actually going to be released/usable?

Almost certainly not. My life is in a bit of turmoil at the moment due to my dire job prospects and the impact it has on my immigration status. This is mostly a distraction and an opportunity to learn something new. I've been writing far too much Python recently and desperately needed a break to use a language I don't hate.

If it is ever released, it will be freely available. The source code is on Codeberg if you are interested, but please don't open any feature requests or issues. I'm not at that stage yet.

eigakanban repo on Codeberg

Tell me what you think.