<feed xmlns='http://www.w3.org/2005/Atom'>
<title>finserv, branch main</title>
<subtitle>Personal finances server</subtitle>
<id>https://cgit.xengineering.eu/finserv/atom</id>
<link rel='self' href='https://cgit.xengineering.eu/finserv/atom'/>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/'/>
<updated>2026-06-05T19:01:52Z</updated>
<entry>
<title>Add global db variable and open connection to it</title>
<updated>2026-06-05T19:01:52Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-06-05T18:59:27Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=3395bc1cd32698897385596022e0c855765b48f2'/>
<id>urn:sha1:3395bc1cd32698897385596022e0c855765b48f2</id>
<content type='text'>
This allows any handler to access the database via a global variable.
The connection is closed when the run function finishes.
</content>
</entry>
<entry>
<title>Add TestTransaction</title>
<updated>2026-06-02T18:27:05Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-06-02T18:27:05Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=3ad3565c64ed1ce692c0509d8fe5a7530f8fb7e3'/>
<id>urn:sha1:3ad3565c64ed1ce692c0509d8fe5a7530f8fb7e3</id>
<content type='text'>
This makes sure the assumption is correct that everything inside a
transaction is rolled back if the transaction fails.
</content>
</entry>
<entry>
<title>Add TestUserVersion</title>
<updated>2026-06-02T18:20:17Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-06-02T18:20:17Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=a3009e165c4cdbf94eb23a071d5e6c39425539e8'/>
<id>urn:sha1:a3009e165c4cdbf94eb23a071d5e6c39425539e8</id>
<content type='text'>
This is partially redundant to MigrateToLatest. Nevertheless a layered
testing approach is useful to detect low-level problems in test
functions which are simple.
</content>
</entry>
<entry>
<title>Name tests like functions to test</title>
<updated>2026-06-02T18:12:53Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-06-02T18:12:53Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=975349b50e3d2c76564fef686a2a33b01212b6d3'/>
<id>urn:sha1:975349b50e3d2c76564fef686a2a33b01212b6d3</id>
<content type='text'>
This enforces a similar structure of test functions named `TestFooBar`
if they test the function `FooBar`.
</content>
</entry>
<entry>
<title>Add MigrateToLatest</title>
<updated>2026-06-02T17:52:18Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-06-02T17:52:18Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=a750aa4ecf7ecab519b53d7f3ac082425ba50686'/>
<id>urn:sha1:a750aa4ecf7ecab519b53d7f3ac082425ba50686</id>
<content type='text'>
This function will be used most by the production software to update
the database schema to the latest known version.
</content>
</entry>
<entry>
<title>Remove success logging in tests</title>
<updated>2026-06-02T17:40:55Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-06-02T17:40:55Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=bd1ead99fd53ad8c3c016b59d67f5bf58ade5095'/>
<id>urn:sha1:bd1ead99fd53ad8c3c016b59d67f5bf58ade5095</id>
<content type='text'>
In case the test succeeds it is not required to log anything. This only
adds noise to the output.
</content>
</entry>
<entry>
<title>Add UserVersion()</title>
<updated>2026-05-31T19:37:16Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-31T19:34:44Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=29ae857b5ca13fa12f1d07d4a30597ff9ce28767'/>
<id>urn:sha1:29ae857b5ca13fa12f1d07d4a30597ff9ce28767</id>
<content type='text'>
This function gets the user_version SQLite3 field describing which
migration was the last executed one.

A test checking this before applying any migrations and after each
migration is included.
</content>
</entry>
<entry>
<title>Add migration execution</title>
<updated>2026-05-31T19:37:13Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-31T19:20:48Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=efb324070827bd1fe713b93f80c601551d246579'/>
<id>urn:sha1:efb324070827bd1fe713b93f80c601551d246579</id>
<content type='text'>
This adds the execution of the embedded migrations and adds a suitable
unit test.
</content>
</entry>
<entry>
<title>Add migration reading</title>
<updated>2026-05-31T18:48:51Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-31T16:13:15Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=4cb6a5952f341741ef2728fb39acb7f19de61ba9'/>
<id>urn:sha1:4cb6a5952f341741ef2728fb39acb7f19de61ba9</id>
<content type='text'>
This prepares the infrastructure to place migration SQL code in the
source repository with paths formatted as `sql/migrations/%04d.sqlite3`.
The numbers need to be counting up from 1.

They are embedded with Go's embed package and are parsed into a slice of
strings where the migration number minus one is the slice index and the
value is the migrations file as string.

This makes handling of migrations in code as easy as possible.

