My development journal

Athran Zuhail cengallut@gmail.com Github

Daddy Kassy: Personal budgeting app

For tracking and analyzing simple personal income, expense, and investment. The target audience is an average working adult.

Github  |  App
Screenshot of the personal budgeting app.

A standalone webapp, it requires no installation, just go the URL and start using it immediately. It is hosted on Github Pages. The first version of this app was written in VanillaJS + jQuery. Then rewritten in React. Then rewritten in Preact without JSX. The charts are drawn by ChartJS.

I previously tracked my budgets in an Excel spreadsheet. The Excel file inevitably grew too big, so I remade it into a webapp. This webapp offers a snappy interface to record your transactions, and provide some chart visualizations for analysis.

The key differentiator is the addition of the Obligations© table, which I believe helps keep track some of the more complicated financial structure that an average working adult has to deal with, those pertaining to investments and loans.

UUID Base8192 Hangul encoding

Visually compact UUID minification. Great for URL ids.

Github  |  App
Screenshot of the Hangul UUID app.

So you want to use UUID to uniquely identify a resource, which can be accessed over REST HTTP. Reasonable. But UUID is really long, and using it in the URI makes for a clumsy-looking address bar. It is 128 bit of information, and the standard representation is base16 hexadecimal plus 4 dashes, for a total of 36 characters.

Usually people shorten UUID by encoding it in base64 into a 22 character string. But I tHiNk iT lOoKs uGlY, and 22 characters is still fairly long. To shorten it further, we need a MUCH bigger character set (basically doubling the character set size for every encoded single character reduction), but base64 is already pushing the limits of the latin alphabet as it is.

What if we look to the east? The character-based writing systems of east Asia makes for a large library of ready-made and fairly well-supported unicode character set. There are several to choose from, but I chose hangul for its uniformly squarish, clean, and modern look. Hangul has ~11,000 characters, of which I used the first 8192 (213) characters for a base8192 encoding of UUID in TEN characters.

30cca817-47c5-4f12-9391-700b5f81a321
MMyoF0fFTxKTkQAAcAtfgQ

꼌앐뇑쨪묒빲뇀놯쐚꼡

While in terms of character count, the base8192 hangul encoding is less than half of base64's 22 characters, in terms of visual width it is only slightly shorter since each hangul character is rendered almost twice as wide as most latin characters. Regardless, I personally think the hangul-encoded UUID presents as a clean and compact URL section in the browser address bar, almost like a barcode

I apologize in advance to any Korean speakers who may experience discomfort as you instinctly try to read the hangul

Can it go shorter? Chinese theoretically has enough characters to do base65536 (216) encoding into an 8-character string. But that scheme has several drawbacks, so I am content with just 8192.

Malay Lexeme synthesizer

Word and text generator for Malayic languages. Can be used as Lorem Ipsum and to name stuff.

Github  |  App
Screenshot of the language synthesizer app.

The phonology and syllabic structure of Malay lays down the base set of possible lexemes. Phonotactic rules filter out non-conformant lexemes.

Chord progression synthesizer

Synthesize a chord progression based on some basic harmony rules

Github  |  App
Screenshot of the chord progression synthesizer app.

Generate a random seed of SATB chord, then filter based on jump size, line crossing, chord harmony, and key harmony

Design system showcase

A basic design system based on two colors and a range of transparent shades.

Github  |  App
Screenshot of the design system showcase showing the forms page.

Color palette designer

Generate a range of common colors to design with. outputs css variables.

Github  |  App
Screenshot of the palette designer app.

Written in standalone Preact, no JSX, just function calls.

RPN calculator

Github  |  App
Screenshot of the calculator app.

Bootstrapped with the vite preact-ts template.

React hook collection

React devs collect hooks like bower birds collect colourful trash

useCascade - short-circuit the rendering pass, but be careful to not call another component's setState.
useEvent - this mostly of interest with regards to the typing. Better wait for the official hook.
useUpdate - to make a submit button gray out while the async call it fired off is pending.
useDebounce - debounce a fast changing input.
useCircularIndex - for indexing into a rotating thing, like a carousel.

Standalone Preact template

Standalone Preact allows you to setup a small and simple interactive app very easily on any webpage.

Github  |  App
The use case include when you want to host the app on free static hosts like Github Pages.
© Athran Zuhail 2023 all rights reserved