<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>Philip Withnall</title>
	<atom:link href="https://tecnocode.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>https://tecnocode.co.uk</link>
	<description>Free software, the outdoors and the environment.</description>
	<lastBuildDate>Sun, 23 Aug 2026 19:10:38 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>
	<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<site xmlns="com-wordpress:feed-additions:1">2830989</site>	<item>
		<title>Flatpak repository key rotation</title>
		<link>https://tecnocode.co.uk/2026/08/23/flatpak-repository-key-rotation/</link>
					<comments>https://tecnocode.co.uk/2026/08/23/flatpak-repository-key-rotation/#comments</comments>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Sun, 23 Aug 2026 19:05:51 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[Flatpak]]></category>
		<category><![CDATA[GPG]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1568</guid>

					<description><![CDATA[In recent weeks, I’ve been working on adding key rotation support to flatpak, so that repositories which sign their commits and summary files with a key with an expiry date have a way to push updates to that key to all the clients which use them. Currently that’s not possible without each client manually having [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In recent weeks, I’ve been working on adding key rotation support to flatpak, so that repositories which sign their commits and summary files with a key with an expiry date have a way to push updates to that key to all the clients which use them. Currently that’s not possible without each client manually having its config updated to use the new key data (even if the change in key data is just to bump the expiry date).</p>



<p class="wp-block-paragraph">In the process I’ve learned a few more things about GPG keys, subkeys, signatures, UIDs, etc., which I thought I might dump here in case it’s useful for someone else (or me, in the future). I don’t claim to be an expert, so I may still be misunderstanding some bits. GPG is complex. One thing which has helped ground things is finding the documentation in <a href="https://www.rfc-editor.org/info/rfc4880/">RFC 4880</a> (and related) which defines the GPG packet format.</p>



<p class="wp-block-paragraph">One thing which keeps flatpak’s use of GPG simple is that it doesn’t use any of the web-of-trust features or trust-on-first-use (TOFU). Its use of GPG is limited to the keyring format (essentially <code>pubring.gpg</code>), for storing and publishing public and private keys, subkeys, signatures, revocations, UIDs; and using them to sign and verify OSTree commits and various repository files (<code>summary</code>, <code>summary.idx</code>, etc.).</p>



<h2 class="wp-block-heading">Quick primer on the parts of GPG</h2>



<p class="wp-block-paragraph">GPG has keyrings: collections of primary keys. A primary key has public and private/secret parts. The way flatpak uses it, the secret part of a key always stays on the server, and is used to generate signatures. The public part is published by the server and configured in every client using that repository, used to verify the commit signatures. Each client has one keyring per remote it has configured. Typically this contains one primary key, but it could contain several, any of which can be used to verify signatures from that remote.</p>



<p class="wp-block-paragraph">A key is identified using a fingerprint, a 40-character hex string. It can also be identified using a key ID, which is a substring of the fingerprint. There’s also keygrips, but let’s ignore those.</p>



<p class="wp-block-paragraph">You can see fingerprints for keys using <code>gpg --list-keys --fingerprint</code>.</p>



<p class="wp-block-paragraph">A primary key has one or more subkeys (at least in flatpak’s usage). All of these keys have public and private/secret parts as above. Each key has a usage which indicates what GPG will let you use it for, such as certifying, signing, authenticating, encrypting. The primary key is typically used to certify its subkeys by creating cross-certification signatures which bind them to the primary key, forming a short chain of trust — anyone who trusts the primary key should trust a subkey which it cross-certifies.</p>



<p class="wp-block-paragraph">You can see subkeys as the <code>sub</code> lines using <code>gpg --list-keys --with-subkey-fingerprint</code>. The <code>[SCE]</code>, <code>[S]</code>, <code>[E]</code> (etc.) fields show the usage flags for a key.</p>



<p class="wp-block-paragraph">The other usage we care about is signing (flatpak doesn’t use authentication or encryption usages). GPG separates keys by usage to prevent attacks where a key is used for a purpose it’s not intended for, and because keys used for different purposes often need to be treated with different levels of care.</p>



<p class="wp-block-paragraph">In particular, separating by usage means the private/secret part of the primary key can be kept completely offline, and only brought out in a special key signing ceremony when a new subkey needs to be generated and cross-certified. This reduces the risk of the very valuable primary key, which is the root of every client’s trust in the repository, being leaked.</p>



<p class="wp-block-paragraph">So, we use a signing subkey for day-to-day signing of OSTree commits. For a big flatpak repository, the private/secret part of this subkey might be kept in a hardware security module, so it can’t be exfiltrated from the server if the server were compromised. But there’s still the risk of a compromised server being used to sign things it shouldn’t (such as malicious apps).</p>



<p class="wp-block-paragraph">That’s a matter for server security, but we can somewhat mitigate against the possibility of the signing subkey being leaked by setting an expiration date on it. Clients might choose not to trust signatures made by it after that date; and <code>gpg</code> certainly wouldn’t allow it to be used to create new signatures.</p>



<p class="wp-block-paragraph">The expiry date of a key is shown as an <code>expires</code> field in the <code>gpg --list-keys --with-subkey-fingerprint</code> output.</p>



<p class="wp-block-paragraph">What happens when the subkey expires? By that point, the administrators should have generated another subkey, cross-certified by the primary key in a key signing ceremony (I assume the ceremony involves cake). The private/secret part of the new subkey needs to stay secret, as before; but the public part needs to be distributed to every client’s keyring, along with the new cross-certification signature from the primary key, so the clients know they can trust signatures made by that subkey.</p>



<p class="wp-block-paragraph">That’s the bit which flatpak is currently lacking.</p>



<p class="wp-block-paragraph">So in summary: GPG has keyrings. Keyrings have primary keys. Primary keys have one or more subkeys and cross-certification signatures from the primary key on those subkeys. Each subkey has a usage, but flatpak only uses certify (for the primary key) and sign (for the subkeys). Keys can have expiration dates.</p>



<p class="wp-block-paragraph">And if you want to see the full contents of a keyring, run <code>gpg --list-keys --with-colons</code>. It’ll output everything (no filtering) in a machine readable format described <a href="https://github.com/gpg/gnupg/blob/master/doc/DETAILS">here</a> (best reference I’ve been able to find), which is sometimes easier to use than remembering which <code>--with-blah</code> option to pass to GPG to get it to show the information you want.</p>



<h2 class="wp-block-heading">What else does GPG have?</h2>



<p class="wp-block-paragraph">Quite a few things. We’ll ignore the big things which are not relevant to flatpak.</p>



<p class="wp-block-paragraph">Each primary key also has one or more UIDs. These are like subkeys in that they are cross-certified by the primary key. Each UID is a user identity — typically a name and email address. If you were using GPG in a web of trust, the binding between the primary key and a UID is what you sign that you trust when you sign someone’s key in a key signing party.</p>



<p class="wp-block-paragraph">The UIDs are listed below each primary key in <code>gpg --list-keys</code>.</p>



<p class="wp-block-paragraph">Flatpak doesn’t need UIDs, but they are an unavoidable part of GPG — each primary key must have at least one. A flatpak repository will typically put a server contact email address in the UID and then everyone will ignore it.</p>



<p class="wp-block-paragraph">UIDs can be revoked; for example if someone loses control of the email address in it and wants their friends to no longer trust emails from it. Flatpak currently doesn’t use this.</p>



<p class="wp-block-paragraph">What else can be revoked? The cross-certification signatures! You may have heard of a GPG revocation certificate. This is a way of revoking an entire primary key. But there’s also a way of revoking a particular cross-certification signature, meaning that the primary key is still valid/trusted, but the owner of the primary key has lost control of one of the subkeys, and that subkey should no longer be trusted. This is different from key expiration, as it’s a statement that something has explicitly gone wrong.</p>



<p class="wp-block-paragraph">Because of how GPG is built up as a series of packets of different types, a signature revocation is actually a revocation packet appended to the primary key. This means you can re-cross-certify a subkey after revoking it, by appending another cross-certification packet. And even revoke it again after that. Not sure if there’s a use case for this or if it’s just a consequence of the packet format, but this behaviour does play havoc with working out whether to trust a subkey.</p>



<p class="wp-block-paragraph">Cross-certification signatures can also have an expiration date built into them, separate from the expiration date of the subkey. I’m not sure of the use case for this either, but there must be one.</p>



<h2 class="wp-block-heading">Some notes on running GPG on the command line</h2>



<p class="wp-block-paragraph">GPG is historically famously hard to use. I feel this has got better in recent years, particularly for scripting it. In particular it’s added a whole load of <code>--quick-blah</code> commands to generate keys, set expiries, etc. from scripts.</p>



<p class="wp-block-paragraph">One thing which repeatedly tripped me up before I stopped trying to fight it was its concept of a ’homedir’. GPG needs to look for its keyring (and trust database, and various other files) somewhere, and will not run without them, so you always need to pass it a ‘homedir’ to look for them in. By default, this will be <code>~/.gnupg</code>, so it’s very easy to accidentally end up operating on your personal GPG keyring when you’re trying to do something in a project.</p>



<p class="wp-block-paragraph">If using GPG as a tool or in a script, I think you should always create a temporary homedir, pass it as <code>gpg --homedir=/path/to/temp</code> and explicitly import whatever keys or context you need into this homedir before doing whatever operation you need.</p>



<p class="wp-block-paragraph">This is necessary even if ‘all’ you want to do is view a downloaded <code>.gpg</code> keyring, because what GPG displays may be affected by the trust database in its homedir. So to view a downloaded keyring you should still do something like <code>mkdir temp; gpg --homedir=./temp ./path/to/download.gpg</code>.</p>



<p class="wp-block-paragraph">If you are trying to sign something, you will typically pass the fingerprint or key ID of a primary key to GPG; for example as <code>gpg --local-user 0xfingerprint --sign ./path/to/file</code>. GPG will helpfully use the usage flags of the subkey of that primary key to choose which subkey to sign with. If you want to sign with a <em>specific</em> subkey, you need to suffix the fingerprint with an exclamation mark (<code>!</code>) otherwise GPG will still choose what it thinks is the most appropriate subkey, which might not align with the subkey you carefully chose. This <code>!</code> suffix format is common throughout the GPG command line interface for when you want to specify a specific subkey.</p>



<h2 class="wp-block-heading">Sorry</h2>



<p class="wp-block-paragraph">That was more of a braindump than I imagined when I set out to write this. I hope some of it is useful; feedback welcome if I’ve got anything wrong. If any GPG experts fancy reviewing key rotation support in flatpak, the draft implementation is <a href="https://github.com/flatpak/flatpak/pull/6798">here</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tecnocode.co.uk/2026/08/23/flatpak-repository-key-rotation/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1568</post-id>	</item>
		<item>
		<title>Parental controls web filtering backend</title>
		<link>https://tecnocode.co.uk/2025/11/27/parental-controls-web-filtering-backend/</link>
					<comments>https://tecnocode.co.uk/2025/11/27/parental-controls-web-filtering-backend/#comments</comments>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Thu, 27 Nov 2025 13:25:50 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[malcontent]]></category>
		<category><![CDATA[NSS]]></category>
		<category><![CDATA[parental controls]]></category>
		<category><![CDATA[web filtering]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1558</guid>

					<description><![CDATA[In my previous post I gave an overview of the backend for the screen time limits feature of parental controls in GNOME. In this post, I’ll try and do the same for the web filtering feature. We haven’t said much about web filtering so far, because the user interface for it isn’t finished yet. The [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In my <a href="https://tecnocode.co.uk/2025/11/19/parental-controls-screen-time-limits-backend/" data-type="post" data-id="1551">previous post</a> I gave an overview of the backend for the screen time limits feature of parental controls in GNOME. In this post, I’ll try and do the same for the web filtering feature.</p>



<p class="wp-block-paragraph">We haven’t said much about web filtering so far, because the user interface for it isn’t finished yet. The backend is, though, and it will get plumbed up eventually. Currently we don’t have a GNOME release targeted for it yet.</p>



<h2 class="wp-block-heading"><s>When is web filterings?</s> What is web filtering?</h2>



<p class="wp-block-paragraph">(Apologies to <a href="https://www.bbc.co.uk/sounds/play/p0kbyc52">Radio 4 Friday Night Comedy</a>.)</p>



<p class="wp-block-paragraph">Firstly, what is the aim of web filtering? As with screen time limits, we’ve written a <a href="https://gitlab.freedesktop.org/pwithnall/malcontent/-/blob/main/docs/web-filtering.md?ref_type=heads">design document</a> which (hopefully) covers everything. But the summary is that it should allow parents to filter out age-inappropriate content on the web when it’s accessed by child accounts, while not breaking the web (for example, by breaking TLS for websites) and not requiring us (as a project) to become curators of filter lists. It needs to work for all apps on the system (lots of apps other than web browsers can show web content), and needs to be able to filter things differently for different users (two different children of different ages might use the same computer, as well as the parents themselves).</p>



<p class="wp-block-paragraph">After looking at various different possible ways of implementing it, the best solution seemed to be to write an NSS module to respond to name resolution (i.e. DNS) requests and potentially block them according to a per-user filter list.</p>



<h2 class="wp-block-heading">A brief introduction to NSS</h2>



<p class="wp-block-paragraph">NSS (Name Service Switch) is a standardised name lookup API in libc. It’s used for hostname resolution, but also for user accounts and various other things. Names are resolved by various modules which are <code>dlopen()</code>ed into your process by libc and queried in the order given in <code>/etc/nsswitch.conf</code>. So for hostname resolution, a typical configuration in <code>nsswitch.conf</code> would cause libc to query the module which looks at <code>/etc/hosts</code> first, then the module which checks your machine’s hostname, then the mDNS module, then systemd-resolved.</p>



<p class="wp-block-paragraph">So, we can insert our NSS module into <code>/etc/nsswitch.conf</code>, have it run somewhere before systemd-resolved (which in this example does the <em>actual</em> DNS resolution), and have it return a <a href="https://en.wikipedia.org/wiki/DNS_sinkhole">sinkhole address</a> for blocked domains. Because <code>/etc/nsswitch.conf</code> is read by libc within your process, this means that the configuration needs to be modified for containers (flatpak) as well as on the host system.</p>



<p class="wp-block-paragraph">Because the filter module is loaded into the name lookup layer, this means that content filtering (as opposed to domain name filtering) is not possible with this approach. That’s fine — content filtering is hard, I’m not sure it gives better results overall than domain name filtering, and means we can’t rely on existing domain name filter lists which are well maintained and regularly updated. We’re not planning on adding content filtering.</p>



<p class="wp-block-paragraph">It also means that DNS-over-HTTPS/-TLS can be supported, as long as the app doesn’t implement it natively (i.e. by talking HTTPS over a socket itself). Some browsers do that, so the module needs to <a href="https://support.mozilla.org/en-US/kb/canary-domain-use-application-dnsnet">set a canary to tell them to disable it.</a> DNS-over-HTTPS/-TLS can still be used if it’s implemented by one of the NSS modules, like systemd-resolved.</p>



<p class="wp-block-paragraph">Nothing here stops apps from deliberately bypassing the filtering if they want, perhaps by talking DNS over UDP directly, or by <a href="https://gitlab.freedesktop.org/pwithnall/malcontent/-/blob/3c66556b2e80cfc4b54cdc32306434283813fb96/nss/tests/nss-malcontent.c#L266">calling secret internal glibc functions to override <code>nsswitch.conf</code></a>. In the future, we’d have to implement per-app network sandboxing to prevent bypasses. But for the moment, trusting the apps to cooperate with parental controls is fine.</p>



<h2 class="wp-block-heading">Filter update daemon</h2>



<p class="wp-block-paragraph">So we have a way of blocking things; but how does it know what to block? There are a lot of filter lists out there on the internet, targeted at existing web filtering software. Basically, a filter list is a list of domain names to block. Some filter lists allow wildcards and regexps, others just allow plain strings. For simplicity, we’ve gone with plain strings.</p>



<p class="wp-block-paragraph">We allow the parent to choose zero or more filter lists to build a web filtering policy for a child. Typically, these filter lists will correspond to categories of content, so the parent could choose a filter list for advertising, and another for violent content, for example. The web filtering policy is basically the set of these filter lists, plus some options like “do you want to enforce safe search”. This policy is, like all other parental controls policies, stored against the child user in <a href="https://gitlab.freedesktop.org/accountsservice/accountsservice/">accounts-service</a>.</p>



<p class="wp-block-paragraph">Combine these filter lists, and you have the filter list to give to NSS in the child’s session, right? Not quite — because the internet unfortunately keeps changing, filter lists need to be updated regularly. So actually what we need is a system daemon which can regularly check the filter lists for updates, combine them, and make them available as a compiled file to the child’s NSS module — for each user on the system.</p>



<p class="wp-block-paragraph">This daemon is <code>malcontent-webd</code>. It has a D-Bus interface to allow the parent to trigger compiling the filter for a child when changing the parental controls policy for that child in the UI, and to get detailed feedback on any errors. Since the filter lists come from third parties on the internet, there are various ways they could have an error.</p>



<p class="wp-block-paragraph">It also has a timer unit trigger, <code>malcontent-webd-update</code>, which is what triggers it to periodically check the filter lists for all users for updates.</p>



<figure class="wp-block-image size-large"><a href="https://tecnocode.co.uk/wp-content/uploads/2025/11/web-filtering-ipc.svg"><img fetchpriority="high" decoding="async" width="601" height="300" src="https://tecnocode.co.uk/wp-content/uploads/2025/11/web-filtering-ipc.svg" alt="" class="wp-image-1563"/></a><figcaption class="wp-element-caption">High-level diagram of the web filtering system, showing the major daemons and processes, files, and IPC calls. If it’s not clear, the awful squiggled line in the bottom left is meant to be a cloud. Maybe this representation is apt.</figcaption></figure>



<p class="wp-block-paragraph">And that’s it! Hopefully it’ll be available in a GNOME release once we’ve implemented the user interface for it and done some more end-to-end testing, but the screen time limits work is taking priority over it.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tecnocode.co.uk/2025/11/27/parental-controls-web-filtering-backend/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1558</post-id>	</item>
		<item>
		<title>Parental controls screen time limits backend</title>
		<link>https://tecnocode.co.uk/2025/11/19/parental-controls-screen-time-limits-backend/</link>
					<comments>https://tecnocode.co.uk/2025/11/19/parental-controls-screen-time-limits-backend/#comments</comments>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Wed, 19 Nov 2025 23:39:19 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[digital wellbeing]]></category>
		<category><![CDATA[malcontent]]></category>
		<category><![CDATA[parental controls]]></category>
		<category><![CDATA[screen time]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1551</guid>

					<description><![CDATA[Ignacy blogged recently about all the parts of the user interface for screen time limits in parental controls in GNOME. He’s been doing great work pulling that all together, while I have been working on the backend side of things. We’re aiming for this screen time limits feature to appear in GNOME 50. High level [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ignacy <a href="https://blogs.gnome.org/ignapk/2025/11/10/digital-wellbeing-contract-screen-time-limits/">blogged recently about all the parts of the user interface for screen time limits</a> in parental controls in GNOME. He’s been doing great work pulling that all together, while I have been working on the backend side of things. We’re aiming for this screen time limits feature to appear in GNOME 50.</p>



<h2 class="wp-block-heading">High level design</h2>



<p class="wp-block-paragraph">There’s a <a href="https://gitlab.freedesktop.org/pwithnall/malcontent/-/blob/main/docs/screen-time.md?ref_type=heads">design document</a> which is the canonical reference for the design of the backend, but to summarise it at a high level: there’s a stateless daemon, <code>malcontent-timerd</code>, which receives logs of the child user’s time usage of the computer from <code>gnome-shell</code> in the child’s session. For example, when the child stops using the computer, <code>gnome-shell</code> will send the start and end times of the most recent period of usage. The daemon deduplicates/merges and stores them. The parent has set a screen time policy for the child, which says how much time they’re allowed on the computer per day (for example, 4h at most; or only allowed to use the computer between 15:00 and 17:00). The policy is stored against the child user in <a href="https://gitlab.freedesktop.org/accountsservice/accountsservice/">accounts-service</a>.</p>



<p class="wp-block-paragraph"><code>malcontent-timerd</code> applies this policy to the child’s usage information to calculate an ‘estimated end time’ for the child’s current session, assuming that they continue to use the computer without taking a break. If they stop or take a break, their usage – and hence the estimated end time – is updated.</p>



<p class="wp-block-paragraph">The child’s <code>gnome-shell</code> is notified of changes to the estimated end time and, once it’s reached, locks the child’s session (with appropriate advance warning).</p>



<p class="wp-block-paragraph">Meanwhile, the parent can query the child’s computer usage via a separate API to <code>malcontent-timerd</code>. This returns the child’s total screen time usage per day, which allows the <a href="https://blogs.gnome.org/ignapk/2025/11/10/digital-wellbeing-contract-screen-time-limits/#attachment_113">usage chart</a> to be shown to the parent in the parental controls user interface (<code>malcontent-control</code>). The daemon imposes access controls on which users can query for usage information. Because the daemon can be accessed by the child and by the parent, and needs to be write-only for the child and read-only for the parent, it has to be a system daemon.</p>



<p class="wp-block-paragraph">There’s a third API flow which allows the child to request an extension to their screen time for the day, but that’s perhaps a topic for a separate post.</p>



<figure class="wp-block-image size-large"><a href="https://tecnocode.co.uk/wp-content/uploads/2025/11/screen-time-ipc.svg"><img decoding="async" width="307" height="196" src="https://tecnocode.co.uk/wp-content/uploads/2025/11/screen-time-ipc.svg" alt="" class="wp-image-1554"/></a><figcaption class="wp-element-caption">IPC diagram of screen time limits support in malcontent. Screen time limit extensions are shown in dashed arrows.</figcaption></figure>



<p class="wp-block-paragraph">So, at its core, <code>malcontent-timerd</code> is a time range store with some policy and a couple of D-Bus interfaces built on top.</p>



<h2 class="wp-block-heading">Per-app time limits</h2>



<p class="wp-block-paragraph">Currently it only supports time limits for login sessions, but it is built in such a way that adding support for time limits for specific apps would be straightforward to add to <code>malcontent-timerd</code> in future. The main work required for that would be in <code>gnome-shell</code> — recording usage on a per-app basis (for apps which have limits applied), and enforcing those limits by freezing or blocking access to apps once the time runs out. There are some interesting user experience questions to think about there before anyone can implement it — how do you prevent a user from continuing to use an app without risking data loss (for example, by killing it)? How do you unambiguously remind the user they’re running out of time for a specific app? Can we reliably find all the windows associated with a certain app? Can we reliably instruct apps to save their state when they run out of time, to reduce the risk of data loss? There are a number of bits of architecture we’d need to get in place before per-app limits could happen.</p>



<h2 class="wp-block-heading">Wrapping up</h2>



<p class="wp-block-paragraph">As it stands though, the grant funding for parental controls is coming to an end. Ignacy will be continuing to work on the UI for some more weeks, but my time on it is basically up. With the funding, we’ve managed to implement digital wellbeing (screen time limits and break reminders for adults) including a whole UI for it in <code>gnome-control-center</code> and a fairly complex state machine for tracking your usage in <code>gnome-shell</code>; a refreshed UI for parental controls; parental controls screen time limits as described above; the backend for web filtering (but more on that in a future post); and everything is structured so that the extra features we want in future should bolt on nicely.</p>



<p class="wp-block-paragraph">While the features may be simple to describe, the implementation spans four projects, two buses, contains three new system daemons, two new system data stores, and three fairly unique new widgets. It’s tackled all sorts of interesting user design questions (and continues to do so). It’s fully documented, has some unit tests (but not as many as I’d like), and <a href="https://gitlab.freedesktop.org/pwithnall/malcontent/#development">can be integration tested using sysexts</a>. The new widgets are localisable, accessible, and work in dark and light mode. There are even <code>man</code> pages. I’m quite pleased with how it’s all come together.</p>



<p class="wp-block-paragraph">It’s been a team effort from a lot of people! Code, design, input and review (in no particular order): <a href="https://blogs.gnome.org/ignapk/">Ignacy</a>, <a href="https://blogs.gnome.org/aday/">Allan</a>, <a href="https://samuelhewitt.com/">Sam</a>, <a href="https://blogs.gnome.org/fmuellner/">Florian</a>, <a href="https://gitlab.gnome.org/skeller">Sebastian</a>, <a href="https://gitlab.gnome.org/velsinki">Matthijs</a>, <a href="https://blogs.gnome.org/feborges/">Felipe</a>, <a href="https://nondeterministic.computer/@ramcq">Rob</a>. Thank you <a href="https://endlessos.org">Endless</a> for the grant and the original work on parental controls. Administratively, thank you to everyone at the GNOME Foundation for handling the grant and paperwork; and thank you to the freedesktop.org admins for providing project hosting for malcontent!</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tecnocode.co.uk/2025/11/19/parental-controls-screen-time-limits-backend/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1551</post-id>	</item>
		<item>
		<title>A brief parental controls update</title>
		<link>https://tecnocode.co.uk/2025/07/24/a-brief-parental-controls-update/</link>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Thu, 24 Jul 2025 22:13:28 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[gnome-control-center]]></category>
		<category><![CDATA[gnome-shell]]></category>
		<category><![CDATA[GUADEC]]></category>
		<category><![CDATA[malcontent]]></category>
		<category><![CDATA[parental controls]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1545</guid>

					<description><![CDATA[Over the past few weeks, Ignacy and I have made good progress on the next phase of features for parental controls in GNOME: a refresh of the parental controls UI, support for screen time limits for child accounts, and basic web filtering support are all in progress. I’ve been working on the backend stuff, while [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Over the past few weeks, <a href="https://blogs.gnome.org/ignapk/2025/07/11/digital-wellbeing-contract/">Ignacy</a> and I have made good progress on the next phase of features for parental controls in GNOME: a refresh of the parental controls UI, support for screen time limits for child accounts, and basic web filtering support are all in progress. I’ve been working on the backend stuff, while Ignacy has been speedily implementing everything needed in the frontend.</p>



<p class="wp-block-paragraph">Ignacy is at GUADEC, so please say hi to him! The next phase of parental controls work will involve changes to gnome-control-center and gnome-shell, so he’ll be popping up all over the stack.</p>



<p class="wp-block-paragraph">I’ll try and blog more soon about the upcoming features and how they’re implemented, because there are necessarily quite a few moving parts to them.</p>
]]></content:encoded>
					
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1545</post-id>	</item>
		<item>
		<title>GUADEC handbook</title>
		<link>https://tecnocode.co.uk/2025/07/12/guadec-handbook/</link>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Sat, 12 Jul 2025 16:25:38 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[GUADEC]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1542</guid>

					<description><![CDATA[I was reminded today that I put together some notes last year with people’s feedback about what worked well at the last GUADEC. The idea was that this could be built on, and eventually become another part of the GNOME handbook, so that we have a good checklist to organise events from each year. I’m [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I was reminded today that I <a href="https://gitlab.gnome.org/pwithnall/guadec-handbook">put together some notes last year</a> with people’s feedback about what worked well at the last GUADEC. The idea was that this could be built on, and eventually become another part of the GNOME handbook, so that we have a good checklist to organise events from each year.</p>



<p class="wp-block-paragraph">I’m not organising GUADEC, so this is about as far as I can push this proto-handbook, but if anyone wants to fork it and build on it then please feel free.</p>



<p class="wp-block-paragraph">Most of the notes so far relate to A/V things, remote participation, and some climate considerations. Obviously a lot more about on-the-ground organisation would have to be added to make it a full handbook, but it’s a start.</p>
]]></content:encoded>
					
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1542</post-id>	</item>
		<item>
		<title>GUADEC 2024</title>
		<link>https://tecnocode.co.uk/2024/07/22/guadec-2024/</link>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Mon, 22 Jul 2024 15:48:21 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Berlin]]></category>
		<category><![CDATA[digital wellbeing]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[gobject-introspection]]></category>
		<category><![CDATA[GUADEC]]></category>
		<category><![CDATA[parental controls]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1530</guid>

					<description><![CDATA[Goodness, it’s been a long time since I blogged. I’ve got a lot of updates to give, but perhaps let’s keep this post short, and dedicated to publishing the details of the two talks I gave at GUADEC this year, for posterity. I plan to do some more blog posts in the near future with [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Goodness, it’s been a long time since I blogged. I’ve got a lot of updates to give, but perhaps let’s keep this post short, and dedicated to publishing the details of the two talks I gave at GUADEC this year, for posterity. I plan to do some more blog posts in the near future with more updates from the past year and more details of the features I’ve been working on.</p>
<h1>An update on parental controls and digital wellbeing for GNOME 47</h1>
<p>This was my <a href="https://events.gnome.org/event/209/contributions/751/" data-wplink-edit="true">first talk</a> at GUADEC this year, serving as a little teaser of the work I’ve been doing recently (sponsored by Endless Network via the GNOME Foundation) to add features to parental controls and digital wellbeing.</p>
<p>Thank you to Allan Day for fitting in work on the design for digital wellbeing this cycle, to Florian Müllner and Felipe Borges for reviewing all the code I’ve thrown at them, and to Dylan McCall for feedback on earlier versions of break reminders.</p>
<p>Here’s the <a href="https://www.youtube.com/live/vMf3cOtcPtI?si=TNxpfrNO8LSIJe2w&amp;t=14633">recording</a>, the <a href="https://tecnocode.co.uk/talks/guadec-parental-controls-presentation-2024/presentation.pdf">slides</a>, <a href="https://tecnocode.co.uk/talks/guadec-parental-controls-presentation-2024/presentation_notes.pdf">slide notes</a> and <a href="https://gitlab.gnome.org/pwithnall/guadec-parental-controls-presentation-2024">source</a>.</p>
<h1>Somewhat merging gobject-introspection into GLib</h1>
<p>This was the <a href="https://events.gnome.org/event/209/contributions/769/">second talk</a>, and a companion to <a href="https://mastodon.social/@ebassi/112824147360661453">Emmanuele’s talk</a> about changes in introspection in GNOME 46. It gives an overview of how we’ve merged half of gobject-introspection into GLib recently, and what this means for app authors (basically nothing), binding developers (something, on a timeline of your choosing) and distributions (some packaging rework, for the GLib 2.78 and 2.80 releases).</p>
<p>Thank you to Emmanuele for spearheading this work in GLib and doing the gobject-introspection side of it, and the many GLib and gobject-introspection contributors for helping us stabilise this (in particular with build system improvements) after it landed.</p>
<p>Here’s the <a href="https://www.youtube.com/live/X0nUMyQxkLA?si=C-Z366IP-mtqlRnv&amp;t=5238">recording</a>, the <a href="https://tecnocode.co.uk/talks/guadec-introspection-presentation-2024/presentation.pdf">slides</a>, <a href="https://tecnocode.co.uk/talks/guadec-introspection-presentation-2024/presentation_notes.pdf">slide notes</a> and <a href="https://gitlab.gnome.org/pwithnall/guadec-introspection-presentation-2024">source</a>.</p>
]]></content:encoded>
					
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1530</post-id>	</item>
		<item>
		<title>GUADEC 2023</title>
		<link>https://tecnocode.co.uk/2023/08/07/guadec-2023/</link>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Mon, 07 Aug 2023 11:52:20 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[GUADEC]]></category>
		<category><![CDATA[talks]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1517</guid>

					<description><![CDATA[I attended GUADEC 2023 this year in-person in Rīga. It was nice to be able to see more people in person than last year’s mini-GUADEC in Berlin, and nice to be able to travel overland/oversea to Rīga, avoiding flights and the associated huge carbon emissions. Thank you to the GNOME Foundation and my employer, Endless, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I attended GUADEC 2023 this year in-person in Rīga. It was nice to be able to see more people in person than last year’s mini-GUADEC in Berlin, and nice to be able to <a href="https://tecnocode.co.uk/2023/05/23/getting-from-the-uk-to-riga-for-guadec-2023/">travel overland/oversea to Rīga</a>, avoiding flights and the associated huge carbon emissions. Thank you to the <a href="https://foundation.gnome.org/">GNOME Foundation</a> and my employer, <a href="https://www.endlessos.org/">Endless</a>, for covering the travel.<br>And a big thank you to the local event organising team, the AV team, the volunteers and the Foundation staff for making it all happen.</p>



<p class="wp-block-paragraph">The quality of the talks this year was really high. I don’t think there was a single talk slot I skipped. As a result, I didn’t get much hacking done! But there were good hallway conversations and catch ups.</p>



<p class="wp-block-paragraph">I gave two talks, one on some simple improvements people can make to their apps to reduce internet data use and power use when doing so would be beneficial to the user (when on a metered network or in power-saver mode).<br>The aim was to remind people how easy it is to do this, and provide some examples of how different apps present these states/events in the UI, since the best way to do that can differ between apps.</p>



<p class="wp-block-paragraph">You can find the <a href="https://tecnocode.co.uk/misc/talks/guadec-2023/power-bandwidth/presentation.pdf">slides to that talk here</a> (notes <a href="https://tecnocode.co.uk/misc/talks/guadec-2023/power-bandwidth/presentation_notes.pdf">here</a>), and a <a href="https://www.youtube.com/watch?v=WVWrllJQJ_s&amp;t=18094s">video of it is on YouTube</a>.</p>



<p class="wp-block-paragraph">The talk has resulted in three GNOME initiatives. Each corresponds to a different state your app can pay attention to — some apps should pay attention to all of them, some apps only some of them. Please take 10 minutes to<br>check your app against the initiatives and make updates if necessary. I’m in the <a href="https://matrix.to/#/#gnome-hackers:gnome.org">gnome-hackers</a> and <a href="https://matrix.to/#/#circle:gnome.org">gnome-circle</a> Matrix rooms if you have any questions about them.</p>



<ul class="wp-block-list">
<li><a href="https://gitlab.gnome.org/GNOME/Initiatives/-/issues/42">https://gitlab.gnome.org/GNOME/Initiatives/-/issues/42</a></li>



<li><a href="https://gitlab.gnome.org/GNOME/Initiatives/-/issues/43">https://gitlab.gnome.org/GNOME/Initiatives/-/issues/43</a></li>



<li><a href="https://gitlab.gnome.org/GNOME/Initiatives/-/issues/44">https://gitlab.gnome.org/GNOME/Initiatives/-/issues/44</a></li>
</ul>



<p class="wp-block-paragraph">My second talk was an overview of work I’ve been doing on-and-off over the past couple of years (based on work by others) to allow apps to save and restore their state when the user logs out or shuts down the computer. The idea is that the user can restore<br>the set of apps they were using, in the state and configuration they were left in, when next starting the computer or logging in. It’s a big project, and there’s a long way to go, but it felt like the right time to present what<br>we’ve got so far, let more people know how the project is structured, and get feedback from toolkit developers and app authors about the whole idea.</p>



<p class="wp-block-paragraph">You can find the <a href="https://tecnocode.co.uk/misc/talks/guadec-2023/app-save-restore/presentation.pdf">slides to that talk here</a> (notes <a href="https://tecnocode.co.uk/misc/talks/guadec-2023/app-save-restore/presentation_notes.pdf">here</a>), and a <a href="https://www.youtube.com/watch?v=hv-bkYpHSbQ&amp;list=PLcb5uDX8FIoCXfTI9t2a47WUDoPG7sIMD&amp;index=6">video of it is also on YouTube</a>.</p>



<p class="wp-block-paragraph">Thankfully there was 5 minutes for questions at the end of the talk, and people used them well to raise some good points and ask some good questions. I’m still in the process of factoring all that feedback into the plan, but<br>should hopefully have an update to give on the project in a future blog post soon.</p>



<p class="wp-block-paragraph">Interesting talks I attended included Peter Hutterer’s talk about sending and capturing input in Wayland, which I think distilled his blogposts about the topic very clearly.<br>Allan Day’s talk about communication, which was an excellent summary of a rather long list of books on the subject, and it was very clearly presented. I feel like I could do with a cheatsheet list of his recommendations to stick next to my computer sometimes.<br>Evan Welsh, Philip Chimento, Nasah Kuma and Sonny Piers’s talks about JavaScript, TypeScript and the latest changes in GJS. These provided a good update on a lot that has been happening in GJS, a useful overview of TypeScript, and were really clearly presented.<br>Jussi Pakkanen’s talk about circles, or was it about settings? It was a good example of a lightning talk which draws you in then spins you around.</p>



<p class="wp-block-paragraph">In the hallway track, I had some interesting chats with Bartłomiej about the infrastructure of ODRS, which is used to provide ratings/review data to gnome-software.<br>I also had some positive conversation with Cassidy about plans for GUADEC 2024 in Denver.<br>And at the event dinner, a really energising chat with Scott about canyoning, hiking, skiing and caving in the US and the UK.</p>
]]></content:encoded>
					
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1517</post-id>	</item>
		<item>
		<title>Carbon emissions analysis of GUADEC 2022</title>
		<link>https://tecnocode.co.uk/2023/06/16/carbon-emissions-analysis-of-guadec-2022/</link>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Fri, 16 Jun 2023 12:35:10 +0000</pubDate>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[GNOME.Asia]]></category>
		<category><![CDATA[GUADEC]]></category>
		<category><![CDATA[LAS]]></category>
		<category><![CDATA[Mexico]]></category>
		<category><![CDATA[travel]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1514</guid>

					<description><![CDATA[I’ve just finished estimating the carbon emissions from GUADEC 2022, and have a few interesting highlights from the report. The report is based on data collected from the streaming servers, registration data, and the post-conference survey. Other conferences A post-conference survey has been done for other big GNOME events, such as GNOME.Asia and LAS. Would [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I’ve just finished <a href="https://gitlab.gnome.org/pwithnall/gnome-environmental-analysis/-/tree/main/guadec-2022">estimating the carbon emissions from GUADEC 2022</a>, and have a few interesting highlights from the report. The report is based on data collected from the streaming servers, registration data, and the post-conference survey.</p>



<ul class="wp-block-list">
<li>Having an online component to the conference increased the audience by a factor of 10: there were around 120 in-person attendees in Mexico, but there were an average of 1300 people using Big Blue Button.</li>



<li>The <a href="https://en.wikipedia.org/wiki/Greenhouse_gas_emissions">carbon emissions</a> from providing the remote infrastructure were around 2.8tCO<sub>2</sub>e, or about 2kgCO<sub>2</sub>e per remote attendee.</li>



<li>Having a remote attendance party in Berlin allowed around one tenth of the attendees to attend with a factor of 10 lower transport emissions than those who attended in-person in Mexico. The average transport emissions for those who went to Berlin were 88kgCO<sub>2</sub>e, whereas they were around 1tCO<sub>2</sub>e for those going to Mexico.</li>



<li>For context, the <a href="https://en.wikipedia.org/wiki/Individual_action_on_climate_change#Suggested_individual_target_amount">annual emissions per person can be at most</a> 2.3tCO<sub>2</sub>e by 2030 in order to limit global warming to 1.5C by the end of the century. That covers all food, travel, heating, purchases, etc. So travel to Mexico was 40% of the average attendee’s annual target.</li>



<li>Half of the in-person attendees travelled from within Mexico, which will have skewed the mean transport emissions downwards. The distribution is more likely bimodal between around 50kgCO<sub>2</sub>e for locals and more like 2-3tCO<sub>2</sub>e for those coming from outside Mexico.</li>



<li>As I <a href="https://tecnocode.co.uk/2022/08/05/mini-guadec-2022-berlin-retrospective/">wrote at the time</a>, the remote attendance party was fun to attend and felt like it worked as a way to attend the conference (there were no A/V problems, we had some nice local socials, etc.). I would do it again.</li>



<li>The post-conference survey had a low response rate of about 19% of registered attendees, which made some of this analysis hard. Please always fill in the post-conference survey! It doesn’t take long, and aside from any of this analysis, it helps the organisers plan conferences better in future.</li>



<li>Many thanks to Kristi, Caroline and Bartłomiej for collecting the data needed for this analysis.</li>



<li>If anyone spots problems in the analysis please say! This is not the kind of thing I practice doing very often and I’ve had to make a number of assumptions.</li>
</ul>



<h2 class="wp-block-heading">Other conferences</h2>



<p class="wp-block-paragraph">A post-conference survey has been done for other big GNOME events, such as GNOME.Asia and LAS. Would anyone be interested in doing a similar analysis for those events? Perhaps we can get a semi-automated pipeline in place for it.</p>
]]></content:encoded>
					
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1514</post-id>	</item>
		<item>
		<title>Getting from the UK to Riga for GUADEC 2023</title>
		<link>https://tecnocode.co.uk/2023/05/23/getting-from-the-uk-to-riga-for-guadec-2023/</link>
					<comments>https://tecnocode.co.uk/2023/05/23/getting-from-the-uk-to-riga-for-guadec-2023/#comments</comments>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Tue, 23 May 2023 12:48:45 +0000</pubDate>
				<category><![CDATA[Environment]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[ferries]]></category>
		<category><![CDATA[flying]]></category>
		<category><![CDATA[GUADEC]]></category>
		<category><![CDATA[trains]]></category>
		<category><![CDATA[travel]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1503</guid>

					<description><![CDATA[I’ve just booked travel for getting to Riga, Latvia for GUADEC 2023, and I thought I’d quickly write up my travel plans in case it saves someone else some time in planning travel. I am not flying, because planes are too polluting. Instead, I am taking the train to Lübeck in Germany, then an overnight [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I’ve just booked travel for getting to Riga, Latvia for <a href="https://events.gnome.org/event/101/">GUADEC 2023</a>, and I thought I’d quickly write up my travel plans in case it saves someone else some time in planning travel.</p>



<p class="wp-block-paragraph">I am not flying, because <a href="https://www.theguardian.com/environment/ng-interactive/2019/jul/19/carbon-calculator-how-taking-one-flight-emits-as-much-as-many-people-do-in-a-year">planes are too polluting</a>. Instead, I am taking the train to Lübeck in Germany, then an overnight ferry to Liepāja, and then a bus the following morning to Riga. It’s a bit slower, but means it’s a bit easier to get some hacking done, stretch my legs and move around, and not fund fossil fuel companies as much. I’ll get enough stopover time in Köln, Hamburg and Lübeck to quickly look round, and a night in Liepāja to see it.</p>



<p class="wp-block-paragraph">Overall the travel time is just over 2 days, with half of that spent on trains, and half on a ferry. By comparison, a flight is about 7 hours (5 hours flying, 2 hours faffing in airports) plus travel time to the airport.</p>



<p class="wp-block-paragraph">The carbon emissions (140kgCO2e return) are roughly a quarter of those from flying (520kgCO2e), and interestingly a significant part of those emissions (46kgCO2e) is the 3 hour bus journey to get from Liepāja to Riga, though that’s quite sensitive to the occupancy level of the bus.</p>



<p class="wp-block-paragraph">The financial cost (£800 return) is about two times that of flying (£380), though I have not factored in the costs of getting to/from airports and have not fully explored the hidden fees for baggage and other essentials so the ratio might be a little lower. This is quite upsetting. A disproportionate part of the cost (£178 return) is the Eurostar, because it’s oversubscribed and I missed the early ticket releases due to waiting for grant approval. Perhaps I should not wait next time.</p>



<h2 class="wp-block-heading">The journey</h2>



<p class="wp-block-paragraph">On 2023-07-22:</p>



<ul class="wp-block-list">
<li>Eurostar from London to Brussels-Midi, departing 07:04</li>



<li>Train from Brussels-Midi to Lübeck-Travemünde Skandinavienkai, departing 10:25 (ICE 15, ICE 200, RE 11428, RB 11528)</li>



<li>Nice walk from there to the ferry terminal for half an hour</li>



<li>Overnight <a href="https://www.stenalinetravel.com/routes/travemunde-liepaja">ferry</a> from Lübeck/Travemünde to Liepāja, departing 23:30</li>
</ul>



<p class="wp-block-paragraph">On 2023-07-23: On the ferry all day, then stay overnight in Liepāja</p>



<p class="wp-block-paragraph">On 2023-07-24: <a href="https://www.1188.lv/en/transport/buses/riga/liepaja/200001/200005">Bus</a> from Liepāja to Riga, departing early morning</p>



<h2 class="wp-block-heading">Alternatives</h2>



<p class="wp-block-paragraph">I strongly looked at taking the <a href="https://www.sj.se/en/travel-info/sj-euronight.html">train</a> from Hamburg to Stockholm, and then the <a href="https://www.stenalinetravel.com/routes/ventspils-nynashamn">ferry</a> from there to Ventspils. Unfortunately, it has limited capacity and there is track maintenance planned for around my travel dates, so I could not get suitable tickets. It would have made the timings a little more convenient overall, for about the same overall carbon emissions and cost.</p>



<h2 class="wp-block-heading">Join me</h2>



<p class="wp-block-paragraph">If anybody else is going overland from the UK or far-western Europe, this is hopefully a sensible route for you to take, and it would be lovely if you wanted to join me. I will be arriving 2 days early for GUADEC (as we’re having an Endless OS Foundation meetup), but if you wanted to do the same journey 1 or 2 days later then it shouldn’t differ significantly. In any case, I can put you in touch with others making this journey if you want.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tecnocode.co.uk/2023/05/23/getting-from-the-uk-to-riga-for-guadec-2023/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1503</post-id>	</item>
		<item>
		<title>Tip for debugging refcounting issues: change ref calls to copy</title>
		<link>https://tecnocode.co.uk/2023/02/23/tip-for-debugging-refcounting-issues-change-ref-calls-to-copy/</link>
					<comments>https://tecnocode.co.uk/2023/02/23/tip-for-debugging-refcounting-issues-change-ref-calls-to-copy/#comments</comments>
		
		<dc:creator><![CDATA[Philip Withnall]]></dc:creator>
		<pubDate>Thu, 23 Feb 2023 13:21:04 +0000</pubDate>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[D-Bus]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[GDBus]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[GObject]]></category>
		<guid isPermaLink="false">https://tecnocode.co.uk/?p=1499</guid>

					<description><![CDATA[Over the last couple of days I’ve been looking at a refcounting issue in GLib’s D-Bus implementation. As with many things in GLib, the allocations in this code use refcounting, rather than new/free, to manage object lifecycles. This makes it quite hard to debug lifecycle issues, because the location of a bug (a ref or [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Over the last couple of days I’ve been looking at a <a href="https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3291">refcounting issue in GLib’s D-Bus implementation</a>.</p>



<p class="wp-block-paragraph">As with many things in GLib, the allocations in this code use refcounting, rather than new/free, to manage object lifecycles. This makes it quite hard to debug lifecycle issues, because the location of a bug (a ref or unref call which isn’t correct) can be quite far removed (in time and code) from where the effects of that bug become visible. This is because the effects of refcounting problems only become visible when an object’s refcount reaches zero, or when the program ends and its refcount still hasn’t reached zero.</p>



<p class="wp-block-paragraph">While debugging this code, I tried an approach I haven’t before: <strong>changing some of the ref calls on the buggy object to be copy calls instead</strong>. (Specifically, changing <code>g_object_ref()</code> to <code>g_dbus_message_copy()</code>.) That <strong>split up the lifecycle of the object into smaller pieces</strong>, narrowing down the sets of ref/unref calls which could be buggy. Ultimately, this allowed me to find some bugs in the code, and hopefully those are the bugs causing the refcounting issue. Since the issue is intermittent, it’s a bit hard to be sure.</p>



<p class="wp-block-paragraph">This debugging approach was possible in this case because the object I was debugging is immutable, so passing around copies of it doesn’t affect the behaviour of other bits of code vs passing around the original. Hence this approach is only applicable in some situations. But it’s another good reason why using immutable objects is quite helpful when writing code, and it’s certainly an approach I’m going to be using again when I can.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tecnocode.co.uk/2023/02/23/tip-for-debugging-refcounting-issues-change-ref-calls-to-copy/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
<post-id xmlns="com-wordpress:feed-additions:1">1499</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Object Caching 6/152 objects using APC
Page Caching using Disk: Enhanced (SSL caching disabled) 
Minified using Disk

Served from: tecnocode.co.uk @ 2026-08-30 22:43:14 by W3 Total Cache
-->