This commit adds also tests for this functionality.
</content>
</entry>
<entry>
<title>Add github.com/mattn/go-sqlite3</title>
<updated>2026-05-31T15:30:01Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-28T18:32:36Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=6cdf8bb597443be880cd5a9cb6f3ac953749811a'/>
<id>urn:sha1:6cdf8bb597443be880cd5a9cb6f3ac953749811a</id>
<content type='text'>
This is the SQLite3 backend for the database/sql standard library
package which should be used to store persistent data.
</content>
</entry>
<entry>
<title>frontend: simple.css: Use copy of upstream code</title>
<updated>2026-05-29T14:25:02Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-28T19:05:00Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=fba9bcfc9a422dd3020b5efc2392ddfd71231560'/>
<id>urn:sha1:fba9bcfc9a422dd3020b5efc2392ddfd71231560</id>
<content type='text'>
This switches from the use of a Git submodule to a locally committed
copy of the needed file and it's license.

The reason is that `hugo server` needs the CSS file in the same relative
path as `hugo build` which is run in the build tree.

But this is not possible because Meson cannot copy it to the
`build/frontend/simple.css` folder without a `meson.build` in
`source/frontend/simple.css`.

This together with the limitation that symbolic links are not supported
by Hugo makes life pretty difficult. Thus a local copy of simple.css and
an adjacent `meson.build` file is chosen.
</content>
</entry>
<entry>
<title>VERSION.txt: Add `-dev` suffix</title>
<updated>2026-05-28T19:08:07Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-28T19:08:07Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=d2e35b764adbc152190f1815d5ba29dd542fc387'/>
<id>urn:sha1:d2e35b764adbc152190f1815d5ba29dd542fc387</id>
<content type='text'>
This makes clear this is not a release.
</content>
</entry>
<entry>
<title>Release version 0.1.0</title>
<updated>2026-05-24T09:48:38Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T09:48:38Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=d7d46df8c4d019be48f7aa0790aa8a2349e45e20'/>
<id>urn:sha1:d7d46df8c4d019be48f7aa0790aa8a2349e45e20</id>
<content type='text'>
This release allows to get started with packaging and deployment in a
very early stage.

All features can be added incrementally.
</content>
</entry>
<entry>
<title>VERSION.txt: Remove `v` prefix</title>
<updated>2026-05-24T09:46:01Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T09:46:01Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=75cf3388c095b7187dd885500e17e0880b270a79'/>
<id>urn:sha1:75cf3388c095b7187dd885500e17e0880b270a79</id>
<content type='text'>
The content of this file should contain the version string of the
software. There is no need to label it with a prefix `v` since this is
redundant.
</content>
</entry>
<entry>
<title>Add missing `.` to log messages</title>
<updated>2026-05-24T09:44:01Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T09:43:28Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=2b37d7902daa6e2a9c2284fd3dccb19429ecbd11'/>
<id>urn:sha1:2b37d7902daa6e2a9c2284fd3dccb19429ecbd11</id>
<content type='text'>
</content>
</entry>
<entry>
<title>README.md: Add public API declaration</title>
<updated>2026-05-24T09:41:14Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T09:41:14Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=fc6315be199305d21e4fb1b1a18917bec4147f3e'/>
<id>urn:sha1:fc6315be199305d21e4fb1b1a18917bec4147f3e</id>
<content type='text'>
This is required to properly use Semantic Versioning.
</content>
</entry>
<entry>
<title>Disable log timestamps</title>
<updated>2026-05-24T09:31:00Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T09:31:00Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=1d0f96aaacd7d8853a1aa970b01560c92c4da86b'/>
<id>urn:sha1:1d0f96aaacd7d8853a1aa970b01560c92c4da86b</id>
<content type='text'>
Many logging systems provide timestamps on their own. To avoid
duplication it is disabled by default.
</content>
</entry>
<entry>
<title>README.md: Add build instructions</title>
<updated>2026-05-24T09:29:38Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T09:29:38Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=5a0e9472d28961b2a8d598165e05f4221171c1a1'/>
<id>urn:sha1:5a0e9472d28961b2a8d598165e05f4221171c1a1</id>
<content type='text'>
</content>
</entry>
<entry>
<title>systemd: Add finserv.service</title>
<updated>2026-05-24T08:45:19Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T08:45:19Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=57b275d398b14aed86a047a829427c557018b5f8'/>
<id>urn:sha1:57b275d398b14aed86a047a829427c557018b5f8</id>
<content type='text'>
This file can be used to package for systemd-based Linux distribution.

It creates the finserv system service running the server. That way
automatic startup on system start can be implemented.
</content>
</entry>
<entry>
<title>systemd: Add finserv.tmpfile.d</title>
<updated>2026-05-24T08:43:47Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T08:43:47Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=bde29ccfbbd33376161bd192637c6c7ac70f5490'/>
<id>urn:sha1:bde29ccfbbd33376161bd192637c6c7ac70f5490</id>
<content type='text'>
This file can be used to package for systemd-based Linux distribution.

