moin!
this is Havu [they/dey/neutral]!
not familiar with neopronouns? see my
pronouns page
for examples.
for an overview of what i do / have done, see my curriculum vitae page.
see the
public files page
for a document file version of my curriculum vitae.
i would also heavily recommend taking a poke around my
personal code forge
as well;
that includes a bunch of additional information!
especially the
fairly elaborate Vue.js project
whose deployment has since broken of course.
but the development process should be more intriguing than the end result anyway, right?
there's also a
Full Stack Open
rewrite in Vue.js
in there :3
in addition to the original
Full Stack Open project written in React / Node.js but that's a bit scattered.
i'll try to dig through the archives for that Eventually. maybe one day.
Projects
Statistics dashboard application from scratch [Vue.js, Node.js, devops+]
A collectionary view of statistics dashboards via amazon quicksight [front && back end]
The most involved project I had while working there.Overview of the project:
- vanillaforums roles
- needed to add a new "default type" onto the vanillaforums codebase
- implemented as a patch atop the existing .php files
- extension of the `Type` enum within the database directly
- quicksight reader users
- database trigger on creation of a new user with the aforementioned reporting Type
- implemented as a Python module; creates a reader user using the details above
- part of a larger sync worker application [I don't speak a ton of Python myself]
{elastic,open}search users index- query for what kind of dashboards the currently logged-in user has access to
- Mostly a dumb node.js backend that just made the aforementioned endpoint calls
- amazon web services software development kit for JS [version 2, I think?]
- mariadb queries somewhat directly? like, no ORM or anything
- Front end built via Vue.js
- Relatively simple view with a collapsable sidebar [sort && search && such]
- Individual dashboard views embedded as iframe-like structures
The vanillaforums side of it was especially fun, since we pretty much used entirely unrelated functionality to make it work. That is, default types for user roles were an entirely different topic, but we realized we could use that for our purposes so I ended up hacking on it a bit.
Getting to learn a ton more Python just by doing was really enjoyable too. Most of the Vue.js and Node.js stuff was kind of routine at that point, so i definitely liked having a chance to expand my knowledge throughout those ~4 years.
Sure, the work itself wasn't necessarily that interesting, but taking the whole thing as a learning experience was quite nice overall.
Tweaks && extensions && modifications to existing applications [Python, SQL, GNU/Linux, bash, PHP, Node.js]
Kitchen sink development!
- sync worker mentioned earlier [just one new Python module for the reader user creation]
- a batch run Python script thingy for one specific customer
- get order data from their wordpressthingy and do forums && survey stuff with them - automations
- raw HTML && vanillaJS frontend
- overall user experience && qualityoflife improvements
- transformed generic divisors into semantic elements wherever feasible
- other tweaks such as table readability and performance improvements to backend queries
- implemented a much more performant "quick results" thing
-previously, the user could only request for all the results.
I made it possible to just return the count of matched results
- also made it a separate option to get unique [duplicate-dropped] results instead
- why? because the {elastic,open}search indices didn't really have a given format - made it possible to merely add tokens/invitations to surveys, without actual email sends
- fixed the rules related to the order portal of the specific customer mentioned above
- automated{week,month}ly survey sends for training programmes
- overall user experience && qualityoflife improvements
- Python "proxy" back end [running on each customer]
- implemented an import tool that could transform comma-separated values into indices
- also implemented proper mapping tweaks for the resulting{elastic,open}search index - most of the userinterfacey tweaks mentioned above also warranted for tweaks here
- per-customer modifications of what data to show
- data protection regulations; whether to show email addresses or not, for instance
- implemented an import tool that could transform comma-separated values into indices
- the actual Python back end [running on one specific elastic cloud compute instance]
- migration from elasticsearch to opensearch and modifications required for that to work
- opensearch-based logger tools in favour of local manual log files and/or journalctl
- same as above: most tweaks to any of the three tools did require changes here too
- raw HTML && vanillaJS frontend
I can't really remember if I made any actual new functionalities onto that platform backend, but certainly did implement plenty of new stuff onto other semirelated applications, ones that'd warrant changes onto said platform backend too.
New tests, modifications to existing tests, invisible upkeep work that keeps stuff running, that sort of thing.
So I do have a fair bit of exposure to such Node.js backends at a professional level too, and wouldn't mind working fullstackishly on such things on a daily basis, even though I'd certainly prefer a bit more of a frontendy approach, most of the time anyway. Especially if that means I get to fix modern web frontends' accessibility shortcomings =)
Also, just to properly stress this point again: I am by no means fluent in Python at all
- but! I'd say the same thing about bash, and PHP, and a bunch of other things too;
what'd be most important for you to take away from this, I think, is that I made it work :>
Really simple and affectionately stupid cookie banner [React]
A relatively simple cookie banner, built in React as part of a navigation bar
- Dismissable with Escape or by clicking on the X icon at the top
- Will show up on the next page load if neither option explicitly chosen -
Strictly necessary and Accept all implemented as identically styled options
- No shady marketing practices or dark patterns
- Former option mentioned first - Saves a cookie to merely tell that the banner has been interacted with
- The selected option and its timestamp are stored onto an{elastic,open}search index
- For bookkeeping purposes only; if I recall correctly, the options were calledbasicandanalytics - The company used to use google analytics before, but eventually moved to Plausible
- Before the migration, the script had to be dynamically loaded until explicit consent
- On page load, the code'd check for the presence of the aforementioned cookie
- If the
analyticsoption had been consented to, the script would be loaded - In case of the
basicoption, nothing else'd run
- Used as an indicator to tell that the user had interacted with the consent modal
- Strictly necessary in this context pretty much just meant log-in session cookies
- If the
The cookie banner was designed to be as simple and get-out-of-your-way as possible;
something I thoroughly enjoyed working on, despite being a bit overblown due to react,
but it did still mostly do its job despite the somewhat-misaligned tools for the job.
That is, it really could've been a raw HTML static thingy too.
I had had no prior experience of elasticsearch, so it took a while to figure out the endpoint calls, but it turned out to be relatively easy to understand to me, despite some of its wonky syntax, and it did serve as a bit of an introduction to more elaborate backend modifications later on too:
There's this huge platform backend monolith that handles all the auth{entic,oriz}ation,
all the {elastic,open}search requests, cookies, amazon web services requests,
vanillaforums and limesurvey integrations, and whathaveyou.
It's written in Node.js so it was quite familiar-looking to me despite the overblown objectorientation,
as in, everything was sugarcoated as “classes” despite JS not even having classes,
but I digress
[I just happen to have mostly bad experiences of objectorientation with java]
Simple email template editor [Vue.js]
Implementation of a basic text editor to accompany a more advanced email template editor
Using CKEditor, to extend an existing Vue.js administration user interface- Previously, the only option was ace editor; wholly unsuitable for regular users
The mail template editor is part of a larger administration user interface.
It used to not really be keyboardnavigable at all, so at first I had to tweak the elements a bit.
I made the card genericdivisorelements behave more button-like, as in,
added tabindices and key{up,down} handlers to them.
And poked at the styles just a bit.
To keep them indistinguishable from how they used to be, for pointerdevice users,
while simultaneously adding the keyboard support it should've had to begin with.
So exactly the kind of accessibility work i'd prefer to do much more of in the future.
The email template list view also had a bunch of race conditions and such;
if the user tried to use both the search and filter functionalities, the list'd get out of sync,
so I tweaked at it but have unfortunately forgotten most of the details there.
I do remember other keyboardrelated fixes there too, though:
the context menu was also a generic divisor, so I made that into a dropdownish list instead,
with buttonlike elements interactable with the keyboard,
and added Escape handlers for them.
The email template editor view itself had some similar shortcomings too,
like having to fix the template type dropdowns to actually be select-like dropdown elements instead,
but the bigger topic was that new basic mode editor:
ace editor, the huge monolithic one, had at least two key issues I can immediately think of:
- steals tab key presses with no Escape handlers [tab was used for indentation instead]
- users ofGecko-like browsers [like me] can escape it usingF6alright though
- unfortunately not all users out there know of all the issues with the chromium project - cursor blink with no way to toggle it off [accessibility nightmare for epilepsy && ADHD]
- its main focus was to be a less userhostile tool [and, judging from feedback, did its job]
- made it impossible for the user to accidentally delete important parts of it
- survey links/buttons, automated footer including unsubscription footer && such - positive side effects: inherently more accessible && lighterweight
Overview [süßadmin, devops, personal life, ideology && whatnot]
Most of the details within this Projects section were dug out from a couple elaborate job applications from around a year back [this disclaimer was written on ],
and i've upcleant them a bit to hopefully be a bit more parseable.
Here's a couple more loose words about what i've been doing since leaving that job early last year,
as well as some more details of stuff i didn't mention yet about the prior work.
- Databases
- Relational databases [mariadb, PostgreSQL]
- noSQL [MongoDB, redis if that counts, i guess elasticsearch and opensearch too]
- Systems administration
- servers [Debian GNU/Linux, ubuntu]
- maintenance
- upgrades
- scripts [bash, Python,]
- cron
- systemd
Most recently, I've worked as a junior software developer,
from month number 8 of 2021 until month number 2 [exclusive] of 2025.
Said job ended on request of the author, due to a variety of details;
most of those details are personal/mental/physiological/cultural,
but the technical side of it would mostly boil down to this:
I am not a devops engineer, and I do not wish to work with junk such as amazon web services.
Things I enjoy most are related to user interfaces, especially in the context of the web,
and I do secondarily like backendy stuff and databases and systemsadministration too,
but I do not like docker or kubernetes or other such plumbing jobs,
and I needed a break from it.
- tweaks to the default web front end user interface of the
akkomainstance software
- see akkoma-fe - setup of said instance using Apache server, something I had no previous experience of
- scattered dotfiles and maintenance scripts and such also available on codeberg
- Debian GNU/Linux and its configuration
- currently running on the virtual private server as well as both personal {desk,lap}top
- same as above [see dotfiles]
- other services running on that same virtual private server
- a tweaked version of bloat, a web client for the fediverse
-or, well, it was running at the time of writing, but has since been disabled since i removed golang altogether thanks to running out of disk space :D - another slightly-less tweaked web client for fedi [enafore]
- a really dumb [/positive] setup for public files
- said site also includes a super-formal-and-professional-looking curriculum vitae
- a tweaked version of bloat, a web client for the fediverse
- University of Turku, 2015 to [technically] 2023, computer science && electrical engineering
- A bunch of open online courses, some of which can be inspected on Codeberg
- High school [gymnasium, abitur] in $HOMETOWN, including 13 ECTS at the open university
- Mostly unrelated computertouchery such as console exploits, cheat engines, custom firmware
- Migration from ubuntu 18.04 servers onto 20.04 and eventually 22.04 too
- Make a clone of the amazon machine image thingy
- Update the system and fix all the packages and such that broke compatibility
- Move the previous disk over onto the new one
- Take the old instance down
- Database migration from a relatively incompatible version of a mariadb-ish cluster
- Details a bit hazy, but it was mostly in the context of amazon web services as well - containerization of a bunch of things [this is the last thing I worked on]
- making the entire community platform compatible with environmentagnosticism, essentially
- no reliance on the local file system
- migration of a bunch of stuff from file-based configuration onto databases
- environment variable tweakery
- “simple” storage service staticsitehostery
- its interroperation alongside backend technology running via docker
Briefly on the topic of the personal projects:
I don't use a mouse,
and a proper explanation of why that is would probably require too much elaboration,
so the context of most of these tweaks is this didn't work for me, so I fixed it;
most such fixes are available at my codeberg account
and some of them are also backed up at the queer git
I started the enbyhacks fediverse instance project for a couple reasons:
- wanting to try out how selfhostery works
- constraints of the previous instance I was on
-mastodon, character counts, lacking web client [list nonexhaustive], - moderation decisions [I am my own moderator now]
I still treat it as mostly an ephemeral thing that might just blow up at any point, but thus far it's looking like something I'll definitely want to keep around, for the foreseeable future anyway.
Meow.