I configures the data directory of finserv. This notably includes
setting the proper access permissions to protect the saved data.
</content>
</entry>
<entry>
<title>systemd: Add sysuser.conf</title>
<updated>2026-05-24T08:42:50Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-24T08:42:50Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=03c582c3b17b7320bf9317b4a27c572f68cc0fd7'/>
<id>urn:sha1:03c582c3b17b7320bf9317b4a27c572f68cc0fd7</id>
<content type='text'>
This file can be used to package for systemd-based Linux distribution.

It creates the `finserv` system user which runs the server.
</content>
</entry>
<entry>
<title>frontend: Add work in progress text to index</title>
<updated>2026-05-23T22:13:24Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T22:13:24Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=d8562450d1c50fdadfb97436b69e74908f97b11d'/>
<id>urn:sha1:d8562450d1c50fdadfb97436b69e74908f97b11d</id>
<content type='text'>
This explains the users the current state of this project.
</content>
</entry>
<entry>
<title>frontend: static: Add simple.css symlink</title>
<updated>2026-05-23T22:10:50Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T22:08:27Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=0425f4b8e6e27923e7a43b24a05117eb62ac6786'/>
<id>urn:sha1:0425f4b8e6e27923e7a43b24a05117eb62ac6786</id>
<content type='text'>
This allows to develop the frontend with `hugo server` and its built-in
page refresh on file change.

For the actual build the file is copied to the build directory by Meson.
</content>
</entry>
<entry>
<title>Use simple.css</title>
<updated>2026-05-23T22:05:40Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T22:05:40Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=15be9a62f557d54448cbb932c4d7c4a96843daf2'/>
<id>urn:sha1:15be9a62f557d54448cbb932c4d7c4a96843daf2</id>
<content type='text'>
This enables the use of simple.css as CSS framework.
</content>
</entry>
<entry>
<title>Add `run` target</title>
<updated>2026-05-23T21:57:04Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T21:56:18Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=cfa648d2b69bdb26bdbb0a9096780d7721c99da3'/>
<id>urn:sha1:cfa648d2b69bdb26bdbb0a9096780d7721c99da3</id>
<content type='text'>
This allows to easily run the server with a single `meson compile -C
build run` during development.
</content>
</entry>
<entry>
<title>frontend: Add simple.css submodule</title>
<updated>2026-05-23T21:55:30Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T21:55:30Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=fe8c7a33aeb2124ffb00a6c6be61369e5e344bc3'/>
<id>urn:sha1:fe8c7a33aeb2124ffb00a6c6be61369e5e344bc3</id>
<content type='text'>
This is the CSS framework which should be used for this repository.
</content>
</entry>
<entry>
<title>Add global Meson build system</title>
<updated>2026-05-23T21:48:15Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T21:48:15Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=4db5f4ae91cc5b9139e3f2e1208e2ec032a89ebf'/>
<id>urn:sha1:4db5f4ae91cc5b9139e3f2e1208e2ec032a89ebf</id>
<content type='text'>
This commit fully introduces Meson as a build system for this
repository. It makes sure the frontend page is built with Hugo before
the Go executable is built and embeds the frontend.
</content>
</entry>
<entry>
<title>frontend: Add Meson build system</title>
<updated>2026-05-23T21:42:27Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T21:39:01Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=0c2903126aa2df80d1ea40295df6365ea37b7651'/>
<id>urn:sha1:0c2903126aa2df80d1ea40295df6365ea37b7651</id>
<content type='text'>
This is a first step towards using Meson for the whole repository.

Having one central build system allows many things like ensuring that
the frontend page is build before embedding it into the Go executable
or like transpiling TypeScript to JavaScript before building the
frontend page.
</content>
</entry>
<entry>
<title>Embed frontend to server executable</title>
<updated>2026-05-23T20:54:30Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T20:54:30Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=a72c0c275a962153a40bc805e5ce3ac7a273f55c'/>
<id>urn:sha1:a72c0c275a962153a40bc805e5ce3ac7a273f55c</id>
<content type='text'>
This makes use of the `embed` package of the Go standard library to
embed the full Hugo static website as a global filesystem variable
inside the executable.

This effectively makes all files of the static website part of the Go
executable. That way it is always possible to just copy the server
executable to a host, make it executable and run it without any other
dependencies.
</content>
</entry>
<entry>
<title>Hook up frontend in Go web server</title>
<updated>2026-05-23T20:38:40Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2026-05-23T20:37:31Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/finserv/commit/?id=7bb61037ffa36549661b8a34e305343d40007ca2'/>
<id>urn:sha1:7bb61037ffa36549661b8a34e305343d40007ca2</id>
<content type='text'>
This makes the Hugo-built static website part of site hosted by Go which
also contains the dynamic API under /api.
</content>
</entry>
</feed>
