<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<description>My site. It has a blog.</description>
		<link>https://alextecplayz.com/</link>
		<title>AlexTECPlayz' Blog</title>
		<category>Tech</category>
		<copyright>Copyright 2020-2026 AlexTECPlayz. All rights reserved.</copyright>
		<docs>https://www.rssboard.org/rss-specification</docs>
		<generator>11ty (Eleventy)</generator>
		<image>
			<link>https://alextecplayz.com/</link>
			<title>AlexTECPlayz' Blog</title>
			<url>/favicon/favicon-32x32.png</url>
			<description>Read my posts via RSS</description>
			<height>32</height>
			<width>32</width>
		</image>
		<language>en</language>
		<item>
					<title><![CDATA[Lessons from PRISONIA, part 1]]></title>
					<link>/posts/2026-02-24-Lessons-from-PRISONIA-part-1.html</link>
					<description>Things I learned while developing PRISONIA, Sapphire, and working with Godot 4.</description>
					<pubDate>Tue, 24 Feb 2026 08:30:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><em>All code displayed here falls under my classic CC BY-NC-SA 4.0 + No AI Scraping license. Fuck off AI, I don't give you permission to train or use any content on my website without my explicit approval, and without paying me what my content is worth.</em></p>
<p>As I get closer to finally being able to show off what I've been working on since August last year, here are a few things I've learned while developing PRISONIA, my Sapphire toolkit, and working with Godot 4.4-4.7.</p>
<h2 id="developing-a-custom-tilemap-in-a-3d-space" tabindex="-1">Developing a custom tilemap in a 3D space</h2>
<p>Developers may want to create their own tilemap implementations due to several reasons, mine was that Godot's own TileMapLayer was not great for my use case. I'm developing the tilemap to exist in a 3D space, not 2D, because I want to support shadows and other rendering features usually seen in 3D.</p>
<p>Let's walk through my attempts, all the way to the current implementation.</p>
<h3 id="unreal-engine-attempts-at-a-3d-tilemap" tabindex="-1">Unreal Engine attempts at a 3D tilemap</h3>
<p>But first, Unreal Engine.</p>
<p>PRISONIA initially started on UE4, before being tested in UE5, and then was moved in July 2025 to Godot.</p>
<p>In Unreal Engine, I initially tried to use Unreal's own Paper2D-based PaperTileMap. Unlike Godot, '2D' in Unreal Engine is still in 3D space, so given enough time and effort, I could have shadows on the Paper2D tilemap. But at the time I couldn't manage to get some basic features in-place, like drawing tiles on it (similar to how in Godot you have tilesets, and you can configure corners and whatnot). And in UE4 (and earlier versions of UE5), Paper2D was still in beta - Paper2D has actually been in beta <strong>for a decade</strong> at this point. It's clear that Epic prioritizes 3D features, and that's fine.</p>
<p>So I tried a custom approach. I don't know the specifics anymore, but I drew my own grid lines via Blueprints and by creating a grid material to draw them, then used mesh instancing (<code>InstancedStaticMesh</code> / ISM) to draw the grid 'tiles'. Once I got a grid layer done, I'd just duplicate above. I'd use struct arrays and used the index to match to each tile, to get my custom tile data, because of course, Unreal doesn't/didn't have custom metadata you could append to nodes - or at least not without creating your own blueprint with variables, and so on.</p>
<p>It of course, didn't perform that great, not even on PC while running in the editor, because after all it's Unreal Engine, if you really want to develop a 2D game in it you have to cut down significantly on lighting, shadows, etc., especially for mobile - which I couldn't get to run on my phone with 4.27, and with 5.2 at the time, it of course was horrible, and the resolution scale was inexplicably bad, both on the Galaxy A10 and the Redmi Note 11.</p>
<p>Barring all that, it was <em>one</em> step closer to my needs, but nowhere near enough.</p>
<h3 id="godot-attempts-at-a-3d-tilemap" tabindex="-1">Godot attempts at a 3D tilemap</h3>
<p>And then I moved to Godot 4.5 on July 7, it was 4.5 beta 2 at the time, and I was still growing accustomed to Godot.</p>
<p>Initially I tried to do it via godot modules or GDExtensions, but I quickly realized while porting portions of other projects that GDscript is very powerful, and you don't leave a lot of performance on the table if you were to use it instead of C++.</p>
<p>Heck, I even tested Terrain3D for a few days to see if I could use it instead, since Godot tilemap's own way of handling corners didn't fit all of my use cases. Safe to say that Terrain3D was both overkill and not great for my needs, despite being quite a competent add-on for other projects.</p>
<p>No, instead, I replicated what I did in Unreal.</p>
<p>For the background, I use a <code>QuadMesh</code> that has the grid background material, and it's located behind the tilemaps. The player is a <code>Node3D</code> that has a <code>CollisionShape3D</code> and a <code>Camera3D</code> using Orthographic projection. I tried both Perspective and Orthographic both in UE and Godot and Orthographic was the one that works the best at retaining a 2D-like scene that has no depth. Ideally, I'd have something in between the two, where I can still preserve some depth, but I'll worry about that later.</p>
<p>At the time, the custom tilemap used one Array variable, the levelList, which would have newly-created floor levels comprised of a <code>Node3D</code> and a <code>GridMap</code> appended to it. A <code>GridMap</code> was used for each level's floor tile map, including a <code>MeshLibrary</code> and a <code>QuadMesh</code>. I'd subdivide the quad (e.g. a 32x32 tilemap would have one quad of size Vector2(32,32) * 0.01), with a width and depth of 1.</p>
<p>While sure, this works well for PC, it effectively creates tens of thousands, if not hundreds of thousands of primitives, which is not handled well by mobile GPUs, especially not by a low-end mid-range phone like the Redmi Note 11, my variant only has 4GBs of RAM, and uses a custom ROM on Android 16 (<em>because I insist on staying on the latest Android version, instead of using Android 13 which is supposedly better for gaming, or the stock ROM</em>), and this would result in all of my background apps (personalDNSfilter, Sunup, Syncthing, and the running game) crashing, due to the fast increase in RAM usage - one such tilemap would take hundreds of MiB of RAM, roughly 100-300 if I remember right. A miserable first attempt, but an attempt nonetheless.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_prisonia_redmicrash_spchk.webm" alt="A screen recording of the game using scrcpy with the GridMap system. I spawn chunks to form a 128x128 tilemap. For debugging purposes, I set the spawn timer to take 0.5s between each tilemap being spawned, to debug memory problems at the time. Given that it's subdividing the quad for each tile, it's generating effectively hundreds of thousands of primitives gradually, and having a massive gradual increase in memory that would be unsustainable." title="A screen recording of the game using scrcpy with the GridMap system. I spawn chunks to form a 128x128 tilemap. For debugging purposes, I set the spawn timer to take 0.5s between each tilemap being spawned, to debug memory problems at the time. Given that it's subdividing the quad for each tile, it's generating effectively hundreds of thousands of primitives gradually, and having a massive gradual increase in memory that would be unsustainable." loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_prisonia_redmicrash_spchk.webm" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>Of course, I also tested <code>TileMap</code> (now deprecated), and <code>TileMapLayer</code>, with limited degrees of success.</p>
<p>I reused the skeleton of the <code>GridMap</code>, created a <code>SubViewport</code> for each floor in which I added each <code>TileMapLayer</code>, then at runtime created a material for each, added the texture of the subviewport and...success! Well, partially. I can't cast 3D shadows this way, and since each floor had one full quad, creating 'holes' would only remove tiles in the tilemaplayer, so even if I were to somehow cast cursed 3D shadows, they wouldn't reach the floor below because there's no physical hole punched in the quad, only the 2D tilemap.</p>
<p>Ugh, back to the drawing board...</p>
<h4 id="road-to-success" tabindex="-1">Road to success</h4>
<p>I pondered about it for a while, I'd continue tweaking the gridmap-based approach then I tried implementing a chunk-based approach, but it unfortunately wasn't great, so it'd still cause issues.</p>
<p>But of course, like all good ideas, they come when you least expect them, and I had a stroke of genius one night at ~3AM before going to sleep: what if I used just one Quad per floor, and punched holes / merged newly-placed tiles into it? Surely this would be hugely more efficient?</p>
<p>And indeed, after refactoring the tilemap which took a little while, the approach proved significantly more performant. The story is that simple, I read the page on <a href="https://docs.godotengine.org/en/latest/tutorials/3d/procedural_geometry/index.html">Procedural Geometry</a> from the Godot Docs, and I looked at all the four techniques, before finally settling on <strong><code>ArrayMesh</code></strong>.</p>
<h5 id="punching-holes" tabindex="-1">Punching holes</h5>
<p>Punching holes also had two stages:</p>
<p>I first experimented with creating a 3x3 area, in which 8 tiles would be created in the quad (16 vertices), and the center to be punched out. I didn't think at the time I could go lower. I basically created 8 tiles around the tile that was supposed to be the hole, and stitched it to the tilemap's quad. It would result in a clean 3x3 area with the tile in the center empty. Success!</p>
<p>But I soon managed to go even lower, so now it's just punching 1 hole, without adding any tiles around it. I just create the amount of vertices required to punch a square 1x1 hole for a tile, which reduced the amount of on-screen vertices even further.</p>
<p>Here's how a hole punch would look with approach 1, vs approach 2:</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_tile_punch1.webp" alt="The first approach to tile holes in the tilemap. It's a diagram of a dark grey grid on which a square tilemap using the colour red is placed. On this tilemap, in the center is a square 1x1 hole. Around this hole, 8 squares are placed in a circular manner, while keeping a square shape." title="The first approach to tile holes in the tilemap. It's a diagram of a dark grey grid on which a square tilemap using the colour red is placed. On this tilemap, in the center is a square 1x1 hole. Around this hole, 8 squares are placed in a circular manner, while keeping a square shape." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_tile_punch1.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The first approach to tile holes in the tilemap. It's a diagram of a dark grey grid on which a square tilemap using the colour red is placed. On this tilemap, in the center is a square 1x1 hole. Around this hole, 8 squares are placed in a circular manner, while keeping a square shape.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_tile_punch2.webp" alt="The second approach to tile holes in the tilemap. It's a diagram of a dark grey grid on which a square tilemap using the colour red is placed. On this tilemap, in the center is a square 1x1 hole." title="The second approach to tile holes in the tilemap. It's a diagram of a dark grey grid on which a square tilemap using the colour red is placed. On this tilemap, in the center is a square 1x1 hole." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_tile_punch2.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The second approach to tile holes in the tilemap. It's a diagram of a dark grey grid on which a square tilemap using the colour red is placed. On this tilemap, in the center is a square 1x1 hole.</p>
					</div>
				</figure>
			</div></div>
<p>So while the first approach would add 16 vertices to each requested hole, the second approach only adds the minimum amount of vertices that creates the hole, and the vertices that connect it to the four corners of the tilemap.</p>
<h5 id="current-implementation" tabindex="-1">Current implementation</h5>
<p>I now currently use a few arrays:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">var</span> floorlist <span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>Node3D<span class="token punctuation">]</span>
<span class="token keyword">var</span> holes <span class="token punctuation">:</span> <span class="token class-name">Dictionary</span>									<span class="token comment"># Dict of Vector3i(floor,tile_x,tile_z)</span>
<span class="token keyword">var</span> dirty_floors <span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>int<span class="token punctuation">]</span>
<span class="token keyword">var</span> dirty_layers <span class="token punctuation">:</span> <span class="token class-name">Array</span>								<span class="token comment"># Array of floor, layer</span>
<span class="token keyword">var</span> floor_data<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>Jailbird_Data_Tile<span class="token punctuation">]</span>

<span class="token comment"># Per floor, per layer</span>
<span class="token keyword">var</span> bg_instances<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>MeshInstance3D<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">var</span> fg_instances<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>MeshInstance3D<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">var</span> top_instances<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>MeshInstance3D<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">var</span> overlay_instances<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>MeshInstance3D<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>

<span class="token keyword">var</span> bg_meshes<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>ArrayMesh<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">var</span> fg_meshes<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>ArrayMesh<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">var</span> top_meshes<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>ArrayMesh<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
<span class="token keyword">var</span> overlay_meshes<span class="token punctuation">:</span> <span class="token class-name">Array</span><span class="token punctuation">[</span>ArrayMesh<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span></code></pre>
<p>I create a Jailbird_Data_Tile for each floor level. Jailbird_Data_Tile is a RefCounted that houses per-(existing/created)tile data in a compact format using packedarrays, like this:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">var</span> has_any_foreground <span class="token operator">:=</span> <span class="token boolean">false</span>
<span class="token keyword">var</span> has_any_top <span class="token operator">:=</span> <span class="token boolean">false</span>
<span class="token keyword">var</span> has_any_overlay <span class="token operator">:=</span> <span class="token boolean">false</span>
<span class="token comment"># [...] I initially tried using a Dictionary, but that would be more memory-expensive, so packedarrays it is</span>
<span class="token keyword">var</span> width<span class="token punctuation">:</span> <span class="token class-name">int</span>							<span class="token comment"># default 1</span>
<span class="token keyword">var</span> height<span class="token punctuation">:</span> <span class="token class-name">int</span>							<span class="token comment"># default 1</span>
<span class="token keyword">var</span> background_type<span class="token punctuation">:</span> <span class="token class-name">PackedInt32Array</span>
<span class="token keyword">var</span> foreground_type<span class="token punctuation">:</span> <span class="token class-name">PackedInt32Array</span>
<span class="token keyword">var</span> top_type<span class="token punctuation">:</span> <span class="token class-name">PackedInt32Array</span>
<span class="token keyword">var</span> foreground_face<span class="token punctuation">:</span> <span class="token class-name">PackedByteArray</span>
<span class="token keyword">var</span> temperature<span class="token punctuation">:</span> <span class="token class-name">PackedInt32Array</span>
<span class="token keyword">var</span> is_outside<span class="token punctuation">:</span> <span class="token class-name">PackedByteArray</span>			<span class="token comment"># 0/1</span>
<span class="token keyword">var</span> is_accessible<span class="token punctuation">:</span> <span class="token class-name">PackedByteArray</span>		<span class="token comment"># 0/1</span>
<span class="token keyword">var</span> occupier_id<span class="token punctuation">:</span> <span class="token class-name">PackedInt32Array</span>		<span class="token comment"># -1 = none, occupier id instead of object ref</span>
<span class="token keyword">var</span> path_cost<span class="token punctuation">:</span> <span class="token class-name">PackedFloat32Array</span>
<span class="token keyword">var</span> sector<span class="token punctuation">:</span> <span class="token class-name">PackedInt32Array</span>
<span class="token keyword">var</span> room<span class="token punctuation">:</span> <span class="token class-name">PackedInt32Array</span>
<span class="token keyword">var</span> utility_face<span class="token punctuation">:</span> <span class="token class-name">PackedByteArray</span>
<span class="token keyword">var</span> utility_mask<span class="token punctuation">:</span> <span class="token class-name">PackedByteArray</span>		<span class="token comment"># bits: 1=water, 2=elec, 4=vent</span>
<span class="token keyword">var</span> dirt_level<span class="token punctuation">:</span> <span class="token class-name">PackedByteArray</span>
<span class="token keyword">var</span> damage_level<span class="token punctuation">:</span> <span class="token class-name">PackedByteArray</span>
<span class="token keyword">var</span> tags<span class="token punctuation">:</span> <span class="token class-name">PackedStringArray</span></code></pre>
<p>The background is now created at runtime in the level itself, by creating a QuadMesh with that same grid material, it's tied to the position of the player and the viewport size, all while drawing only two triangles (vertices, as Godot names them in the Debugger UI). I set the width and height at runtime, and can alter the background and the colour of the grid depending on the game mode (e.g. Mod Studio (WIP), else set a dark grey colour).</p>
<h5 id="using-one-arraymesh-for-each-layer-of-a-floor" tabindex="-1">Using one ArrayMesh for each layer of a floor</h5>
<p>One floor of the tilemap is now comprised of four floor layers: BG, FG, TOP, OVERLAY. A floor level is created via an Node3D, and it's there just to keep things organized and easy to debug, and a MeshInstance3D. All layers except BG are set as not visible for now, until I finish working out how the tile data is supposed to interact with the tilemap and additional modes such as building stuff on the tilemap, adding and removing tiles, but I'm still thinking on the approach used by the Jailbird_Data_Tile, since I already see a few ways in which it could be broken to not display stuff depending on the present bits in the arrays, especially for the overlay layer.</p>
<p>For each of the four floor layers, I create a floor quad using an ArrayMesh, manually set the width and height via tilemap_width * tileSize (and tilemap_height * tileSize, respectively), where tilemap_height/width is an int (e.g. 32 by default), and tileSize is a float with value 0.32. So one tile is 10.24 units in world space.</p>
<p>I then manually set up the vertices via an array, and the normals, UVs and indices, and finally, create the mesh via ArrayMesh.add_surface_from_arrays():</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">func</span> <span class="token function">_create_single_floor_quad</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token class-name">ArrayMesh</span><span class="token punctuation">:</span>
	<span class="token keyword">var</span> mesh <span class="token operator">=</span> ArrayMesh<span class="token punctuation">.</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	<span class="token keyword">var</span> arrays <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
	arrays<span class="token punctuation">.</span><span class="token function">resize</span><span class="token punctuation">(</span>Mesh<span class="token punctuation">.</span><span class="token constant">ARRAY_MAX</span><span class="token punctuation">)</span>
	
	<span class="token keyword">var</span> width <span class="token operator">=</span> tilemap_width <span class="token operator">*</span> tileSize
	<span class="token keyword">var</span> height <span class="token operator">=</span> tilemap_height <span class="token operator">*</span> tileSize

	<span class="token keyword">var</span> vertices <span class="token operator">=</span> <span class="token function">PackedVector3Array</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
		<span class="token function">Vector3</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span>				<span class="token comment"># Bottom left</span>
		<span class="token function">Vector3</span><span class="token punctuation">(</span>width<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span>			<span class="token comment"># Bottom right</span>
		<span class="token function">Vector3</span><span class="token punctuation">(</span>width<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> height<span class="token punctuation">)</span><span class="token punctuation">,</span>		<span class="token comment"># Top right</span>
		<span class="token function">Vector3</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> height<span class="token punctuation">)</span>			<span class="token comment"># Top left</span>
	<span class="token punctuation">]</span><span class="token punctuation">)</span>

	<span class="token keyword">var</span> normals <span class="token operator">=</span> <span class="token function">PackedVector3Array</span><span class="token punctuation">(</span><span class="token punctuation">[</span>Vector3<span class="token punctuation">.</span><span class="token constant">UP</span><span class="token punctuation">,</span> Vector3<span class="token punctuation">.</span><span class="token constant">UP</span><span class="token punctuation">,</span> Vector3<span class="token punctuation">.</span><span class="token constant">UP</span><span class="token punctuation">,</span> Vector3<span class="token punctuation">.</span><span class="token constant">UP</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
	<span class="token keyword">var</span> uvs <span class="token operator">=</span> <span class="token function">PackedVector2Array</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token function">Vector2</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Vector2</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Vector2</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Vector2</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
	<span class="token keyword">var</span> indices <span class="token operator">=</span> <span class="token function">PackedInt32Array</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>

	arrays<span class="token punctuation">[</span>Mesh<span class="token punctuation">.</span><span class="token constant">ARRAY_VERTEX</span><span class="token punctuation">]</span> <span class="token operator">=</span> vertices
	arrays<span class="token punctuation">[</span>Mesh<span class="token punctuation">.</span><span class="token constant">ARRAY_NORMAL</span><span class="token punctuation">]</span> <span class="token operator">=</span> normals
	arrays<span class="token punctuation">[</span>Mesh<span class="token punctuation">.</span><span class="token constant">ARRAY_TEX_UV</span><span class="token punctuation">]</span> <span class="token operator">=</span> uvs
	arrays<span class="token punctuation">[</span>Mesh<span class="token punctuation">.</span><span class="token constant">ARRAY_INDEX</span><span class="token punctuation">]</span> <span class="token operator">=</span> indices

	mesh<span class="token punctuation">.</span><span class="token function">add_surface_from_arrays</span><span class="token punctuation">(</span>Mesh<span class="token punctuation">.</span><span class="token constant">PRIMITIVE_TRIANGLES</span><span class="token punctuation">,</span> arrays<span class="token punctuation">)</span>
	<span class="token keyword">return</span> mesh</code></pre>
<p>Took me a bit to figure this stuff out, but thankfully it's a one-time addition to the code, you don't have to touch this unless you do stuff like punching holes, adding individual tiles to a mesh, etc.</p>
<h5 id="tile-metadata" tabindex="-1">Tile metadata</h5>
<p>The four floor layers - BG, FG, TOP, OVERLAY - are supposed to represent the contents (texture) of one tile. BG is the background, such as floor material (e.g. dirt, concrete), FG takes care of objects on top of BG such as walls or objects (e.g. bed, crate, fridge), TOP takes care of ceiling-mounted lights and other such items, and OVERLAY is a special, all-in-one layer that at runtime is supposed to display the requested data. OVERLAY takes care of displaying textures that represent electricity, water, vents, deployment, sectors, temperature, and possibly more.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_data.webp" alt="A diagram with a grey grid which explains the four floor layers, BG, FG, TOP, OVERLAY and what they each represent, and the JAILBIRD_DATA_TILE data container. Overlay represents electricity, water, deployment, sectors, etc. Top represents Lights, ceiling-attached objects. FG represents walls, entryways, furniture. BG represents floors, terrain. JAILBIRD_DATA_TILE contains data such as width, height, bg, fg, top, etc." title="A diagram with a grey grid which explains the four floor layers, BG, FG, TOP, OVERLAY and what they each represent, and the JAILBIRD_DATA_TILE data container. Overlay represents electricity, water, deployment, sectors, etc. Top represents Lights, ceiling-attached objects. FG represents walls, entryways, furniture. BG represents floors, terrain. JAILBIRD_DATA_TILE contains data such as width, height, bg, fg, top, etc." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_data.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A diagram with a grey grid which explains the four floor layers, BG, FG, TOP, OVERLAY and what they each represent, and the JAILBIRD_DATA_TILE data container. Overlay represents electricity, water, deployment, sectors, etc. Top represents Lights, ceiling-attached objects. FG represents walls, entryways, furniture. BG represents floors, terrain. JAILBIRD_DATA_TILE contains data such as width, height, bg, fg, top, etc.</p>
					</div>
				</figure>
			</div></div>
<p>And then creating tiles, or punching holes in the tilemap, this one took the longest time, since it's easy to bork it if you're not paying attention.</p>
<p>But in the easiest way to explain it, when you add or remove tiles, you then mark the layer on which you performed the action as &quot;dirty&quot;, which means it needs to be rebuilt. You really don't want to keep layers dirty for too long, since each of these actions (removing or adding tiles) would increase the amount of primitives needed to be rendered, and thus making it more expensive on the CPU to rebuild the layer - since <a href="https://docs.godotengine.org/en/latest/tutorials/3d/procedural_geometry/index.html">all procedural geometry generation methods described in Godot Docs - ArrayMesh, MeshDataTool, SurfaceTool, ImmediateMesh - <strong>run on the CPU</strong>, not the GPU</a>. Future support for GPU-based procgen geometry may happen someday.</p>
<p>THANKFULLY, because of the fact that it's merging all vertices in order to keep the primitive size down when I punch a hole or add a new tile, this operation is <em>significantly cheaper</em> on mobile. Before, because I used to subdivide the quad (e.g. a 32x32 tilemapp would result in 32x32 tiles), rebuilding would take longer especially since it's done on _process when the number of dirty_floors exceeds 0, and would result in quite significant frame spikes from the CPU, and because it would only add more and more primitives each time something like that would happen (and because I have the TileMapSpawner adding a new chunk each 1 frame - it was set to 0.5 for testing, as it would almost instantly crash the game on mobile on 0.01 at the time), the RAM would spike significantly. It would add roughly 50-100MiB per tilemap chunk spawned. On PC, it reached a whole-ass GiB of RAM when spawning multiple 32x32 tilemaps to form a 128x128 tilemap.</p>
<p>Also take in account that Godot automatically performs frustrum culling where possible, so even if I'm on say, the ground floor (6), while sure I may set floors 0-5 visible, they still may get culled if there's no holes in the current floor.</p>
<p>Because remember, each tilemap has multiple floors, and each floor has multiple layers. At this time, I'm using 11 floors (0-5 are &quot;underground&quot; floors, 6 is the ground floor, 7-11 are the over-ground floors). You should be able to take a guess as to why that would crash a phone that has ~1GB of available RAM, especially if you also didn't perform any RAM memory reductions and CPU optimization, or to reduce primitive count.</p>
<p><strong>When developing for mobile, you should also test on a mid-range phone that uses a custom ROM and not a lot of RAM.</strong> Why? Take my current phone for example, the Redmi Note 11 uses a custom ROM, but you have to understand that this phone has poor RAM and zRAM (compressed swap in RAM) management. So if you're loading big images or running heavy memory operations, you quickly exhaust physical RAM. This forces the system to compress and swap pages via zRAM, which lives on slower NAND flash storage (in short, memory pressure from large enough assets or operations). Mid-ranger NAND speeds (like UFS 2.x) aren't flagship-fast, so this constant compress/decompress cycle causes RAM thrashing: the CPU stalls waiting for I/O, leading to stutters, hitches, and crashes if it gets bad enough.</p>
<p>Go through Project Settings, look at each feature related to graphics and textures, reduce some values and test. Tweak some other values, test again. You'll soon notice which settings consume more RAM and VRAM, and you'll find the sweet spot eventually.</p>
<h5 id="rough-performance-metrics" tabindex="-1">Rough performance metrics</h5>
<p>So what you essentially have to do is reduce the number of disk operations, and keep your RAM+VRAM usage within reasonable limits for a phone of this calibre.</p>
<p>Anyway, rough performance metrics on mobile (Redmi Note 11):</p>
<table>
<thead>
<tr>
<th>Metric (Godot)</th>
<th>GridMap</th>
<th>ArrayMesh (att. 1)</th>
<th>AM (2)</th>
<th>Godot ArrayMesh (current)</th>
</tr>
</thead>
<tbody>
<tr>
<td>FPS</td>
<td>2-20 FPS</td>
<td>10-20 FPS</td>
<td>20-23 FPS</td>
<td><strong>40 FPS</strong> (ground floor),<br>47 FPS (lowest floor),<br>40FPS (highest floor)</td>
</tr>
<tr>
<td>Primitives</td>
<td><strong>&gt;100K primitives</strong></td>
<td><strong>4008</strong></td>
<td>~4008</td>
<td><strong>2606</strong> (ground floor),<br>2494 (lowest floor, many tile holes added),<br>2718 (highest floor, more tile holes added)</td>
</tr>
<tr>
<td>Static Memory (MiB)</td>
<td>200 MiB-upwards of 400, then crash</td>
<td>115 MiB</td>
<td>~115 MiB</td>
<td><strong>88.09 MiB</strong>, with small, smooth increases</td>
</tr>
<tr>
<td>Video Memory (MiB)</td>
<td>210 MiB</td>
<td>202.6 MiB</td>
<td>202.3 MiB</td>
<td><strong>75.20 MiB</strong>, with no spikes</td>
</tr>
<tr>
<td>State</td>
<td>On load, chunks loading...</td>
<td>On load, all chunks loaded</td>
<td>On load, all chunks loaded</td>
<td>On load, all chunks loaded, post-load, many tile holes added using timescale 100</td>
</tr>
<tr>
<td>Changes</td>
<td>The initial GridMap approach</td>
<td>Initial ArrayMesh attempt, added 3x3 cutout zone</td>
<td>Reuse one ArrayMesh per floor, 1x1 cutout zone</td>
<td>Use gl_compatibility, move from JoltPhysics to GodotPhysics3D + set it to run in a separate thread, set reflection size to 4, disable shadow casting from my sky light and environment, MSAA 3D to 8x, glow upscale mode to 0 (faster), also set the material of the tilemap to not receive shadows</td>
</tr>
</tbody>
</table>
<p>And a video that shows off the tilemap system on Linux as of February 6, which is as of Feb 24, the current implementation:</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_sapphire_tilemap_20260206.webm" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_sapphire_tilemap_20260206.webm" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>This video is the game being launched via the editor, note how it starts at 107.5 MiB static RAM memory, and 183.6 MiB VRAM. It starts with roughly 6570 primitives drawn before falling to 3176 on the ground floor, with many holes being added, as the tilemap system handles the 'dirty' layers and removing primitives where possible. You can see how they're also connected to the quad through these horizontal streaks in wireframe mode. Clean, 1x1 holes in the quad. With a lot more holes in the quad on the ground floor, it goes to 12752 vertices. On the highest floor level it goes to 76322 vertices.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_tilemap_wireframe_f0.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_tilemap_wireframe_f0.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_tilemap_wireframe_f11.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_tilemap_wireframe_f11.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_tilemap_wireframe_f11_closeup.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_tilemap_wireframe_f11_closeup.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>I want to continue minimizing the amount of primitives in the future by culling lower floors when there's no tile underneath. But at this point, the primitive count is well below the 2 million vertex limit (180 MB VRAM) on Mali GPUs for mobile - so at least for now, it's no longer the priority when it comes to performance optimization. Current stats on Linux:</p>
<table>
<thead>
<tr>
<th>Metric (Godot)</th>
<th>Godot ArrayMesh (current)</th>
</tr>
</thead>
<tbody>
<tr>
<td>FPS</td>
<td>60 FPS</td>
</tr>
<tr>
<td>Primitives</td>
<td>~2000 primitives without punching any holes; 26994 primitives with lots of holes on all 11 floors</td>
</tr>
<tr>
<td>Static Memory (MiB)</td>
<td>87.52 MiB</td>
</tr>
<tr>
<td>Video Memory (MiB)</td>
<td>228.1 MiB, using Mobile rendering mode (not gl_compatibility)</td>
</tr>
</tbody>
</table>
<p>So, ~2000 primitives on startup (with the current setup, no holes added) vs &gt;100K if you were to subdivide each tile in the quad. That's a whopping <strong>98.2% decrease in primitives</strong>! And once you start adding lots of holes, and you reach, let's say, ~30K primitives? That's still a <strong>75% decrease</strong>.</p>
<h4 id="future-work" tabindex="-1">Future work</h4>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_castingshadows.webp" alt="A diagram with a black background on which all 11 floors are overlaid on top of each other, in an isometric view. The first 5 floors (underground levels) are coloured brown, the ground floor (6) is coloured dark green, the last 5 floors (overground levels) are coloured light blue, to indicate they're empty. There is a zoomed view of two floors - ground floor and the first floor above, which is empty. On the ground floor there is an isometric red building which is supposed to cast a shadow behind it, as the light direction of the sky is facing north-east." title="A diagram with a black background on which all 11 floors are overlaid on top of each other, in an isometric view. The first 5 floors (underground levels) are coloured brown, the ground floor (6) is coloured dark green, the last 5 floors (overground levels) are coloured light blue, to indicate they're empty. There is a zoomed view of two floors - ground floor and the first floor above, which is empty. On the ground floor there is an isometric red building which is supposed to cast a shadow behind it, as the light direction of the sky is facing north-east." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_diagram_tilemap_castingshadows.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A diagram with a black background on which all 11 floors are overlaid on top of each other, in an isometric view. The first 5 floors (underground levels) are coloured brown, the ground floor (6) is coloured dark green, the last 5 floors (overground levels) are coloured light blue, to indicate they're empty. There is a zoomed view of two floors - ground floor and the first floor above, which is empty. On the ground floor there is an isometric red building which is supposed to cast a shadow behind it, as the light direction of the sky is facing north-east.</p>
					</div>
				</figure>
			</div></div>
<aside class="aside-content monospace lightgray rem1"><p class="monospace bold rem1 hidden-on-desktop">Aside for paragraph below:</p><p>But the <em>problem</em> with this approach is that I'd have to create unique shadow shapes for many kinds of objects, it's not particularly sustainable in the long-term as I keep adding new content. Honestly, I think it'll just be a toggle to enable or disable settings on lower-end devices, and that's that.</p>
</aside>
<p>Obviously, this isn't the end for the tilemap. I still need to cast shadows to it, and try to cast shadows on mobile without decimating performance. Unfortunately, because I'm using <code>gl_compatibility</code> on my phone, this unfortunately <a href="https://techhub.social/@alextecplayz/111054112284086789">excludes the idea of casting fake shadows</a> via decals, but not via textures 😊, so not all hope is lost for phones like mine.</p>
<p>Tiles will use <code>TextureAtlas</code>es from a few sprites, that's the simpler stuff of the bunch. And I need to implement my own 3x3 'brush' for walls and terrain, so that it blends nicely.</p>
<h2 id="sapphire" tabindex="-1">Sapphire</h2>
<p>Okay, this has been through some stuff. Sapphire initially started out as a <a href="/posts/2024-01-14-Sapphire-thread.html">game engine fork of Godot</a>, but I've since then abandoned that idea, choosing to move everything to a few GDscript plugins.</p>
<p>And I've never been happier! I don't really have to worry about new upstream commits from Godot performing some advanced changes that I can't easily fix, since I don't know <em>every</em> aspect of Godot via C++, <em>just enough to get by</em>. But, I've grown to love GDscript, and it's surprisingly damn good for a scripting language. And unlike Unreal Engine where if you need some advanced features or handle big data, you <em>must use C++</em>. I reiterate again how Unreal Engine 5 had a <a href="https://techhub.social/@alextecplayz/112287504699406857">major performance issue if you'd add items to a Blueprint Struct</a>. To no one's surprise, it doesn't happen in UE4.27.2, the last version of Unreal 4. If you want that in UE5, use C++, because it won't work in the UI unless you either restart frequently or have plenty of free RAM to handle whatever memory leak is being caused by the struct.</p>
<p>So far, everything is separated into three plugins: <code>Sapphire</code>, <code>Sapphire.Editor</code>, and <code>Sapphire.Material3</code> (<code>Sapphire.Material3</code> will be open-sourced when it's ready). Let's explore each plugin in detail. But if you want to skip that, it's totally fine. Here's a nice graph that explains the hierarchy of the three, and how they interact with the Godot Editor.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/sapphire_plugins_chart.webp" alt="A chart of the three Sapphire plugins and how they interact with Godot Engine." title="A chart of the three Sapphire plugins and how they interact with Godot Engine." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/sapphire_plugins_chart.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A chart of the three Sapphire plugins and how they interact with Godot Engine.</p>
					</div>
				</figure>
			</div></div>
<h3 id="plugin%3A-sapphire" tabindex="-1">Plugin: Sapphire</h3>
<p>File size as of 24.02.2026: 6.3 MB (without the .git folder)</p>
<h4 id="console" tabindex="-1">Console</h4>
<p><strong>PREFACE: If you want a good console that is similar, try <a href="https://github.com/jitspoe/godot-console">jitspoe/godot-console</a>, it's surprisingly good!</strong></p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_sapphire_console_cvrs.webm" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_sapphire_console_cvrs.webm" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure>
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_sapphire_console_gds.webm" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_sapphire_console_gds.webm" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>The console is of course, inspired by the Source engine console, but I modernized it by adding a few features that are especially useful. You can execute GDscript directly in the console, and you can quickly toggle the DevUI with the click of a button. I'm also working on a search / filter functionality, and the ability to specify a category before the text, which is useful for both filtering and determining what ran the command. For example, instead of &quot;[19:48:38] INFO: Sapphire plugin enabled&quot;, you'll see &quot;[SapphirePlugin] [19:48:38] INFO Sapphire plugin enabled&quot;.</p>
<p>I shamelessly yoinked some of the commands, such as buddha, god, noclip, notarget, _restart, _autosave from <a href="https://developer.valvesoftware.com/wiki/Console_Command_List">Source's console command list</a>, I did it on purpose because I'm so used to Source engine commands that I wouldn't want to use other types like Unreal's 'ghost' or 'fly' commands, those are just so...<em>odd</em>.</p>
<p>The console will soon have a dependency on Schema, or at least one of Schema's systems, which would be a GDScript parser. Yes, a GDScript parser within GDScript, or at the very least I'll try. The issue is that when you type something in the Console's GDscript and it's not correct, when running in the editor it pauses execution on the error, but at runtime it just gives you an error that isn't sent to the console itself. So either I send the error, or I try to interpret the code myself.</p>
<p>Console errors use Godot's <code>Engine.capture_script_backtraces()</code>, so it's not some custom implementation. And it's quite good, you can call it from say, script A where you move the player, and it'll return an accurate backtrace that starts there and ends at the console logger.</p>
<p>And yes, the console is localized. Speaking of...</p>
<h4 id="localization" tabindex="-1">Localization</h4>
<p>Sapphire comes with two CSV files, one is used by UI text such as Settings, the Console and the console command outputs, and the CC0 <a href="https://docs.google.com/spreadsheets/d/17f0dQawb-s_Fd7DHgmVvJoEGDMH_yoSd8EYigrb0zmM/edit?gid=296134756#gid=296134756">Polyglot Gamedev sheet</a>. Thankfully, someone else has <a href="https://github.com/WeekieNHN/localization_package">converted it to a Godot-accepted CSV format</a>, I stumbled upon it while learning how to localize stuff in Godot, and <a href="https://www.youtube.com/watch?v=vD5mha26JXo">their <em>very</em> helpful video</a> links to it. Honestly, <a href="https://www.youtube.com/@weekie/videos">subscribe to Weekie</a>, his videos are pretty cool.</p>
<h4 id="settings" tabindex="-1">Settings</h4>
<p>Settings, you say? Yes, a universal settings menu that lets me select what options to enable and expose to the user, as well as UI customization by passing a Texture, and setting TextureAtlases' Rect2 values to their corresponding coordinates, which is really nice, because I don't have to fiddle with creating settings menus from the ground up again. Unfortunately, I don't have footage of this at the moment since I'm still hard at work on it, but you'll see it in part 2 or PRISONIA footage, whichever one comes first.</p>
<h4 id="glyphimage%2C-glyphtouch" tabindex="-1">GlyphImage, GlyphTouch</h4>
<p>Two UI nodes that handle glyphs for two different purposes. GlyphImage shows you the glyphs of a given input action in either the Settings-set input glyph display mode (e.g. XBOX), or override it and set it to show a different glyph set, like for keyboard and mouse, or Switch 2. And it lets you toggle between regular or 2x (higher resolution) textures.</p>
<p>GlyphTouch on the other hand comes with a few pre-made touch gestures that I can use as tutorial hints for players using touch screens. Really handy stuff!</p>
<p>Both of them use <a href="https://kenney.nl/assets/input-prompts">Kenney's CC0-licensed Input Prompts</a>, they use the _sheet_default.png and _sheet_double.png files, it's significantly better than loading each <em>individual glyph, which needlessly adds to the VRAM used by the game</em>. Work smarter, not harder. Don't just throw individual glyphs into VRAM, please just use a single texture and use texture atlases instead, it's significantly cheaper and objectively the best way to go about it.</p>
<h4 id="schema" tabindex="-1">Schema</h4>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/sapphire_schema_chart.webp" alt="A chart of Schema's inner workings and how they interact with each other." title="A chart of Schema's inner workings and how they interact with each other." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/sapphire_schema_chart.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A chart of Schema's inner workings and how they interact with each other.</p>
					</div>
				</figure>
			</div></div>
<p><strong>Schema hasn't seen updates since September 2025, it's still highly experimental and very prone to breakage!</strong></p>
<p>Schema is a project to generate node graphs for visual scripting using GDscript. When you create a node with Schema, you're writing GDscript. When you're writing GDscript, Schema automatically adds graph nodes depending on what you code.</p>
<p>It's comprised of multiple parts, each with their own purpose.</p>
<h5 id="schema%3A-generators-and-generated-files" tabindex="-1">Schema: generators and generated files</h5>
<p>In order for GDscript nodes to be added to the graph, first you need to know what is part of the Class List, and then separately, extract the methods and properties used by the Class List. In come two extremely simple generators that write to two files.</p>
<p><code>Schema_Gen_ClassList</code>, which writes a <code>PackedStringArray</code> to a new file, <code>Schema_ClassList</code>. It's this simple:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">extends</span> <span class="token class-name">Node</span>
<span class="token keyword">class_name</span> <span class="token class-name">Schema_Gen_ClassList</span>

<span class="token keyword">const</span> <span class="token constant">CLASSLIST_PATH</span> <span class="token operator">=</span> <span class="token string">"res://addons/Sapphire_SchemaEditor/classlist_generated.gd"</span>

<span class="token keyword">func</span> <span class="token function">_ready</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
	<span class="token function">create_class_list_file</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token function">create_class_list_file</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
	<span class="token keyword">var</span> class_list <span class="token operator">=</span> ClassDB<span class="token punctuation">.</span><span class="token function">get_class_list</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

	<span class="token comment"># Check if the file already exists</span>
	<span class="token keyword">var</span> classlistfile <span class="token operator">=</span> FileAccess<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token constant">CLASSLIST_PATH</span><span class="token punctuation">,</span> FileAccess<span class="token punctuation">.</span><span class="token constant">READ_WRITE</span><span class="token punctuation">)</span>

	<span class="token comment"># Write the PackedStringArray to the file</span>
	classlistfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"extends Resource"</span><span class="token punctuation">)</span>
	classlistfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"class_name Schema_ClassList"</span><span class="token punctuation">)</span>
	classlistfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"var classList = PackedStringArray(["</span><span class="token punctuation">)</span>

	<span class="token keyword">for</span> className <span class="token keyword">in</span> class_list<span class="token punctuation">:</span>
		classlistfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"	\""</span> <span class="token operator">+</span> className <span class="token operator">+</span> <span class="token string">"\","</span><span class="token punctuation">)</span>

	classlistfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"])"</span><span class="token punctuation">)</span>

	classlistfile<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<p>and <code>Schema_Gen_ClassDB</code>, which writes a <code>Dictionary</code> to a new file, <code>Schema_ClassDB</code> with the methods and properties exposed by GDscript classes:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">extends</span> <span class="token class-name">Node</span>
<span class="token keyword">class_name</span> <span class="token class-name">Schema_Gen_ClassDB</span>

<span class="token keyword">const</span> <span class="token constant">CLASSDB_PATH</span> <span class="token operator">=</span> <span class="token string">"res://addons/Sapphire_SchemaEditor/classdb_generated.gd"</span>

<span class="token keyword">func</span> <span class="token function">create_class_db_file</span><span class="token punctuation">(</span>input<span class="token punctuation">:</span> <span class="token class-name">Dictionary</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
	<span class="token keyword">var</span> classdb <span class="token operator">=</span> input

	<span class="token comment"># Check if the file already exists</span>
	<span class="token keyword">var</span> classdbfile <span class="token operator">=</span> FileAccess<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token constant">CLASSDB_PATH</span><span class="token punctuation">,</span> FileAccess<span class="token punctuation">.</span><span class="token constant">READ_WRITE</span><span class="token punctuation">)</span>

	<span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"D | Schema | Generating the ClassDB file..."</span><span class="token punctuation">)</span>

	<span class="token comment"># Write the header for the GDScript file</span>
	classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"extends Resource"</span><span class="token punctuation">)</span>
	classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"class_name Schema_ClassDB"</span><span class="token punctuation">)</span>
	classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"var classDB = {"</span><span class="token punctuation">)</span>

	<span class="token keyword">for</span> className <span class="token keyword">in</span> classdb<span class="token punctuation">:</span>
		<span class="token keyword">var</span> classInfo <span class="token operator">=</span> classdb<span class="token punctuation">[</span>className<span class="token punctuation">]</span>
		<span class="token keyword">var</span> methods <span class="token operator">=</span> classInfo<span class="token punctuation">.</span>methods
		<span class="token keyword">var</span> properties <span class="token operator">=</span> classInfo<span class="token punctuation">.</span>properties

		<span class="token comment"># Build methods string</span>
		<span class="token keyword">var</span> methods_list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
		<span class="token keyword">for</span> method <span class="token keyword">in</span> methods<span class="token punctuation">:</span>
			methods_list<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"\""</span> <span class="token operator">+</span> method <span class="token operator">+</span> <span class="token string">"\""</span><span class="token punctuation">)</span>
		<span class="token keyword">var</span> methods_str <span class="token operator">=</span> <span class="token string">"["</span> <span class="token operator">+</span> <span class="token string">", "</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>methods_list<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"]"</span>

		<span class="token comment"># Build properties string</span>
		<span class="token keyword">var</span> properties_list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
		<span class="token keyword">for</span> property <span class="token keyword">in</span> properties<span class="token punctuation">:</span>
			properties_list<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"\""</span> <span class="token operator">+</span> property <span class="token operator">+</span> <span class="token string">"\""</span><span class="token punctuation">)</span>
		<span class="token keyword">var</span> properties_str <span class="token operator">=</span> <span class="token string">"["</span> <span class="token operator">+</span> <span class="token string">", "</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>properties_list<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"]"</span>

		<span class="token comment"># Write the class information to the file</span>
		classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"	\""</span> <span class="token operator">+</span> className <span class="token operator">+</span> <span class="token string">"\": {"</span><span class="token punctuation">)</span>
		classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"		\"className\": \""</span> <span class="token operator">+</span> className <span class="token operator">+</span> <span class="token string">"\","</span><span class="token punctuation">)</span>
		classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"		\"methods\": "</span> <span class="token operator">+</span> methods_str <span class="token operator">+</span> <span class="token string">","</span><span class="token punctuation">)</span>
		classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"		\"properties\": "</span> <span class="token operator">+</span> properties_str<span class="token punctuation">)</span>
		classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"	},"</span><span class="token punctuation">)</span>

	classdbfile<span class="token punctuation">.</span><span class="token function">store_line</span><span class="token punctuation">(</span><span class="token string">"}"</span><span class="token punctuation">)</span>

	classdbfile<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<p>The output files look like this:<br>
<br>
<code>Schema_ClassDB</code>:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">extends</span> <span class="token class-name">Resource</span>
<span class="token keyword">class_name</span> <span class="token class-name">Schema_ClassDB</span>
<span class="token keyword">var</span> classDB <span class="token operator">=</span> <span class="token punctuation">{</span>
	<span class="token string">"AESContext"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
		<span class="token string">"className"</span><span class="token punctuation">:</span> <span class="token string">"AESContext"</span><span class="token punctuation">,</span>
		<span class="token string">"methods"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"start"</span><span class="token punctuation">,</span> <span class="token string">"update"</span><span class="token punctuation">,</span> <span class="token string">"get_iv_state"</span><span class="token punctuation">,</span> <span class="token string">"finish"</span><span class="token punctuation">,</span> <span class="token string">"init_ref"</span><span class="token punctuation">,</span> <span class="token string">"reference"</span><span class="token punctuation">,</span> <span class="token string">"unreference"</span><span class="token punctuation">,</span> <span class="token string">"get_reference_count"</span><span class="token punctuation">,</span> <span class="token string">"free"</span><span class="token punctuation">,</span> <span class="token string">"_init"</span><span class="token punctuation">,</span> <span class="token string">"_to_string"</span><span class="token punctuation">,</span> <span class="token string">"_notification"</span><span class="token punctuation">,</span> <span class="token string">"_set"</span><span class="token punctuation">,</span> <span class="token string">"_get"</span><span class="token punctuation">,</span> <span class="token string">"_get_property_list"</span><span class="token punctuation">,</span> <span class="token string">"_validate_property"</span><span class="token punctuation">,</span> <span class="token string">"_property_can_revert"</span><span class="token punctuation">,</span> <span class="token string">"_property_get_revert"</span><span class="token punctuation">,</span> <span class="token string">"_iter_init"</span><span class="token punctuation">,</span> <span class="token string">"_iter_next"</span><span class="token punctuation">,</span> <span class="token string">"_iter_get"</span><span class="token punctuation">,</span> <span class="token string">"get_class"</span><span class="token punctuation">,</span> <span class="token string">"is_class"</span><span class="token punctuation">,</span> <span class="token string">"set"</span><span class="token punctuation">,</span> <span class="token string">"get"</span><span class="token punctuation">,</span> <span class="token string">"set_indexed"</span><span class="token punctuation">,</span> <span class="token string">"get_indexed"</span><span class="token punctuation">,</span> <span class="token string">"get_property_list"</span><span class="token punctuation">,</span> <span class="token string">"get_method_list"</span><span class="token punctuation">,</span> <span class="token string">"property_can_revert"</span><span class="token punctuation">,</span> <span class="token string">"property_get_revert"</span><span class="token punctuation">,</span> <span class="token string">"notification"</span><span class="token punctuation">,</span> <span class="token string">"to_string"</span><span class="token punctuation">,</span> <span class="token string">"get_instance_id"</span><span class="token punctuation">,</span> <span class="token string">"set_script"</span><span class="token punctuation">,</span> <span class="token string">"get_script"</span><span class="token punctuation">,</span> <span class="token string">"set_meta"</span><span class="token punctuation">,</span> <span class="token string">"remove_meta"</span><span class="token punctuation">,</span> <span class="token string">"get_meta"</span><span class="token punctuation">,</span> <span class="token string">"has_meta"</span><span class="token punctuation">,</span> <span class="token string">"get_meta_list"</span><span class="token punctuation">,</span> <span class="token string">"add_user_signal"</span><span class="token punctuation">,</span> <span class="token string">"has_user_signal"</span><span class="token punctuation">,</span> <span class="token string">"remove_user_signal"</span><span class="token punctuation">,</span> <span class="token string">"emit_signal"</span><span class="token punctuation">,</span> <span class="token string">"call"</span><span class="token punctuation">,</span> <span class="token string">"call_deferred"</span><span class="token punctuation">,</span> <span class="token string">"set_deferred"</span><span class="token punctuation">,</span> <span class="token string">"callv"</span><span class="token punctuation">,</span> <span class="token string">"has_method"</span><span class="token punctuation">,</span> <span class="token string">"get_method_argument_count"</span><span class="token punctuation">,</span> <span class="token string">"has_signal"</span><span class="token punctuation">,</span> <span class="token string">"get_signal_list"</span><span class="token punctuation">,</span> <span class="token string">"get_signal_connection_list"</span><span class="token punctuation">,</span> <span class="token string">"get_incoming_connections"</span><span class="token punctuation">,</span> <span class="token string">"connect"</span><span class="token punctuation">,</span> <span class="token string">"disconnect"</span><span class="token punctuation">,</span> <span class="token string">"is_connected"</span><span class="token punctuation">,</span> <span class="token string">"has_connections"</span><span class="token punctuation">,</span> <span class="token string">"set_block_signals"</span><span class="token punctuation">,</span> <span class="token string">"is_blocking_signals"</span><span class="token punctuation">,</span> <span class="token string">"notify_property_list_changed"</span><span class="token punctuation">,</span> <span class="token string">"set_message_translation"</span><span class="token punctuation">,</span> <span class="token string">"can_translate_messages"</span><span class="token punctuation">,</span> <span class="token string">"tr"</span><span class="token punctuation">,</span> <span class="token string">"tr_n"</span><span class="token punctuation">,</span> <span class="token string">"get_translation_domain"</span><span class="token punctuation">,</span> <span class="token string">"set_translation_domain"</span><span class="token punctuation">,</span> <span class="token string">"is_queued_for_deletion"</span><span class="token punctuation">,</span> <span class="token string">"cancel_free"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
		<span class="token string">"properties"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"RefCounted"</span><span class="token punctuation">,</span> <span class="token string">"AESContext"</span><span class="token punctuation">,</span> <span class="token string">"script"</span><span class="token punctuation">]</span>
	<span class="token punctuation">}</span><span class="token punctuation">,</span>
	<span class="token operator">/</span><span class="token operator">/</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
	<span class="token string">"ZIPReader"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
		<span class="token string">"className"</span><span class="token punctuation">:</span> <span class="token string">"ZIPReader"</span><span class="token punctuation">,</span>
		<span class="token string">"methods"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"open"</span><span class="token punctuation">,</span> <span class="token string">"close"</span><span class="token punctuation">,</span> <span class="token string">"get_files"</span><span class="token punctuation">,</span> <span class="token string">"read_file"</span><span class="token punctuation">,</span> <span class="token string">"file_exists"</span><span class="token punctuation">,</span> <span class="token string">"get_compression_level"</span><span class="token punctuation">,</span> <span class="token string">"init_ref"</span><span class="token punctuation">,</span> <span class="token string">"reference"</span><span class="token punctuation">,</span> <span class="token string">"unreference"</span><span class="token punctuation">,</span> <span class="token string">"get_reference_count"</span><span class="token punctuation">,</span> <span class="token string">"free"</span><span class="token punctuation">,</span> <span class="token string">"_init"</span><span class="token punctuation">,</span> <span class="token string">"_to_string"</span><span class="token punctuation">,</span> <span class="token string">"_notification"</span><span class="token punctuation">,</span> <span class="token string">"_set"</span><span class="token punctuation">,</span> <span class="token string">"_get"</span><span class="token punctuation">,</span> <span class="token string">"_get_property_list"</span><span class="token punctuation">,</span> <span class="token string">"_validate_property"</span><span class="token punctuation">,</span> <span class="token string">"_property_can_revert"</span><span class="token punctuation">,</span> <span class="token string">"_property_get_revert"</span><span class="token punctuation">,</span> <span class="token string">"_iter_init"</span><span class="token punctuation">,</span> <span class="token string">"_iter_next"</span><span class="token punctuation">,</span> <span class="token string">"_iter_get"</span><span class="token punctuation">,</span> <span class="token string">"get_class"</span><span class="token punctuation">,</span> <span class="token string">"is_class"</span><span class="token punctuation">,</span> <span class="token string">"set"</span><span class="token punctuation">,</span> <span class="token string">"get"</span><span class="token punctuation">,</span> <span class="token string">"set_indexed"</span><span class="token punctuation">,</span> <span class="token string">"get_indexed"</span><span class="token punctuation">,</span> <span class="token string">"get_property_list"</span><span class="token punctuation">,</span> <span class="token string">"get_method_list"</span><span class="token punctuation">,</span> <span class="token string">"property_can_revert"</span><span class="token punctuation">,</span> <span class="token string">"property_get_revert"</span><span class="token punctuation">,</span> <span class="token string">"notification"</span><span class="token punctuation">,</span> <span class="token string">"to_string"</span><span class="token punctuation">,</span> <span class="token string">"get_instance_id"</span><span class="token punctuation">,</span> <span class="token string">"set_script"</span><span class="token punctuation">,</span> <span class="token string">"get_script"</span><span class="token punctuation">,</span> <span class="token string">"set_meta"</span><span class="token punctuation">,</span> <span class="token string">"remove_meta"</span><span class="token punctuation">,</span> <span class="token string">"get_meta"</span><span class="token punctuation">,</span> <span class="token string">"has_meta"</span><span class="token punctuation">,</span> <span class="token string">"get_meta_list"</span><span class="token punctuation">,</span> <span class="token string">"add_user_signal"</span><span class="token punctuation">,</span> <span class="token string">"has_user_signal"</span><span class="token punctuation">,</span> <span class="token string">"remove_user_signal"</span><span class="token punctuation">,</span> <span class="token string">"emit_signal"</span><span class="token punctuation">,</span> <span class="token string">"call"</span><span class="token punctuation">,</span> <span class="token string">"call_deferred"</span><span class="token punctuation">,</span> <span class="token string">"set_deferred"</span><span class="token punctuation">,</span> <span class="token string">"callv"</span><span class="token punctuation">,</span> <span class="token string">"has_method"</span><span class="token punctuation">,</span> <span class="token string">"get_method_argument_count"</span><span class="token punctuation">,</span> <span class="token string">"has_signal"</span><span class="token punctuation">,</span> <span class="token string">"get_signal_list"</span><span class="token punctuation">,</span> <span class="token string">"get_signal_connection_list"</span><span class="token punctuation">,</span> <span class="token string">"get_incoming_connections"</span><span class="token punctuation">,</span> <span class="token string">"connect"</span><span class="token punctuation">,</span> <span class="token string">"disconnect"</span><span class="token punctuation">,</span> <span class="token string">"is_connected"</span><span class="token punctuation">,</span> <span class="token string">"has_connections"</span><span class="token punctuation">,</span> <span class="token string">"set_block_signals"</span><span class="token punctuation">,</span> <span class="token string">"is_blocking_signals"</span><span class="token punctuation">,</span> <span class="token string">"notify_property_list_changed"</span><span class="token punctuation">,</span> <span class="token string">"set_message_translation"</span><span class="token punctuation">,</span> <span class="token string">"can_translate_messages"</span><span class="token punctuation">,</span> <span class="token string">"tr"</span><span class="token punctuation">,</span> <span class="token string">"tr_n"</span><span class="token punctuation">,</span> <span class="token string">"get_translation_domain"</span><span class="token punctuation">,</span> <span class="token string">"set_translation_domain"</span><span class="token punctuation">,</span> <span class="token string">"is_queued_for_deletion"</span><span class="token punctuation">,</span> <span class="token string">"cancel_free"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
		<span class="token string">"properties"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"RefCounted"</span><span class="token punctuation">,</span> <span class="token string">"ZIPReader"</span><span class="token punctuation">,</span> <span class="token string">"script"</span><span class="token punctuation">]</span>
	<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre>
<p><code>Schema_ClassList</code>:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">extends</span> <span class="token class-name">Resource</span>
<span class="token keyword">class_name</span> <span class="token class-name">Schema_ClassList</span>
<span class="token keyword">var</span> classList <span class="token operator">=</span> <span class="token function">PackedStringArray</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
	<span class="token string">"AESContext"</span><span class="token punctuation">,</span>
	<span class="token string">"AStar2D"</span><span class="token punctuation">,</span>
	<span class="token string">"AStar3D"</span><span class="token punctuation">,</span>
	<span class="token string">"AStarGrid2D"</span><span class="token punctuation">,</span>
	<span class="token string">"AbstractPolygon2DEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AbstractPolygon2DEditorPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"AcceptDialog"</span><span class="token punctuation">,</span>
	<span class="token string">"ActionMapEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AimModifier3D"</span><span class="token punctuation">,</span>
	<span class="token string">"AnchorPresetPicker"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimatableBody2D"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimatableBody3D"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimatedSprite2D"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimatedSprite3D"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimatedTexture"</span><span class="token punctuation">,</span>
	<span class="token operator">/</span><span class="token operator">/</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
	<span class="token string">"XRPositionalTracker"</span><span class="token punctuation">,</span>
	<span class="token string">"XRServer"</span><span class="token punctuation">,</span>
	<span class="token string">"XRTracker"</span><span class="token punctuation">,</span>
	<span class="token string">"XRVRS"</span><span class="token punctuation">,</span>
	<span class="token string">"ZIPPacker"</span><span class="token punctuation">,</span>
	<span class="token string">"ZIPReader"</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre>
<p>But wait! If you look again in the Schema chart, you'll see that a third file exists, <code>Schema_ClassList_Ignore</code>! While this one isn't auto-generated, it was generated by me manually. ClassList_Ignore is exactly what it sounds like: it <em>ignores</em> specific classes that GDscript cannot access (e.g all editor-only nodes that are created via C++ only, or specific classes that may not be accessed as-is via GDscript).</p>
<p><code>Schema_ClassList_Ignore</code>:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">extends</span> <span class="token class-name">Resource</span>
<span class="token keyword">class_name</span> <span class="token class-name">Schema_ClassList_Ignore</span>
<span class="token comment"># These are hand-picked classes that CANNOT be used by Schema, as they are either internal (non-exposed) classes, or cannot be instantiated to be used by the Schema ClassDB</span>
<span class="token keyword">var</span> classListIgnore <span class="token operator">=</span> <span class="token function">PackedStringArray</span><span class="token punctuation">(</span><span class="token punctuation">[</span>
	<span class="token string">"AbstractPolygon2DEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AbstractPolygon2DEditorPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"ActionMapEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AnchorPresetPicker"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationBezierTrackEdit"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationLibraryEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationMarkerEdit"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationMarkerKeyEditEditorPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationMixer"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationNodeBlendSpace1DEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationNodeBlendSpace2DEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationNodeBlendTreeEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationNodeStateMachineEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationPlayerEditor"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationPlayerEditorPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationTimelineEdit"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationTrackEditDefaultPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationTrackEditPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"AnimationTrackEditor"</span><span class="token punctuation">,</span>
	<span class="token operator">/</span><span class="token operator">/</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
	<span class="token string">"VisualShaderNode"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeConstant"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeGroupBase"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeOutput"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeParameter"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeParticleEmitter"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodePlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodePluginDefault"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeResizableBase"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeSample3D"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeTextureParameter"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeVarying"</span><span class="token punctuation">,</span>
	<span class="token string">"VisualShaderNodeVectorBase"</span><span class="token punctuation">,</span>
	<span class="token string">"VoxelGIEditorPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"VoxelGIGizmoPlugin"</span><span class="token punctuation">,</span>
	<span class="token string">"WebRTCDataChannel"</span><span class="token punctuation">,</span>
	<span class="token string">"WebRTCPeerConnection"</span><span class="token punctuation">,</span>
	<span class="token string">"WebRTCDataChannelExtension"</span><span class="token punctuation">,</span>
	<span class="token string">"WebRTCMultiplayerPeer"</span><span class="token punctuation">,</span>
	<span class="token string">"WebRTCPeerConnectionExtension"</span><span class="token punctuation">,</span>
	<span class="token string">"Window"</span><span class="token punctuation">,</span>
	<span class="token string">"WindowWrapper"</span><span class="token punctuation">,</span>
	<span class="token string">"WorkerThreadPool"</span><span class="token punctuation">,</span>
	<span class="token string">"XRInterface"</span><span class="token punctuation">,</span>
	<span class="token string">"XRTracker"</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">)</span></code></pre>
<p>By itself in the Sapphire plugin, Schema will only be useful for mod support, on which I haven't yet started working in Godot, but in Unreal the concept was simple: in the user configuration file, you'd have a folder for mods, and you could create folders in it, with mod manifests and mod files, and you'd load them at runtime. The same concept will apply in Godot, made more simple by the fact that Godot <em>just lets you do it</em>, instead of converting files to binary UAsset files and whatnot.</p>
<p>I mentioned the GDscript parser system earlier for the Console, but it'll be used by Schema, mainly for the mod support since I'll just let you write GDscript directly, or use Schema's visual node system, depending on your experience coding or modding. The custom GDscript parser will also have a blacklist of stuff you can't write, or commands you shouldn't be able to execute. After all, I wouldn't want a rogue mod force-quitting the game or trying to access files outside the mod directory. So I need to make sure that I can put up guardrails against stuff like this.</p>
<h3 id="plugin%3A-sapphire.editor" tabindex="-1">Plugin: Sapphire.Editor</h3>
<p>File size as of 24.02.2026: 129.3 KB (without the .git folder)</p>
<h4 id="console-debugger" tabindex="-1">Console Debugger</h4>
<p>Oh yes, this. Quite an early little thing I coded one night, but if running via the editor (and having Sapphire.Editor enabled), it adds a dock in the bottom panel which lets the in-game console connect via localhost to the editor's console, which means I can send commands from the editor to the game. Fun!</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/lessons_sapphire_console_debugger.webm" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/lessons_sapphire_console_debugger.webm" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>The code, besides settng up UI and then cleaning up, is just this, it's this simple:</p>
<pre class="language-gdscript"><code class="language-gdscript"><span class="token keyword">func</span> <span class="token function">_enter_tree</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token class-name">void</span><span class="token punctuation">:</span>
	title <span class="token operator">=</span> <span class="token string">"Console"</span>
	default_slot <span class="token operator">=</span> <span class="token constant">DOCK_SLOT_BOTTOM</span>
	available_layouts <span class="token operator">=</span> EditorDock<span class="token punctuation">.</span><span class="token constant">DOCK_LAYOUT_HORIZONTAL</span>
	<span class="token function">setupUI</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	consoleInput<span class="token punctuation">.</span>text_submitted<span class="token punctuation">.</span><span class="token function">connect</span><span class="token punctuation">(</span>_on_console_input_submitted<span class="token punctuation">)</span>
	<span class="token function">call_deferred</span><span class="token punctuation">(</span><span class="token string">"setup_udp_client"</span><span class="token punctuation">)</span>
<span class="token keyword">func</span> <span class="token function">_exit_tree</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token class-name">void</span><span class="token punctuation">:</span> <span class="token function">cleanup</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token function">toggle_devui</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token class-name">void</span><span class="token punctuation">:</span>
	<span class="token keyword">if</span> udp_client<span class="token punctuation">:</span> udp_client<span class="token punctuation">.</span><span class="token function">put_packet</span><span class="token punctuation">(</span><span class="token string">"devui"</span><span class="token punctuation">.</span><span class="token function">to_utf8_buffer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token function">setup_udp_client</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
	udp_client <span class="token operator">=</span> PacketPeerUDP<span class="token punctuation">.</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	udp_client<span class="token punctuation">.</span><span class="token function">connect_to_host</span><span class="token punctuation">(</span><span class="token string">"127.0.0.1"</span><span class="token punctuation">,</span> <span class="token number">4242</span><span class="token punctuation">)</span>

<span class="token keyword">func</span> <span class="token function">_on_console_input_submitted</span><span class="token punctuation">(</span>text<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
	<span class="token keyword">if</span> text<span class="token punctuation">.</span><span class="token function">is_empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
		<span class="token keyword">return</span>
	consoleLogLabel<span class="token punctuation">.</span><span class="token function">append_text</span><span class="token punctuation">(</span><span class="token string">"[i]>> "</span> <span class="token operator">+</span> text <span class="token operator">+</span> <span class="token string">"[/i]\n"</span><span class="token punctuation">)</span>
	consoleInput<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	<span class="token keyword">if</span> udp_client<span class="token punctuation">:</span>
		udp_client<span class="token punctuation">.</span><span class="token function">put_packet</span><span class="token punctuation">(</span>text<span class="token punctuation">.</span><span class="token function">to_utf8_buffer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
		consoleLogLabel<span class="token punctuation">.</span><span class="token function">append_text</span><span class="token punctuation">(</span><span class="token string">"[color=green]✓ Sent via UDP[/color]\n"</span><span class="token punctuation">)</span>
	<span class="token keyword">else</span><span class="token punctuation">:</span>
		consoleLogLabel<span class="token punctuation">.</span><span class="token function">append_text</span><span class="token punctuation">(</span><span class="token string">"[color=red]UDP client not ready[/color]\n"</span><span class="token punctuation">)</span></code></pre>
<h4 id="graphicsdebuggers" tabindex="-1">GraphicsDebuggers</h4>
<p>I haven't fully ported the code from C++, but basically this adds support for launching a graphics debugger of choice (RenderDoc, NVIDIA Nsight Graphics, a third-party tool) for the current scene, or for the game. In C++, the code was surprisingly simple. This is the code from August 2025, that only adds RenderDoc support which was then expanded to check against many editor settings:</p>
<pre class="language-cpp"><code class="language-cpp"><span class="token comment">// in /editor/run/editor_run_bar.cpp:509</span>
<span class="token keyword">void</span> <span class="token class-name">EditorRunBar</span><span class="token double-colon punctuation">::</span><span class="token function">run_renderdoc</span><span class="token punctuation">(</span>String p_scene_path<span class="token punctuation">)</span> <span class="token punctuation">{</span>
	String renderdoc_path <span class="token operator">=</span> <span class="token function">EDITOR_GET</span><span class="token punctuation">(</span><span class="token string">"filesystem/external_programs/debugging/renderdoc_graphics_debugger"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	String renderdoc_settings_path <span class="token operator">=</span> <span class="token class-name">ProjectSettings</span><span class="token double-colon punctuation">::</span><span class="token function">get_singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">globalize_path</span><span class="token punctuation">(</span><span class="token function">GLOBAL_GET</span><span class="token punctuation">(</span><span class="token string">"debug/settings/renderdoc/settings_path"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	List<span class="token operator">&lt;</span>String<span class="token operator">></span> paths<span class="token punctuation">;</span>
	paths<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>renderdoc_settings_path<span class="token punctuation">)</span><span class="token punctuation">;</span>

	String absolute_scene_path <span class="token operator">=</span> <span class="token class-name">ProjectSettings</span><span class="token double-colon punctuation">::</span><span class="token function">get_singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">globalize_path</span><span class="token punctuation">(</span>p_scene_path<span class="token punctuation">)</span><span class="token punctuation">;</span>
	String absolute_project_path <span class="token operator">=</span> <span class="token class-name">ProjectSettings</span><span class="token double-colon punctuation">::</span><span class="token function">get_singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">globalize_path</span><span class="token punctuation">(</span><span class="token string">"res://"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">// Create JSON options as Godot dictionaries</span>
	Dictionary json_data<span class="token punctuation">;</span>
	Dictionary settings<span class="token punctuation">;</span>
	Dictionary options<span class="token punctuation">;</span>
	String command_line<span class="token punctuation">;</span>

    json_data<span class="token punctuation">[</span><span class="token string">"rdocCaptureSettings"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
    settings<span class="token punctuation">[</span><span class="token string">"autoStart"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
	command_line <span class="token operator">=</span> <span class="token string">"--path \""</span> <span class="token operator">+</span> absolute_project_path <span class="token operator">+</span> <span class="token string">"\" --scene \""</span> <span class="token operator">+</span> absolute_scene_path <span class="token operator">+</span> <span class="token string">"\""</span><span class="token punctuation">;</span>
    settings<span class="token punctuation">[</span><span class="token string">"commandLine"</span><span class="token punctuation">]</span> <span class="token operator">=</span> command_line<span class="token punctuation">;</span>
	<span class="token comment">//settings["environment"] = Array();					// Add any environment variables if needed</span>
	settings<span class="token punctuation">[</span><span class="token string">"executable"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token class-name">OS</span><span class="token double-colon punctuation">::</span><span class="token function">get_singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">get_executable_path</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    settings<span class="token punctuation">[</span><span class="token string">"inject"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    settings<span class="token punctuation">[</span><span class="token string">"numQueuedFrames"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
	options<span class="token punctuation">[</span><span class="token string">"allowFullscreen"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"allowVSync"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"apiValidation"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"captureAllCmdLists"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"captureCallstacks"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"captureCallstacksOnlyDraws"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"debugOutputMute"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"delayForDebugger"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"hookIntoChildren"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"refAllResources"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    options<span class="token punctuation">[</span><span class="token string">"verifyBufferAccess"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
	settings<span class="token punctuation">[</span><span class="token string">"options"</span><span class="token punctuation">]</span> <span class="token operator">=</span> options<span class="token punctuation">;</span>
    settings<span class="token punctuation">[</span><span class="token string">"queuedFrameCap"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
	<span class="token comment">//settings["workingDir"] = "";							// Set working directory, curr unused</span>
	json_data<span class="token punctuation">[</span><span class="token string">"settings"</span><span class="token punctuation">]</span> <span class="token operator">=</span> settings<span class="token punctuation">;</span>

	<span class="token comment">// Create RenderDoc .cap file in renderdoc_settings_path by writing JSON to file</span>
	Error json_err<span class="token punctuation">;</span>
	Ref<span class="token operator">&lt;</span>FileAccess<span class="token operator">></span> file <span class="token operator">=</span> <span class="token class-name">FileAccess</span><span class="token double-colon punctuation">::</span><span class="token function">open</span><span class="token punctuation">(</span>renderdoc_settings_path<span class="token punctuation">,</span> FileAccess<span class="token double-colon punctuation">::</span>WRITE<span class="token punctuation">,</span> <span class="token operator">&amp;</span>json_err<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>json_err <span class="token operator">!=</span> OK<span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token function">ERR_PRINT</span><span class="token punctuation">(</span><span class="token string">"Failed to open file for writing: "</span> <span class="token operator">+</span> renderdoc_settings_path<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
		String json_string <span class="token operator">=</span> <span class="token class-name">JSON</span><span class="token double-colon punctuation">::</span><span class="token function">stringify</span><span class="token punctuation">(</span>json_data<span class="token punctuation">)</span><span class="token punctuation">;</span>
        file<span class="token operator">-></span><span class="token function">store_string</span><span class="token punctuation">(</span>json_string<span class="token punctuation">)</span><span class="token punctuation">;</span>
        file<span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>

	<span class="token comment">// Finally, run RenderDoc</span>
	<span class="token keyword">const</span> Error err <span class="token operator">=</span> <span class="token class-name">OS</span><span class="token double-colon punctuation">::</span><span class="token function">get_singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">open_with_program</span><span class="token punctuation">(</span>renderdoc_path<span class="token punctuation">,</span> paths<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>err <span class="token operator">!=</span> OK<span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token function">ERR_PRINT_ED</span><span class="token punctuation">(</span><span class="token function">vformat</span><span class="token punctuation">(</span><span class="token function">TTR</span><span class="token punctuation">(</span><span class="token string">"Couldn't run RenderDoc (error code %d): %s %s\nCheck `filesystem/external_programs/debugging/renderdoc_graphics_debugger` in the Editor Settings and `debug/settings/renderdoc/settings_path` in the Project Settings."</span><span class="token punctuation">)</span><span class="token punctuation">,</span> err<span class="token punctuation">,</span> renderdoc_path<span class="token punctuation">,</span> renderdoc_settings_path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<p>and then just duplicate the <code>play_button</code> and <code>play_scene_button</code> buttons in <code>EditorRunBar::EditorRunBar()</code>, just remove the keyboard shortcut and set it to use run_renderdoc after you duplicate the <code>void EditorRunBar::play_main_scene(bool p_from_native)</code> and <code>void EditorRunBar::play_current_scene(bool p_reload, const Vector&lt;String&gt; &amp;p_play_args)</code> functions. Don't forget to add the references in <code>editor_run_bar.h</code> and voila! Create the <code>&quot;filesystem/external_programs/debugging/renderdoc_graphics_debugger&quot;</code> editor setting in the editor settings code, create the <code>&quot;debug/settings/renderdoc/settings_path&quot;</code> project setting, and it should run RenderDoc. Of course, this isn't the full code, but it's a starting point for you to finish it 😉</p>
<p>In the editor, this looked like this prior to me moving to plugins:</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/sapphire_editor_run_bar_grd.webp" alt="A screenshot of the Editor Run Bar, but with two extra buttons." title="A screenshot of the Editor Run Bar, but with two extra buttons." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/sapphire_editor_run_bar_grd.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A screenshot of the Editor Run Bar, but with two extra buttons.</p>
					</div>
				</figure>
			</div></div>
<p>As an alternative, you can use <a href="https://github.com/jose-lico/Godot-RenderDoc-Launcher">jose-lico/Godot-RenderDoc-Launcher</a>, but that only supports RenderDoc, so you'll have to add support for other tools yourself.</p>
<h4 id="schema-editor" tabindex="-1">Schema Editor</h4>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PRISONIA/sapphire_editor_schema.webm" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PRISONIA/sapphire_editor_schema.webm" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>Again, I remind you that I haven't worked on bring this into the Sapphire.Editor and the Sapphire plugins, it was worked on separately, I've yet to unify it, but I don't have the time for something as heavy as Schema right now. But here's a video where I ignore the warning I placed at the button that rebuilds the ClassDB...which crashes the editor.</p>
<p>Anyway, it basically adds a button to the script editor UI, which then creates a new Graph in which it's supposed to represent the GDscript of the file. That took a bit of sleuthing to get right, basically I'm walking up and following the editor tree to find the script editor window.</p>
<p>There are some quirks that haven't been resolved since I last worked on it - at the time, Godot 4.6 had just entered development. For one, if you open the graph view then navigate to a documentation page, it'll cause some errors because there's no 'code' in the documentation page, so it can't do anything with it. I need to somehow block it from working on doc pages. For another, as mentioned, the ClassDB generator crashes the editor sometimes, but the ClassList generator works despite the null instance error that was thrown in the video.</p>
<p>Also, you were offered a peek at the million tabs open in three rows in VSCode for my 11ty website at a <em>totally normal 1:43 AM</em> so...hello there, past me!</p>
<h3 id="plugin%3A-sapphire.material3" tabindex="-1">Plugin: Sapphire.Material3</h3>
<p>File size as of 24.02.2026: 5.9 MB (without the .git folder)</p>
<p>I worked on this a bit in <a href="https://techhub.social/@alextecplayz/115827734861480819">January</a>, but essentially I'm trying to recreate Material You Expressive in Godot, because I dislike native Android app development, and I need / want to build a bookmark manager app that supports importing and exporting to browser-supported formats like HTML.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/sapphire_md3_colorgen.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/sapphire_md3_colorgen.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure>
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/sapphire_md3_contrast_carousel.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/sapphire_md3_contrast_carousel.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>It's a fun little project, but I haven't worked on it since then. I'll return to it when I have the time.</p>
<h2 id="project-neighbourhood" tabindex="-1">Project Neighbourhood</h2>
<p>I mentioned this project back in my <a href="/posts/2025-01-11-Year-In-Review.html">2026 year in review post</a>, but only vaguely, at the end of it. PN was quickly put together as a prototype while thinking about some approaches for PRISONIA's tilemap, it's meant to be a wacky, simple game inspired by Neighbours From Hell and Hello Neighbor, where you piss off your stupid neighbours in silly ways like painting their whole house with these buckets, or having a yard sale with their stuff, etc.</p>
<p>Here's some early footage of that I shot for this post, but I haven't worked on it since the end of October, I want to release this as a demo on Itch, and if people like the idea, I'll commit to it.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_paint_test_1.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_paint_test_1.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>You can paint walls, floors, ceilings, fences, and the neighbours themselves.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_cleaner_1.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_cleaner_1.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>You can clean paint off the walls (but not the neighbour!)</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_watching_tv_1.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_watching_tv_1.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>...spend some quality time together and watch TV</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_paint_doors_1.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_paint_doors_1.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>Contribute to the community by painting their doors <em>red</em> (?)</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_tv_steal_and_flyoff.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_tv_steal_and_flyoff.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>Steal their TV, prop jump on the roof and fly off with it...</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_prop_jump_fly_neighbor.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_prop_jump_fly_neighbor.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>Prop jump AND take the neighbor with you</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="VideoObject" itemscope itemtype="https://schema.org/VideoObject">
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_trickshot_1.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_trickshot_1.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure>
			<figure class="image-frame">
				<video property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2026/PN/PN_trickshot_2.mp4" alt="There is no alt text provided for this video" title="There is no title provided for this video" loop="true" controls playsinline="true" preload="metadata">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2026/PN/PN_trickshot_2.mp4" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a>
				</div>
			</figure></div>
<p>Put the neighbor on some wall they can't get down from or get them stuck mid-air and land some TV trick shots while you're at it.</p>
<p><em>You know, now that I think about it, Project Neighbourhood isn't as neighbour-friendly as I thought it might be.</em></p>
<p>PN is supposed to be a funny, short demo with 3 neighbours and how their ignorance led to the player being angered enough to start terrorizing them as a way of revenge. None of them have any names at this time, but the 3 neighbours in the demo will have this backstory: neighbour 1's dog keeps pooping in the player's yard and mating with their dog, neighbour 2's coddled rascal kids throw rocks at the player's windows while going to school, and neighbour 3 crashed his car in a pole that tore through the player's roof and nearly set their house on fire.</p>
<p>I won't get rid of the prop-jumping feature, I think that could be fun to see how players would speedrun the game or set some wacky stuff in motion to complete some in-game objectives, but the neighbours aren't as dumb as you think. I hope I'll be able to make them prop-jump as well, or at least offer some way to counter this OP feature, similar to how in HN1 the Neighbor could pull out a vacuum to try and pull the player from the roof or other high surfaces they couldn't otherwise reach on foot.</p>
<h2 id="conclusions%3F" tabindex="-1">Conclusions?</h2>
<p>GDscript is really awesome, and coming from Unreal Engine's Blueprints system, it's quite similar, if GDscript was the code version of that. You can make games and editor plugins with it directly, you don't need a separate IDE, you don't need some stupid compiler, you don't need to bother with C++ if you don't want to, GDscript is first-class citizen in Godot 4.</p>
<p>Find creative but meaningful ways to optimize your games, and test on mobile if it's one of your target platforms. Test it on a mid-range phone (or even a low-end phone), that's when you really see the difference in performance between PC and mobile.</p>
<p>And also, play around with Godot, make a bunch of prototype demos or projects, explore it to your heart's content, because at the end of the day, you're only getting better at it, and it can also give you fresh ideas while not forcing you to burn yourself out.</p>
]]></content:encoded>
					<guid>PO-260224-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[2025 Year In Review]]></title>
					<link>/posts/2026-01-11-Year-In-Review.html</link>
					<description>Looking back through 2025.</description>
					<pubDate>Sun, 11 Jan 2026 21:00:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="january" tabindex="-1">January</h2>
<p>From my last year's <a href="/posts/2024-12-30-Year-In-Review.html">2024 in review</a>:</p>
<blockquote>
<p>This year, either I'm getting a job [...], or the more likely option, going to college for three years.</p>
</blockquote>
<p>Yeah, college didn't happen. I'd throw myself head-first into the city river if I had to go to college (<em>half-joke</em>). Don't get me wrong, there's nothing bad with going to college and getting higher education. I'm just not <em>personally</em> mentally fit to go through standardized education again. I've had burnout after I finished high school, and the last week of my holiday contract job in December 2025, I started to feel burnt out as well.</p>
<p>In January all I did was apply for jobs. I played more HITMAN World of Assassination and Theo Town; I also tried to play Marvel Rivals, but at the time I was still using an HDD, so performance was absolutely miserable, and I gave up.</p>
<h2 id="february" tabindex="-1">February</h2>
<p>Got a job at a well-known local courier company on the other side of the city. 1 hour by tram to go from home to work, another 1 hour (or more, because traffic at a roundabout through which the tram is passing by is particularly heavy after 5PM) to come back. Specific information about my activity there is listed in my <a href="/cv.html">CV</a>; I'm not repeating that here.</p>
<p>Besides that, in my free time I managed to push a few website updates like 1.7.1. This introduced themes such as Orange Cream, Sunny Forest, Sunny Ocean, Deep Pastel Pink, Dark Forest, Deep Ocean, Material You Dark Colorful Pink, some more footer changes, a sitemap, using Liquid to generate the TOC automatically, and the /now page! Also <a href="/posts/2025-02-10-Tomb-Raider-2013-Review.html">published the Tomb Raider 2013 review</a> at the end of the month. Shit game, don't bother.</p>
<p>I toyed around a little at the beginning of the month with the <em>concept</em> of locking posts (e.g., early access for paid supporters) behind a paywall that can be accessed if you've entered a specific license code you'd receive by mail or something. This would be decrypted and checked against locally through some naive, not-so-secure JS code. I don't really care if the code was secure or not; I don't mind people pirating my stuff. I never used this stuff since I don't really have things to post about, unfortunately — I constantly keep telling myself that I need to get better at blogging, and perhaps I will, someday! — So I removed it.</p>
<p>In the rare case that I might add it again at some point, here's a license key that <em>I promise I won't blacklist</em> from this JS code: <code>R8RLW-SQU8S-QR6MK-D9CJN</code>. I probably won't paywall my blog or provide early access to posts, though I totally understand why some people do, but I feel like my posts aren't worth $1/month; they're not journalistic hit pieces or whatever, just the occasional posts a few (or many) times a year of a trans gal.</p>
<h2 id="march" tabindex="-1">March</h2>
<p>It just so happened that I was employed in the middle of a franchisor (leadership) change, so by March I had to re-sign the contract with the new boss. But genuinely, I felt like the new boss was way more approachable and took a larger interest in literally everyone working for him, top to bottom. In March we'd start having regular team meetings in which our boss would learn more about each department's duties and performance, any disagreements between departments, any questions we'd have for him and vice versa, any suggestions, and whatnot.</p>
<p>By the end of the month, something that had started as a joke on our internal WhatsApp groups—having a coffee machine in the lobby for the couriers and staff—became an actual target to reach if couriers managed to achieve the coveted 90% delivery mark. I'm not going to share any actual data because of <em>confidentiality</em>, but surprisingly our city is among the top when it comes to deliveries from our specific courier brand.</p>
<h2 id="april" tabindex="-1">April</h2>
<p>Finally had two psychiatric appoinments and a psychologist appointment at a private clinic recommended to me by another trans gal last year (thx PJ, love the artistic photos in your recent post!) that one of my best friends knew from at work.</p>
<p>The breakdown of the process is this: request a psychiatrist appointment, flat-out tell them that you're trans and that you've decided to transition, they'll ask about your history and depending on your age, you may have to live as a trans person for two years (e.g. I came out at 17, but since this was April, I had to wait until I was at least 20 in order to get their approval). <strong>NOTE that this may depend on your doctor, some may not have this 2-year requirement</strong></p>
<p>They'll also request a psychological report to make sure you're not having suicidal ideations and that you're not depressed.</p>
<p>My psychologist was a chill dude in his late 20s (seemed so, at least?), I was given a personality test (SCID-5) which I filled out at home pre-appointment. The psychologist will then take this report, check it against the the values in the SCID5 manual, in between that he asked me some demographic questions about myself (e.g age, hobbies, if i drink/smoke/do drugs, what I do for work, etc.), this will also score your BDI II (depression symptoms).</p>
<p>You'll receive a report by e-mail with the findings, which you then take back to the psychiatrist (I did that in June), and if all is well, they give you the diagnostic.</p>
<p>From the report, I had 2 traits specific to SzPD but I was under the threshold, and 1 trait specific to Borderline personality, also under threshold, and 8 points for BDI II.</p>
<h2 id="may" tabindex="-1">May</h2>
<p>At work they cut down the customer service and dispatch departments, I move to reception to see if I like it, while a few co-workers of both departments quit. I hope they found better places to work at in the meantime.</p>
<p>On Steam, the bulk of my playtime in May was GTA V Enhanced, followed by a bit of HITMAN.</p>
<h2 id="june" tabindex="-1">June</h2>
<p>My last day at work at the courier company was June 27. Great co-workers; I even liked the department I worked in, working with people and all, but our AC was broken, so we'd be sweating all day long for just slightly above minimum wage. Worse, our franchisor turned increasingly worse, trying to cut costs everywhere.</p>
<p>I do regret leaving my coworkers there; they did hire someone to replace me at the reception; they seemed to do great shadowing us for the last week I was there. I regret leaving such great, open, friendly, and welcoming people behind, but I also value my personal mental health, which most definitely took a dive during the summer because of the constant heat. It was fun while it lasted; both my office coworkers and our team leaders + boss knew that I was trans and bi. I didn't feel that I was in any way discriminated against for who I am, which is surprisingly nice in a country like Romania.</p>
<p>June was fun, though; I added 88x31 banners on my home page, wrote the <a href="/posts/2025-06-09-February-May.html">February-May post</a>, and also added my CV to my site in web page, Markdown, and PDF form, just in case I'd need it.</p>
<p>On Steam, I continued to play GTA V Enhanced, started playing American Truck Simulator some more, and HITMAN, and tried to play DEATHLOOP, but it wouldn't launch. I'll get around to playing it at some point…</p>
<h2 id="july" tabindex="-1">July</h2>
<p>Added tooltips and a glossary to my site with version 1.7.5, that was a fun thing to figure out using JS at the time! Also added a few more themes. And wrote the Grok gooners post, <a href="/posts/2025-07-16-Grok-Gooners.html">Nightmare-level gooners flock to Grok (Ani), and other nonsense</a> way before 2026 Grok would end up generating actual CSAM and sexually abusive images for free, then behind a paywall.</p>
<p>With this post I also added ATP Ads, which added parody ad images that included celebrities such as Musk, Sam Altman, JD Vance and Trump, as a way to lighten up the fucked-up shit that was happening at the time. I had been for a while making funny faces and edits of Sam Altman and Musk - trying to see how skinny I can get Sam Altman, and how turgid (swollen, fat) I could make Trump's face while still making it seem realistic - using PicsArt, so I did that for these ads, and plan to continue making these shitty ad parodies in 2026. At the time I had to manually write the HTML for it, but now with 11ty I can just include atpads in a page with a one-liner, similar to how I had replaced my manual gallery HTML.</p>
<p>This was July 16-17. Two days later I wrote <a href="/posts/2025-07-19-Chaos-Continues.html">Trump chaos continues</a> and on the 24th I wrote <a href="/posts/2025-07-24-Another-Day-Another-Package.html">about Romania's new economic package and the situation in which Collective Shouth, a christo-fascist group successfully lobbied payment processors such as Visa and MasterCard to strongarm Itch.Io and Steam to de-list a few NSFW games</a>, setting a dangerous precedent. And before another person chimes in that <em>perhaps we should find a way to create a payment processor that won't censor stuff</em>, <a href="https://voidfox.com/blog/payment_processor_fun_2025_making_your_own_msp/">that won't happen, because becoming a payment processor is strongly and rightfully so regulated</a>, you'd still have to respond to government and Acquirers' demands. Not only are you already getting into a very complex and regulated field, but with each 'big' thing you need to check off your to-do list (e.g. KYC, KYCC, other major regulations), you're only making things even more complex. And getting to the point where you can try and sell adult content is a whole different mine field in itself, because you have to ensure that the content doesn't facilitate CSAM, the participation of minors on both sides of the transaction - cx and seller. Now do that for each platform that sells adult content - PornHub, Brazzers, OnlyFans, Fansly, and then also include Steam and Itch, and it's a nightmare to manage and ensure nothing slips through, because if it does, you're in for a world of pain.</p>
<p>Honestly, that article from voidfox is a great read and I suggest you read all of it rather than just skimming through it. I haven't seen many articles from people that work in this sector, so if you find any, send them my way on Masto. TYIA!</p>
<p>July 30, <a href="/posts/2025-07-30-Vile-judge-is-the-only-candidate.html">new article on the new-elected Romanian Supreme Court president</a>, of a vile, corrupt judge (and more fuel to the fire was added in December when Recorder's <a href="https://www.youtube.com/watch?v=TpUDm4ay-B8">Captured Justice docummentary</a> was published and all hell broke loose). Lia Savonea is rightfully a piece of shit. She sentenced a man that raped his 13-yo granddaughter to ONLY 8 months in prison (with a suspended sentence!), justifying this by saying that the minor <a href="https://www.g4media.ro/exclusiv-document-lia-savonea-candidatul-pentru-inalta-curte-care-a-emis-o-sentinta-de-8-luni-de-inchisoare-cu-suspendare-pentru-act-sexual-cu-un-minor-justificand-ca-fetita-si-a-dat-consimtamantul.html">gave her consent</a>. She also lowered Mario Iorgulescu's murder charge to manslaughter in the case where he hit and killed someone with his car while both drunk and under the influence of cocaine, allowing this fucker to run and hide in Italy where he's currently residing as of January 2026 since Italy won't extradite him for another attempt at sentencing - an attempt that has been judged, re-judged and re-judged again, with endless delays in between each judgment session.</p>
<p>The Romanian justice system is currently being held hostage as of January 2026, and at the top of this pyramid lies Lia Savonea, politicians from the Social Democratic Party and other goons part of this conspiracy to subordinate every judge and cop working on judgement cases to effectively allow influential criminals and politicans run amok and get away with hundreds of millions of EUR in financial schemes, bribes, the like.</p>
<p>On the same day I also introdued the now-failed experiment of streaming content to allow for smoother content loading on my site, similar to a single-page appplication (SPA). This was plagued by issues and I had to selectively ignore a few links and buttons, which just ended up being HTML attribute hell imo.</p>
<p>On Steam, I continued to play GTA V Enhanced, American Truck Simulator, and almost got all achievements for Earn to Die 2 (wonderful game, even if short), bought, and 100%-ed Neighbours Back From Hell.</p>
<h2 id="august" tabindex="-1">August</h2>
<p>Since August 1 I haven't published any more website updates or posts, I was porting portions of two projects to Sapphire - PRISONIA (Aug 17) and Project Mountain (Aug 17-28) - and also added some features to Sapphire directly as editor modifications, mainly the support for RenderDoc and NVIDIA Nsight, but I've since moved this to an extension instead, the C++ codebase just has 8 commits from me following a rebase on December 13, and now I'm gradually re-implementing things in GDScript instead, since I've come to love using it, and it keeps my code safe from possibly breaking changes from upstream tha I may not be able to handle, or bork in some way.</p>
<p>On Steam, I finally got around to actually playing Marvel Rivals; it ran a lot better. I played and 100%-ed American Arcadia (great game, worth it), played some Untitled Goose Game, and played and completed the story for The Invincible. However, I couldn't rate it more than a <a href="https://steamcommunity.com/id/alextecplayz/recommended/731040/">6/10</a> for being so boring, and it had plenty of performance issues despite using Unreal Engine 4. It's absolutely not worth the $30 asking price; I got it for $7 on Fanatical as part of a bundle.</p>
<p>Started looking for jobs again...</p>
<h2 id="september" tabindex="-1">September</h2>
<p>Went on two pilgrimage tours of a few local monasteries and took lots of photos; I'll get around to creating a /photos section on my site in 2026. I want to show off some of my <em>sick photography skills</em> on here.</p>
<h2 id="october" tabindex="-1">October</h2>
<p>I began my holiday work contract for an outsourcing company on October 27 and worked for a US-based company that owned two apparel stores that I won't name. The colleagues were great, and seeing as how this was my first remote job, I think I fared okay given that. Work in two shifts, 9AM-6PM and 3PM-12AM; no more e-mails, no more phone calls, just tickets and chat on Zendesk. Weekly meetings on Monday with the US team, and for the 2 weeks of training, regular Google Meet video calls with the team on our progress and shadow sessions. Fucking bliss…</p>
<h2 id="november" tabindex="-1">November</h2>
<p>I bought and 100%-ed Tales From The Borderlands (the Telltale one, not the New Tales From The Borderlands from 2K, running on Unreal Engine; that one is utter shit). God, I miss the old Telltale. Bring back both seasons of Minecraft: Story Mode, Microsoft!</p>
<h2 id="december" tabindex="-1">December</h2>
<p>Finally had my first consultation with an endocrinologist from the public health system after she was recommended by a private healthcare endocrinologist. I had a consultation in August about this. They recommended Estradiol and Spironolactone, which in Romania is available as gel or spray. I'll be using <a href="https://comenzi.farmaciatei.ro/medicamente-cu-reteta/medicamente/lenzetto-1-53-mg-estradiolum-doza-spray-transdermic-solutie-8-1-ml-gedeon-richter-p347106">Lenzetto</a>, a transdermic estradiol spray. For Spiro, most likely <a href="https://comenzi.farmaciatei.ro/medicamente-cu-reteta/medicamente/spironolactona-25-mg-50-comprimate-filmate-terapia-p345448">Terapia's film-coated tablets</a>.</p>
<p>I was also given a list of blood tests that I needed to take; all but three are covered by the national health insurance (CNAS) scheme in Romania. My next appointment is in April, and I'll try to get my blood tests in February or March. Again, neither the public or private healthcare endocrinologists, the nurses that I checked with to schedule my consultation, nor my family doctor (everyone mentioned is a woman) treated me disrespectfully or whatever for me mentioning that I want to medically transition (I currently still look like a guy, despite having a somewhat visible beard and moustache which I trim regularly). Quite nice and helpful, in fact!</p>
<aside class="aside-content monospace lightgray rem1"><p class="monospace bold rem1 hidden-on-desktop">Aside for paragraph below:</p><p>2026 edit: they <em>don't know, actually...</em></p>
</aside>
<p>My parents sorta-kinda know I'm a gal, maybe, but they don't know the 'big picture'. We'll see how it goes in 2026…</p>
<p>Also, my holiday work contract finished after my 9-6 shift on Dec 31, got my performance bonus, which is nice. I'd say it was great, despite not being able to always reach the ticket quota due to issues with <em>Primary Browser</em>, hoping I can find open positions for a full-time contract with this outsourcing company in 2026, it was awesome.</p>
<h2 id="more-recaps" tabindex="-1">More recaps</h2>
<h3 id="2025-steam-replay" tabindex="-1">2025 Steam Replay</h3>
<p>You can check my Steam replay <a href="https://store.steampowered.com/replay/76561198410116908/2025">here</a>, or find the data below:</p>
<h4 id="how-i-compare" tabindex="-1">How I compare</h4>
<ul>
<li>unlocked 247 achievements vs 11 (median)</li>
<li>played 23 games vs 4 (median)</li>
<li>longest play streak was 7 days vs 6 (median)</li>
<li>24% of playtime was in new releases (games released in 2025) vs 14% (% of playtime spent by all Steam users in new releases)</li>
<li>46% of playtime was in classic games (games released 8 or more years ago) vs 40%</li>
<li>30% of playtime was in recent favourites (games released 1–7 years ago) vs 44%</li>
</ul>
<h4 id="playtime-breakdown-this-year" tabindex="-1">Playtime breakdown this year</h4>
<table>
<thead>
<tr>
<th>Game</th>
<th>total playtime %</th>
<th>Rating (0-10)</th>
<th>Additional info</th>
</tr>
</thead>
<tbody>
<tr>
<td>Grand Theft Auto V Enhanced</td>
<td>23%</td>
<td>10/10</td>
<td>First played in 2025</td>
</tr>
<tr>
<td>American Truck Simulator</td>
<td>19%</td>
<td>8/10</td>
<td></td>
</tr>
<tr>
<td>Euro Truck Simulator 2</td>
<td>11%</td>
<td>8/10</td>
<td></td>
</tr>
<tr>
<td>HITMAN World of Assassination</td>
<td>10%</td>
<td>8/10</td>
<td></td>
</tr>
<tr>
<td>Tomb Raider 2013</td>
<td>4%</td>
<td>4/10</td>
<td></td>
</tr>
<tr>
<td>Marvel Rivals</td>
<td>4%</td>
<td>9/10</td>
<td></td>
</tr>
<tr>
<td>Cities: Skylines</td>
<td>3%</td>
<td>7/10</td>
<td></td>
</tr>
<tr>
<td>Tales From The Borderlands</td>
<td>3%</td>
<td>8/10</td>
<td>First played in 2025, 100% completed</td>
</tr>
<tr>
<td>The Sims 4</td>
<td>3%</td>
<td>7/10</td>
<td></td>
</tr>
<tr>
<td>Earn to Die 2</td>
<td>3%</td>
<td>8/10</td>
<td>First played in 2025, unlocked almost all achievements</td>
</tr>
<tr>
<td>American Arcadia</td>
<td>2%</td>
<td>8/10</td>
<td>First played in 2025, 100% completed</td>
</tr>
<tr>
<td>The Invincible</td>
<td>2%</td>
<td>6/10</td>
<td>First played in 2025, story completed</td>
</tr>
<tr>
<td>Isle of Arrows</td>
<td>2%</td>
<td>8/10</td>
<td>First played in 2025, played on mobile previously</td>
</tr>
<tr>
<td>Neighbours Back From Hell</td>
<td>1%</td>
<td>9/10</td>
<td>First played in 2025, 100% completed</td>
</tr>
<tr>
<td>Untitled Goose Game</td>
<td>1%</td>
<td>9/10</td>
<td></td>
</tr>
<tr>
<td>OpenTTD</td>
<td>1%</td>
<td>9/10</td>
<td></td>
</tr>
<tr>
<td>TheoTown</td>
<td>&lt;1%</td>
<td>9/10</td>
<td></td>
</tr>
<tr>
<td>Monument Valley</td>
<td>&lt;1%</td>
<td>8/10</td>
<td>First played in 2025, almost all achievements</td>
</tr>
<tr>
<td>The Zamazingo</td>
<td>&lt;1%</td>
<td>5/10</td>
<td>First played in 2025, 100% completed, was provided through Curator Connect and reviewed</td>
</tr>
<tr>
<td>Agent A</td>
<td>&lt;1%</td>
<td>7/10</td>
<td></td>
</tr>
<tr>
<td>Stardew Valley</td>
<td>&lt;1%</td>
<td>9/10</td>
<td>First played in 2025</td>
</tr>
<tr>
<td>DrainSim Demo</td>
<td>&lt;1%</td>
<td>7/10</td>
<td>First played in 2025</td>
</tr>
<tr>
<td>DEATHLOOP</td>
<td>&lt;1%</td>
<td>?/10</td>
<td>First played in 2025, did not run, planning to re-try in 2026</td>
</tr>
</tbody>
</table>
<h3 id="2025-music-recap" tabindex="-1">2025 music recap</h3>
<p>The music recap for 2025 is a little borked, because I had to switch music apps. I used Metrolist before I switched to OuterTune after Metrolist borked my liked list, probably because I liked so many songs, or some database corruption issue, idc.</p>
<aside class="aside-content monospace lightgray rem1"><p class="monospace bold rem1 hidden-on-desktop">Aside for paragraph below:</p><p>This also raises <em><strong>serious concerns</strong></em> about YouTube Music players on Android, because they're all forks of InnerTune, Metrolist or a fork of a fork. OuterTune is now EOL as of 2026, and I agree with <a href="https://github.com/OuterTune/OuterTune/discussions/1116#discussioncomment-15775805">Mostafaalgamy (Metrolist developer) and the idea that all of these players should merge into one project</a> since they're all just the same app(s) with some changes on top. Just unite and build a better fucking app, please.</p>
</aside>
<p>Unfortunately, OuterTune is very limited in what it can show as stats, so I checked the app's database, looked for the <code>playTime</code> column in the <code>events</code> table, used this SQL to sum it all up: <code>SELECT SUM(playTime) AS total_playtime FROM event;</code>, and converted the result from milliseconds to hours, for a total of 30 hours, 46 minutes, 59 seconds on top of the Jan-October 27 time from MetroList, whose (much more comprehensive) stats are available below:</p>
<p><strong>Metrolist stats</strong></p>
<p>Metrolist stats for 1 year (cutoff for Metrolist is October 27, 2025). To save you the time if you're not interested in skimming the tables below:</p>
<ul>
<li><strong>Most played artist in 2025: HEALTH</strong></li>
<li><strong>Most played album in 2025: VAMP by Magnolia Park</strong></li>
<li><strong>Most played song in 2025: WORSHIP by Vana, Plvtinum, Magnolia Park</strong></li>
<li><strong>Total (tracked) time spent listening to music in 2025: 306 hours, 34 minutes, 40 seconds</strong></li>
</ul>
<details>
    <summary>Small breakdown of the calculation</summary>
<p>Total time spent in 2025 (up until October 27, 2025) listening to music according to Metrolist: upwards of 275 hours, 47 minutes, 41 seconds. I've only calculated the first 165 artists, artists &gt;166 had play times of 15:50 and lower. If this were converted to days, it would be 11 days, 14h47m41s of continuous music playback.</p>
<p>To this, I add the &gt;30 hours, 46 minutes, 59 seconds from OuterTune that I calculated, and we get…</p>
<p><strong>Total (tracked) time spent listening to music in 2025:</strong> <strong>306 hours, 34 minutes, 40 seconds</strong> or 12 days, 18 hours, 34 minutes, 40 seconds of continuous music playback.</p>
<p>For this calculation I have used this <a href="https://datetimecalculator.com.co/add-time-calculator/">very handy calculator</a> that lets me add HH:MM:SS, and then it's all calculated at the end. How wonderful!</p>
</details>
<h5 id="491-artists" tabindex="-1">491 Artists</h5>
<table>
<thead>
<tr>
<th>Place on list</th>
<th>Artist / Band name</th>
<th>No. times played</th>
<th>Play time</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>01</strong></td>
<td><strong>HEALTH</strong></td>
<td><strong>368 times</strong></td>
<td><strong>22:42h</strong></td>
</tr>
<tr>
<td><strong>02</strong></td>
<td><strong>Maggie Lindemann</strong></td>
<td><strong>368 times</strong></td>
<td><strong>17:06h</strong></td>
</tr>
<tr>
<td><strong>03</strong></td>
<td><strong>The Weeknd</strong></td>
<td><strong>203 times</strong></td>
<td><strong>12:44h</strong></td>
</tr>
<tr>
<td><strong>04</strong></td>
<td><strong>Banshee</strong></td>
<td><strong>230 times</strong></td>
<td><strong>11:39h</strong></td>
</tr>
<tr>
<td><strong>05</strong></td>
<td><strong>Astrophysics</strong></td>
<td><strong>132 times</strong></td>
<td><strong>09:14:21h</strong></td>
</tr>
<tr>
<td>06</td>
<td>Magnolia Park</td>
<td>174 times</td>
<td>08:33:16h</td>
</tr>
<tr>
<td>07</td>
<td>Sub Urban</td>
<td>134 times</td>
<td>06:37:32h</td>
</tr>
<tr>
<td>08</td>
<td>Ari Abdul</td>
<td>116 times</td>
<td>06:29:46h</td>
</tr>
<tr>
<td>09</td>
<td>Alexis Munroe</td>
<td>97 times</td>
<td>05:41:30h</td>
</tr>
<tr>
<td>10</td>
<td>Lazza</td>
<td>98 times</td>
<td>05:37:27h</td>
</tr>
<tr>
<td>11</td>
<td>THEY.</td>
<td>96 times</td>
<td>05:22:38h</td>
</tr>
<tr>
<td>12</td>
<td>Sleep Token</td>
<td>51 times</td>
<td>05:11:32h</td>
</tr>
<tr>
<td>13</td>
<td>NXCRE</td>
<td>80 times</td>
<td>04:26:00h</td>
</tr>
<tr>
<td>14</td>
<td>Jfarrari</td>
<td>81 times</td>
<td>04:12:29h</td>
</tr>
<tr>
<td>15</td>
<td>Vana</td>
<td>55 times</td>
<td>04:10:02h</td>
</tr>
<tr>
<td>16</td>
<td>Chase Atlantic</td>
<td>74 times</td>
<td>04:04:03h</td>
</tr>
<tr>
<td>17</td>
<td>Geoffplaysguitar</td>
<td>57 times</td>
<td>03:40:08h</td>
</tr>
<tr>
<td>18</td>
<td>Plvtinum</td>
<td>38 times</td>
<td>03:35:49h</td>
</tr>
<tr>
<td>19</td>
<td>The Villains</td>
<td>58 times</td>
<td>03:33:53h</td>
</tr>
<tr>
<td>20</td>
<td>P.T. Adamczyk</td>
<td>53 times</td>
<td>03:33:11h</td>
</tr>
<tr>
<td>21</td>
<td>Chris Grey</td>
<td>52 times</td>
<td>03:04:22h</td>
</tr>
<tr>
<td>22</td>
<td>Power Glove</td>
<td>91 times</td>
<td>02:54:00h</td>
</tr>
<tr>
<td>23</td>
<td>VIOLENT VIRA</td>
<td>66 times</td>
<td>02:53:47h</td>
</tr>
<tr>
<td>24</td>
<td>Eftalya Yağcı</td>
<td>56 times</td>
<td>02:51:02h</td>
</tr>
<tr>
<td>25</td>
<td>Artemas</td>
<td>61 times</td>
<td>02:50:10h</td>
</tr>
</tbody>
</table>
<h5 id="other-notable-artists-that-i-recommend%3A" tabindex="-1">Other notable artists that I recommend:</h5>
<table>
<thead>
<tr>
<th>Place on list</th>
<th>Artist / Band name</th>
<th>No. times played</th>
<th>Play time</th>
</tr>
</thead>
<tbody>
<tr>
<td>26</td>
<td>MORGENSHTERN</td>
<td>59 times</td>
<td>02:41:07h</td>
</tr>
<tr>
<td>27</td>
<td>Kim Petras</td>
<td>54 times</td>
<td>02:32:48h</td>
</tr>
<tr>
<td>28</td>
<td>Atomic Heart</td>
<td>46 times</td>
<td>01:57:08h</td>
</tr>
<tr>
<td>29</td>
<td>Valve</td>
<td>25 times</td>
<td>01:53:28h</td>
</tr>
<tr>
<td>30</td>
<td>The Neighourhood</td>
<td>27 times</td>
<td>01:52:08h</td>
</tr>
<tr>
<td>40</td>
<td>Aurora Olivas, Reed Wonder</td>
<td>33 times</td>
<td>01:39:44h</td>
</tr>
<tr>
<td>43</td>
<td>GIMS</td>
<td>28 times</td>
<td>01:35:05h</td>
</tr>
<tr>
<td>45</td>
<td>Perturbator</td>
<td>24 times</td>
<td>01:30:02h</td>
</tr>
<tr>
<td>47</td>
<td>Tyler Bates</td>
<td>30 times</td>
<td>01:22:25h</td>
</tr>
<tr>
<td>51</td>
<td>The Kid Laroi</td>
<td>28 times</td>
<td>01:14:32h</td>
</tr>
<tr>
<td>58</td>
<td>Bruklin</td>
<td>27 times</td>
<td>01:08:12h</td>
</tr>
<tr>
<td>67</td>
<td>Amira Elfeky</td>
<td>17 times</td>
<td>00:57:46h</td>
</tr>
</tbody>
</table>
<h5 id="282-albums" tabindex="-1">282 Albums</h5>
<table>
<thead>
<tr>
<th>Place on list</th>
<th>Album name</th>
<th>Release year</th>
<th>Artist / Band name</th>
<th>No. times played</th>
<th>Play time</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>01</strong></td>
<td><strong>VAMP</strong></td>
<td><strong>2025</strong></td>
<td><strong>Magnolia Park</strong></td>
<td><strong>164 times</strong></td>
<td><strong>08:02:31h</strong></td>
</tr>
<tr>
<td><strong>02</strong></td>
<td><strong>DISCO4+</strong></td>
<td><strong>2021</strong></td>
<td><strong>HEALTH</strong></td>
<td><strong>119 times</strong></td>
<td><strong>07:32:46h</strong></td>
</tr>
<tr>
<td><strong>03</strong></td>
<td><strong>SUCKERPUNCH (deluxe edition)</strong></td>
<td><strong>2023</strong></td>
<td><strong>Maggie Lindemann</strong></td>
<td><strong>142 times</strong></td>
<td><strong>06:59:37h</strong></td>
</tr>
<tr>
<td><strong>04</strong></td>
<td><strong>Devil May Cry (Soundtrack from the Netflix Series)</strong></td>
<td><strong>2025</strong></td>
<td><strong>Power Glove</strong></td>
<td><strong>144 times</strong></td>
<td><strong>06:54:00h</strong></td>
</tr>
<tr>
<td><strong>05</strong></td>
<td><strong>The Highlights (Deluxe)</strong></td>
<td><strong>2024</strong></td>
<td><strong>The Weeknd</strong></td>
<td><strong>98 times</strong></td>
<td><strong>06:47:44h</strong></td>
</tr>
<tr>
<td>06</td>
<td>DISCO4, PART I</td>
<td>2020</td>
<td>HEALTH</td>
<td>102 times</td>
<td>06:32:26h</td>
</tr>
<tr>
<td>07</td>
<td>If Nevermore</td>
<td>2025</td>
<td>Sub Urban</td>
<td>116 times</td>
<td>05:55:57h</td>
</tr>
<tr>
<td>08</td>
<td>Even In Arcadia</td>
<td>2025</td>
<td>Sleep Token</td>
<td>51 times</td>
<td>05:11:32h</td>
</tr>
<tr>
<td>09</td>
<td>PARANOIA</td>
<td>2021</td>
<td>Maggie Lindemann</td>
<td>120 times</td>
<td>05:03:00h</td>
</tr>
<tr>
<td>10</td>
<td>LOCURA (Opera)</td>
<td>2025</td>
<td>Lazza</td>
<td>69 times</td>
<td>04:07:06h</td>
</tr>
<tr>
<td>11</td>
<td>Deus Ex: Mankind Divided (Original Soundtrack) [Extended Edition]</td>
<td>2016</td>
<td>Michael McCann, Sascha Dikiciyan</td>
<td>48 times</td>
<td>03:52:03h</td>
</tr>
<tr>
<td>12</td>
<td>Revolutionary Girl</td>
<td>2018</td>
<td>Astrophysics</td>
<td>59 times</td>
<td>03:46:09h</td>
</tr>
<tr>
<td>13</td>
<td>Hurry Up Tomorrow</td>
<td>2025</td>
<td>The Weeknd</td>
<td>53 times</td>
<td>03:44:17h</td>
</tr>
<tr>
<td>14</td>
<td>ENDLESS</td>
<td>2024</td>
<td>NXCRE, The Villains</td>
<td>51 times</td>
<td>03:11:18h</td>
</tr>
<tr>
<td>15</td>
<td>DISCO4 :: PART II</td>
<td>2022</td>
<td>HEALTH</td>
<td>41 times</td>
<td>02:55:54h</td>
</tr>
<tr>
<td>16</td>
<td>Bitterness</td>
<td>2019</td>
<td>Astrophysics</td>
<td>40 times</td>
<td>02:50:33h</td>
</tr>
<tr>
<td>17</td>
<td>Veil of the Eternal Night (Original Campaign Soundtrack)</td>
<td>2025</td>
<td>Geoffplaysguitar</td>
<td>37 times</td>
<td>02:40:18h</td>
</tr>
<tr>
<td>18</td>
<td>TURN OFF THE LIGHT</td>
<td>2020</td>
<td>Kim Petras</td>
<td>51 times</td>
<td>02:28:29h</td>
</tr>
<tr>
<td>19</td>
<td>BEAUTY IN DEATH (DELUXE EDITION)</td>
<td>2022</td>
<td>Chase Atlantic</td>
<td>42 times</td>
<td>02:24:33h</td>
</tr>
<tr>
<td>20</td>
<td>HEADSPLIT (Deluxe)</td>
<td>2024</td>
<td>Maggie Lindemann</td>
<td>53 times</td>
<td>02:16:31h</td>
</tr>
<tr>
<td>21</td>
<td>Atomic Heart, Vol. 3 (Original Game Soundtrack)</td>
<td>2023</td>
<td>Atomic Heart</td>
<td>53 times</td>
<td>02:08:59h</td>
</tr>
<tr>
<td>22</td>
<td>Cyberpunk 2077: Phantom Liberty (Original Score - Deluxe Edition)</td>
<td>2023</td>
<td>P.T. Adamczyk, Jacek Paciorkowski</td>
<td>30 times</td>
<td>02:06:10h</td>
</tr>
<tr>
<td>23</td>
<td>Half-Life: Alyx</td>
<td>2022</td>
<td>Valve</td>
<td>22 times</td>
<td>01:44:43h</td>
</tr>
<tr>
<td>24</td>
<td>MEAN</td>
<td>2025</td>
<td>HEALTH, Cchelsea Wolfe</td>
<td>26 times</td>
<td>01:39:50h</td>
</tr>
<tr>
<td>25</td>
<td>LOCURA</td>
<td>2024</td>
<td>Lazza</td>
<td>29 times</td>
<td>01:30:21h</td>
</tr>
</tbody>
</table>
<h5 id="1472-songs" tabindex="-1">1472 Songs</h5>
<table>
<thead>
<tr>
<th>Place on list</th>
<th>Song name</th>
<th>Album name</th>
<th>Release year</th>
<th>Artist / Band name</th>
<th>No. times played</th>
<th>Play time</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>01</strong></td>
<td><strong>WORSHIP</strong></td>
<td><strong>VAMP</strong></td>
<td><strong>2025</strong></td>
<td><strong>Vana, Magnolia Park, Plvtinum</strong></td>
<td><strong>38 times</strong></td>
<td><strong>03:35:49h</strong></td>
</tr>
<tr>
<td><strong>02</strong></td>
<td><strong>Infinite Baths</strong></td>
<td><strong>Even In Arcadia</strong></td>
<td><strong>2025</strong></td>
<td><strong>Sleep Token</strong></td>
<td><strong>23 times</strong></td>
<td><strong>03:17:57h</strong></td>
</tr>
<tr>
<td><strong>03</strong></td>
<td><strong>COLORS (THOMAAS BANKS RMX)</strong></td>
<td><strong>DISCO4+</strong></td>
<td><strong>2021</strong></td>
<td><strong>HEALTH, The Soft Moon</strong></td>
<td><strong>28 times</strong></td>
<td><strong>02:36:38h</strong></td>
</tr>
<tr>
<td><strong>04</strong></td>
<td><strong>girl next door</strong></td>
<td><strong>SUCKERPUNCH (deluxe version)</strong></td>
<td><strong>2023</strong></td>
<td><strong>Maggie Lindemann</strong></td>
<td><strong>42 times</strong></td>
<td><strong>02:18:32h</strong></td>
</tr>
<tr>
<td><strong>05</strong></td>
<td><strong>Afterlife (from the Netflix Series &quot;Devil May Cry&quot;)</strong></td>
<td><strong>Devil May Cry (Soundtrack from the Netflix Series)</strong></td>
<td><strong>2025</strong></td>
<td><strong>Evanescence</strong></td>
<td><strong>22 times</strong></td>
<td><strong>02:12:36h</strong></td>
</tr>
<tr>
<td>06</td>
<td>NO ESCAPE</td>
<td>DISCO4 :: PART II</td>
<td>2024</td>
<td>HEALTH, The Neighbourhood</td>
<td>26 times</td>
<td>01:51:05h</td>
</tr>
<tr>
<td>07</td>
<td>COLORS</td>
<td>DISCO4</td>
<td>2024</td>
<td>HEALTH, The Soft Moon</td>
<td>20 times</td>
<td>01:48:46h</td>
</tr>
<tr>
<td>08</td>
<td>MEAN</td>
<td>MEAN</td>
<td>2025</td>
<td>HEALTH, Chelsea Wolfe</td>
<td>26 times</td>
<td>01:39:50h</td>
</tr>
<tr>
<td>09</td>
<td>Skinny Loser</td>
<td>If Nevermore</td>
<td>2025</td>
<td>Sub Urban</td>
<td>19 times</td>
<td>01:37:57h</td>
</tr>
<tr>
<td>10</td>
<td>Mood Swings</td>
<td>Amanda Tape</td>
<td>2020</td>
<td>THEY.</td>
<td>22 times</td>
<td>01:35:16h</td>
</tr>
<tr>
<td>11</td>
<td>House Of Balloons / Glass Table Girls</td>
<td>The Highlights (Deluxe)</td>
<td>2024</td>
<td>The Weeknd</td>
<td>14 times</td>
<td>01:30:23h</td>
</tr>
<tr>
<td>12</td>
<td>Deep End</td>
<td>Nü Religion: HYENA</td>
<td>2017</td>
<td>THEY.</td>
<td>24 times</td>
<td>01:29:43h</td>
</tr>
<tr>
<td>13</td>
<td>DELICIOUS APE</td>
<td>DISCO4, PART I</td>
<td>2020</td>
<td>HEALTH, Xiu Xiu</td>
<td>19 times</td>
<td>01:25:57h</td>
</tr>
<tr>
<td>14</td>
<td>No Escape</td>
<td>Devil May Cry (Soundtrack from the Netflix Series)</td>
<td>2025</td>
<td>Alex Seaver</td>
<td>17 times</td>
<td>01:23:40h</td>
</tr>
<tr>
<td>15</td>
<td>SHALLOW</td>
<td>VAMP</td>
<td>2025</td>
<td>Magnolia Park</td>
<td>33 times</td>
<td>01:22:33h</td>
</tr>
<tr>
<td>16</td>
<td>Take My Breath</td>
<td>The Highlights (Deluxe)</td>
<td>2024</td>
<td>The Weeknd</td>
<td>14 times</td>
<td>01:21:45h</td>
</tr>
<tr>
<td>17</td>
<td>OHMAMI</td>
<td>BEAUTY IN DEATH (DELUXE EDITION)</td>
<td>2022</td>
<td>Chase Atlantic, Maggie Lindemann</td>
<td>24 times</td>
<td>01:21:03h</td>
</tr>
<tr>
<td>18</td>
<td>Dabbington City</td>
<td>ENDLESS</td>
<td>2024</td>
<td>NXCRE, The Villains</td>
<td>19 times</td>
<td>01:19:40h</td>
</tr>
<tr>
<td>19</td>
<td>Versalife</td>
<td>Deus Ex: Mankind Divided (Original Soundtrack) [Extended Edition]</td>
<td>2016</td>
<td>Ed Harrison</td>
<td>12 times</td>
<td>01:19:35h</td>
</tr>
<tr>
<td>20</td>
<td>self sabotage</td>
<td>SUCKERPUNCH (deluxe version)</td>
<td>2023</td>
<td>Maggie Lindemann</td>
<td>23 times</td>
<td>01:19:09h</td>
</tr>
<tr>
<td>21</td>
<td>U Don't Care</td>
<td>Sick of It All</td>
<td>2020</td>
<td>Alexis Munroe</td>
<td>11 times</td>
<td>01:17:42h</td>
</tr>
<tr>
<td>22</td>
<td>CASANOVA (Opera)</td>
<td>LOCURA (Opera)</td>
<td>2025</td>
<td>Artie 5ive, Lazza</td>
<td>19 times</td>
<td>01:17:16h</td>
</tr>
<tr>
<td>23</td>
<td>Hiding</td>
<td>The Best I Ever Had</td>
<td>2023</td>
<td>Limi</td>
<td>19 times</td>
<td>01:17:11h</td>
</tr>
<tr>
<td>24</td>
<td>DANSÖZ</td>
<td>Günaydın</td>
<td>2023</td>
<td>Eftalya Yağcı</td>
<td>21 times</td>
<td>01:17:05h</td>
</tr>
<tr>
<td>25</td>
<td>Hola Señorita</td>
<td>Ceinture noire (Transcendance)</td>
<td>2019</td>
<td>GIMS, Maluma</td>
<td>20 times</td>
<td>01:17:00h</td>
</tr>
</tbody>
</table>
<h3 id="2025-movie-and-show-recap" tabindex="-1">2025 movie and show recap</h3>
<p>A table of movies and shows that I have watched and/or re-watched in 2025, sorted alphabetically.</p>
<p>This year, I would like to highlight the best stuff I've watched - TRON: Uprising, a Disney show that only received one season and was scrapped (<em>some S2 storyboards were made, however</em>), and its horrendous sibling, TRON: Ares, which is just another unwanted, unneeded tragedy in a series that would greatly benefit if they would stop making real-life movies, and focus exclusively on animation.</p>
<p>TRON: Uprising is a fantastic fucking show, and it should be a national tragedy that Disney canned it for some unspecified reason. Fuck Disney, you ghouls. I can't believe that you greenlit Ares despite literally nobody requesting more real-life TRON content. Just please make another animated show or movie in the style of Uprising, if you <em>insist</em> on more TRON in the future. The characters are great, the music is <em>overwhelmingly</em> fantastic, the visuals are surprisingly fucking good for a 2012 animated show, and the art style is <em>simply exquisite</em>. One of the best characters in the show, and <a href="https://music.youtube.com/watch?v=wQxmheSF3YU">his associated music</a> is Dyson. Joseph Trapanese, the composer of this soundtrack, is a fucking legend in my book for this.</p>
<p>Screenshots and screen recordings or snipppers on YouTube do NOT do this show justice, it looks crisp at 1080p, and the art style is oh so fitting for the TRON series.</p>
<table>
<thead>
<tr>
<th>Title</th>
<th>Release year</th>
<th>Movie/Show?</th>
<th>Rating (0-10)</th>
</tr>
</thead>
<tbody>
<tr>
<td>A House of Dynamite</td>
<td>2025</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>A Minecraft Movie</td>
<td>2025</td>
<td>Movie</td>
<td>4/10</td>
</tr>
<tr>
<td>A Working Man</td>
<td>2025</td>
<td>Movie</td>
<td>6/10</td>
</tr>
<tr>
<td>Ballerina</td>
<td>2025</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>Billionaires' Bunker / <em>El refugio atómico</em> [S1]</td>
<td>2025</td>
<td>Show</td>
<td>5/10</td>
</tr>
<tr>
<td>Captain America: Brave New World</td>
<td>2025</td>
<td>Movie</td>
<td>3/10</td>
</tr>
<tr>
<td>Cassandra [S1]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Castlevania: Nocturne</td>
<td>2023</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Common Side Effects [S1]</td>
<td>2025</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Creature Commandos [S1]</td>
<td>2024</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Daredevil [S1]</td>
<td>2015</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Daredevil: Born Again [S1]</td>
<td>2025</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Den of Thieves</td>
<td>2018</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>Den of Thieves 2: Panthera</td>
<td>2025</td>
<td>Movie</td>
<td>6/10</td>
</tr>
<tr>
<td>Devil May Cry</td>
<td>2025</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Dexter: Resurrection [a few episodes of S1]</td>
<td>2025</td>
<td>Show</td>
<td>6/10</td>
</tr>
<tr>
<td>Duster [S1]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Five Nights at Freddy's 2</td>
<td>2025</td>
<td>Movie</td>
<td>3/10</td>
</tr>
<tr>
<td>Gen V [S2, 2025]</td>
<td>2023</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Good Fortune</td>
<td>2025</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>Government Cheese [S1]</td>
<td>2025</td>
<td>Show</td>
<td>6/10</td>
</tr>
<tr>
<td>Harley Quinn [S5]</td>
<td>2019</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Haunted Hotel [S1]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Heads of State</td>
<td>2025</td>
<td>Movie</td>
<td>5/10</td>
</tr>
<tr>
<td>Heat</td>
<td>1995</td>
<td>Movie</td>
<td>9/10</td>
</tr>
<tr>
<td>Heated Rivalry [S1]</td>
<td>2025</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>House, M.D [S1, 1/2 S2]</td>
<td>2004</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Inglorious Basterds</td>
<td>2009</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>Inside Man</td>
<td>2006</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>Invincible [S3]</td>
<td>2021</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>K-Pop Demon Hunters</td>
<td>2025</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>Lazarus [S1]</td>
<td>2025</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Long Story Short [S1]</td>
<td>2025</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Mission Impossible: The Final Reckoning</td>
<td>2025</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>Mobile Suit Gundam GQuuuuuuX [S1]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Murderbot [S1]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>My Dress-Up Darling [S1-S2]</td>
<td>2022</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Nobody 2</td>
<td>2025</td>
<td>Movie</td>
<td>6/10</td>
</tr>
<tr>
<td>Now You See Me</td>
<td>2013</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>Now You See Me 2</td>
<td>2016</td>
<td>Movie</td>
<td>5/10</td>
</tr>
<tr>
<td>Now You See Me: Now You Don't</td>
<td>2025</td>
<td>Movie</td>
<td>5/10</td>
</tr>
<tr>
<td>Pluribus [S1]</td>
<td>2025</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Poker Face [S2]</td>
<td>2023</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Reacher [S3]</td>
<td>2022</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Rick and Morty [S8]</td>
<td>2013</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Severance [S2]</td>
<td>2022</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Slow Horses [S5]</td>
<td>2022</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Splinter Cell: Deathwatch [S1]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Squid Game [S3]</td>
<td>2021</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Stranger Things [S5]</td>
<td>2016</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Superman</td>
<td>2025</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>The Accountant</td>
<td>2016</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>The Accountant 2</td>
<td>2025</td>
<td>Movie</td>
<td>6/10</td>
</tr>
<tr>
<td>The Agency [S1]</td>
<td>2024</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>The Amateur</td>
<td>2025</td>
<td>Movie</td>
<td>4/10</td>
</tr>
<tr>
<td>The Bad Guys 2</td>
<td>2025</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>The Chair Company [S1]</td>
<td>2025</td>
<td>Show</td>
<td>5/10</td>
</tr>
<tr>
<td>The Equalizer</td>
<td>2014</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>The Equalizer 2</td>
<td>2018</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>The Fantastic Four: First Steps</td>
<td>2025</td>
<td>Movie</td>
<td>7/10</td>
</tr>
<tr>
<td>The Hunting Party [S1]</td>
<td>2025</td>
<td>Show</td>
<td>6/10</td>
</tr>
<tr>
<td>The Night Agent [S2]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>The Office (US) [S1-S3]</td>
<td>2005</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>the paper [S1]</td>
<td>2025</td>
<td>Show</td>
<td>6/10</td>
</tr>
<tr>
<td>The Phoenician Scheme</td>
<td>2025</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>The Recruit [S2]</td>
<td>2022</td>
<td>Show</td>
<td>6/10</td>
</tr>
<tr>
<td>The Studio [S1]</td>
<td>2025</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>The Town</td>
<td>2010</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>The White Lotus [S1-3]</td>
<td>2021</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>The Wonderfully Weird World of Gumball [E1-3S1]</td>
<td>2025</td>
<td>Show</td>
<td>5/10</td>
</tr>
<tr>
<td>There's No Freaking Way I'll Be Your Lover! Unless... / <em>Watashi ga Koibito ni Nareru Wakenaijan, Muri Muri! (*Muri Janakatta!?)</em> [S1]</td>
<td>2025</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>Thunderbolts</td>
<td>2025</td>
<td>Movie</td>
<td>6/10</td>
</tr>
<tr>
<td>Tracker [S3]</td>
<td>2024</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>TRON: Ares</td>
<td>2025</td>
<td>Movie</td>
<td>3/10</td>
</tr>
<tr>
<td>TRON: Uprising</td>
<td>2012</td>
<td>Show</td>
<td>9/10</td>
</tr>
<tr>
<td>Wake Up Dead Man: A Knives Out Mystery</td>
<td>2025</td>
<td>Movie</td>
<td>8/10</td>
</tr>
<tr>
<td>Wednesday [S2]</td>
<td>2022</td>
<td>Show</td>
<td>8/10</td>
</tr>
<tr>
<td>You [S1-5]</td>
<td>2018</td>
<td>Show</td>
<td>7/10</td>
</tr>
<tr>
<td>Your Friends &amp; Neighbors</td>
<td>2025</td>
<td>Show</td>
<td>8/10</td>
</tr>
</tbody>
</table>
<h2 id="january-2026-and-beyond" tabindex="-1">January 2026 and beyond</h2>
<p>As per tradition, new year, new website update — well, this was in the works since October 2025. Anyway, I moved the blog from Ruby and Jekyll to JavaScript and 11ty, removed all client-side JS and re-integrated those features with just pure CSS (e.g. themes, effects), Liquid, and 11ty JS plugins. I have reworked it a bit (as always), spaced out some stuff because the post text seemed too cramped, and added a few new features.</p>
<h3 id="small-rant-about-js-and-the-web" tabindex="-1">Small rant about JS and the web</h3>
<p>I was browsing on January 12 a few blogs that posted about how PGP and email encryption is shite, and one of the sites (a small company's blog) had a TOC that couldn't be opened without JavaScript. Another blog couldn't let me open the hamburger menu to see their blog navigation - again, without JS. If I can't open your post's table of contents or your navigation menu without javascript, you need to go back to the drawing board and rework your site so that it does. We have &lt;details&gt; and &lt;summary&gt; in HTML for a reason, use them.</p>
<p>I'll continue fact-checking posts on Fedi for one, and calling out slop accounts that show up. I've had at least two accounts <a href="https://techhub.social/@alextecplayz/113810663257913401">get mad at me for fact checking an AI-generated image</a>, and a certain someone that was pretty pissed because I commented &quot;AI slop, fuck off&quot; on their Fedi-bridged Bluesky bot account posting about Amazon products with just a description of the product (which may very well be just AI) and an affiliate link, and then getting sockpuppet accounts of theirs to harass me about it for a week or so.</p>
<h3 id="new-year's-resolutions-for-2026" tabindex="-1">New Year's resolutions for 2026</h3>
<ol>
<li>Start transitioning (already in progress, will have my blood tests in March, next endo appointment is in April, if all goes well, I should end up on HRT!)</li>
<li>Voice therapy</li>
<li>Get better at blogging, writing, and <em>actually</em> blog more</li>
<li>Get a stable, full-time remote job</li>
<li>Read more books (can you tell I haven't read a physical book in some time?) I mostly read scientific articles, Wikipedia pages, long-form text on the web, but it just doesn't feel the same, and an e-reader (heck, an e-reader that can be jailbroken, like the reMarkable tablets) are prohibitively expensive. I mean, the reMarkable Paper Pro 11.8&quot; is as expensive as the Galaxy S25 Ultra on eMAG. The reMarkable 2 is as much as a Galaxy S25FE, an iPhone 13, a Google Pixel 9 or a Pixel 9a</li>
<li>Improve my work-life balance, find a way to reduce the impact of a potential burnout (<em>or try to not end up with burnout in the first place!</em>)</li>
<li>ACTUALLY release a damn game or something!</li>
</ol>
<p>re 7: I'm working on two projects, PRISONIA and Project Neighbourhood. PN is going to be released as a demo on itch someday (this will get delayed if I do end up getting a full-time job, though, because I'm a mess at having an actual schedule!). I also really want to release PRISONIA in Early Access on Steam and Itch as well, but I didn't work on it at all at the end of last year. I'm also currently busy with building engine plugins for myself that will hopefully benefit all of my projects. More on that in my updated <a href="/posts/2024-01-14-Sapphire-thread.html">Sapphire thread post</a>, so both projects are currently on hold while I build these plugins. No ETA for either of them, and I'll stop providing ETAs until I'm absolutely certain of something, because it never works out for me due to various factors <em>(randomly gesturing around)</em>.</p>
<p>Even IF I were to release PRISONIA as a commercial product, I'd still have to read (and have been reading for the last two years) legislation regarding selling stuff digitally in Romania, because you need some sort of tax code, and some sort of juridical legal entity such as a business or self-owned enterprise. Both cost quite a bit of money, and I'd have to hire a lawyer and accountant or go through some service that would handle it for me, PLUS providing a physical address for it - I'm not using my own, that's for sure.</p>
<aside class="aside-content monospace lightgray rem1"><p class="monospace bold rem1 hidden-on-desktop">Aside for paragraph below:</p><p><strong>February edit: <a href="https://www.posta-romana.ro/gazduire-sedii-sociale.html">the Romanian post now allows people to use the address of the post office as the official address of your company</a></strong>, so I think I'll do that when it's time to release PRISONIA. This way, I can both have a company AND publish to Google Play without getting doxxed. <a href="https://keepandroidopen.org/">And fuck Google for trying to lock-down the Android platform for devs.</a></p>
</aside>
<details>
    <summary>Bit of an explainer if you're into that</summary>
<p><strong>February edit: I can use a PO address, so I don't need a commercial space to be bought or rented to have a SRL.</strong></p>
<p>I can't use my own address as a business because (1) I don't want to doxx myself and (2) it's an apartment. If someone is opening up a business using an address that is an apartment, they must get the signatures of everyone in the building that they approve having a business in the same building, plus the HOA approval.</p>
<p>For business entities, I would most likely start an LLC (Romanian: SRL — Limited Responsibility Society) than a self-owned enterprise (Romanian: II — Întreprindere Individuală), and most likely won't go down the PFA (Romanian: PFA — Persoană Fizică Autorizată / Authorized Physical Person), which for some specific tax codes requires some sort of formal certification or diploma.</p>
<p>Sorry, perhaps that wasn't helpful. Let's compare SRL, II and PFA in Romania:</p>
<table>
<thead>
<tr>
<th>Aspect</th>
<th>SRL</th>
<th>PFA</th>
<th>II</th>
</tr>
</thead>
<tbody>
<tr>
<td>Cost to create</td>
<td>120 RON if you do it all by yourself (handle the boundless incompetence and overbearing bureaucracy)<br>or upwards of 1000 RON if using some service</td>
<td>free if you do it yourself or 300-500 RON via services (e.g. <a href="https://www.solo.ro/">SOLO.ro</a>)</td>
<td>300-600 RON founding tax at the Commerce Registry (Registrul Comerțului)</td>
</tr>
<tr>
<td>Financial responsibility</td>
<td>Limited to company assets (personal assets protected unless financial abuse is proven)</td>
<td>Unlimited; personal assets (car, house) at risk for business debts</td>
<td>Unlimited; personal assets (car, house) at risk for business debts</td>
</tr>
<tr>
<td>Minimum social capital</td>
<td>1 RON minimum, but it's usually 200 RON</td>
<td>None</td>
<td>None</td>
</tr>
<tr>
<td>Ownership</td>
<td>1-50 associates (not that it matters, I plan to be the only associate)</td>
<td>Individual, can hire max 3 people</td>
<td>Individual, can hire max 8 people</td>
</tr>
<tr>
<td>Can have other business activities?</td>
<td>Yes</td>
<td>Can not open an II if you have a PFA</td>
<td>Can not open a PFA if you have an II</td>
</tr>
<tr>
<td>Maximum number of activities (CAEN codes)</td>
<td>No legal limit</td>
<td>5</td>
<td>10</td>
</tr>
</tbody>
</table>
<p>There is also a special temporary form of an SRL, SRL-D (Debuting LLC), which provides some income tax exceptions. It's basically a program for start-ups. Comparison:</p>
<table>
<thead>
<tr>
<th>Aspect</th>
<th>SRL</th>
<th>SRL-D</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ownership</td>
<td>1-50 associates</td>
<td>1 resident natural person in Romania</td>
</tr>
<tr>
<td>Minimum social capital</td>
<td>1 RON minimum, but it's usually 200 RON</td>
<td>1 RON</td>
</tr>
<tr>
<td>Special conditions</td>
<td>None</td>
<td>Creator has not owned a previous SRL, isn't an associate, shareholder, or owner of other LLCs in the EEA</td>
</tr>
<tr>
<td>Permitted activities (CAEN codes)</td>
<td>No legal limit</td>
<td>Only activities from the ONRC list, max 5 CAEN code groups, no consultancy or juridic activities</td>
</tr>
<tr>
<td>Facilities</td>
<td>Standard taxation</td>
<td><a href="https://www.onrc.ro/index.php/ro/care-sunt-conditiile-pentru-infiintarea-unui-srl-d-si-cand-se-pierde-calitatea-de-intreprinzator-debutant-in-afaceri#:~:text=Care%20sunt%20facilit%C4%83%C8%9Bile%20acordate%20micro%C3%AEntreprinderii%20apar%C5%A3in%C3%A2nd%20%C3%AEntreprinz%C4%83torului%20debutant">A bunch of facilities (Romanian text)</a></td>
</tr>
</tbody>
</table>
<p>So, SRL-D seems the most optimal, and regular SRL if SRL-D isn't possible. I don't want to put my personal assets at risk, PFA entities are great if you have guaranteed income and profit, but since I suck at economics and predicting if I'm going to be successful, I'm not going that route.</p>
<p>I'll bother with all the legalese stuff when I actually have a product that I'm comfortable selling in Early Access, so I'm not taking any decisions now. I still need to read more on this and perhaps get a few opinions from other indie game devs. Furthermore, I'm not sure if I'd like to go through a publisher to sell my stuff, but it's something I have considered, such as <a href="https://pitch.devolverdigital.com/">Devolver Digital</a> and <a href="https://www.humblegames.com/submit-a-game/">Humble Games</a>.</p>
<p>That's your small 'legal entities in Romania lesson', hope you have enjoyed it!</p>
</details>]]></content:encoded>
					<guid>PO-260111-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Musings about AI]]></title>
					<link>/posts/2026-01-10-AI-Musings.html</link>
					<description>My musings about AI. A whole post about it.</description>
					<pubDate>Fri, 09 Jan 2026 22:00:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><strong>This is a living document, it already has headings for future topics.</strong></p>
<p>I dislike AI. I'm not against it if you'd use it as a tool. I use Perplexity (the website, I wouldn't dare use an AI browser), but I fact check and test everything from it, I'm not blindly copying shit from it. I also use Duck AI, but I'd rather use Perplexity simply because it lists sources and information better.</p>
<p>But anything more? I dislike it. I'm starting to hate it, actually.</p>
<p>(This post was originally written to be published October 4, but because i moved my site to 11ty, several posts written starting in October, weren't published since it was all put on pause due to work and whatnot. This was updated January 10, 2026.)</p>
<h2 id="why%3F" tabindex="-1">Why?</h2>
<p>This post was spurred by a few things:</p>
<ol>
<li>I never wrote a full-on explainer on my stance against AI</li>
<li>I read many (proper) articles about AI from the Fediverse, loved them all</li>
<li>Mishaal Rahman <a href="https://techhub.social/@MishaalRahman@androiddev.social/115312032990674166">asked for people to comment on his post</a> about what do they think about the Rabbit R1, which prompted a <a href="https://techhub.social/@alextecplayz/115312091662307649">three word-filled thread from me</a></li>
<li>I was listening to music and realized the fucking song I was listening to was AI</li>
</ol>
<p>I'll mirror some of the stuff I said in Mishaal's thread, because it's largely what I think about some uses of AI.</p>
<h2 id="ai-gadgets-(e.g.-rabbit-r1%2C-friend)" tabindex="-1">AI Gadgets (e.g. Rabbit R1, friend)</h2>
<p>AI gadgets were never going to take off. Not only do they make you look like Mark fucking Zuckerberg wearing those shitty, oversized Meta RayBans, but you look like a fucking techbro. Linus reviewed the <em>friend</em> AI wearable doohickey, and he looked like a techbro -- not the nerdy, cool type of techbro, that you'd trust with your computer, but the Sillicon Valley kind of techbro, the libertarian, turbo-capitalist kind of techbro that needs money more than they need air. the kind of techbro that sees the AI bubble and desperately wants to capitalize it, not only because by being a turbo-capitalist techbro, the mere presence, or whiff of someone like that stepping in San Francisco makes rent go up like $100 each time they move, but because they can, and are encouraged to do so.</p>
<p>Here's why they fail:</p>
<p>One. They need tens of millions of dollars in funding, because of course they do. But it's not enough! Sure, the Rabbit r1, the Humane AI Pin, the friend may cost pennies on the dollar to make and sell, but you need to factor in the OpenAI API usage, and y'know, the founder(s) skimming and stealing the rest while claiming it goes to R&amp;D and whatnot.</p>
<p>Rabbit r1 had $30 million in funding from VCs. They sold &gt;130,000 units. It costs $200, but it has other things you need to pay for as well - the monthly data plan, Spotify Premium and Midjourney, if you need them.</p>
<p>friend is a $7 million startup, spent $1 million on marketing. friend costs $130.</p>
<p>Humane AI Pin raised more than $330 million from shmucks such as Marc Benioff, Sam fucking Altman himself, Qualcomm, Microsoft, LG, Volvo, Salesforce, and from Series B and C rounds. They shipped ~10,000 units, priced starting at $500.</p>
<p>Two. They're smug about their product. They call it the future, the post-AGI, the pre-AGI, the just-in-time-AGI, the whatever-the-fuck-AGI products, etc.</p>
<h3 id="friend" tabindex="-1">friend</h3>
<p>Take a look at this: The 22-year-old founder of friend says, after <a href="https://fortune.com/2025/10/01/who-is-avi-schiffmann-friend-ai-pendant-necklace/">his ads that were defaced his stupid fucking ads with graffiti, that &quot;Capitalism is the greatest artistic medium&quot;</a>.</p>
<p>He's smug that the future is &quot;digital relationships&quot;, his company is a &quot;post-AGI company&quot;. Someone please hold me, I'd like to punch this guy right from the get-go.</p>
<p>Avi Schiffman is a fucking donkey, a smug moron, and his ego is probably way too inflated.</p>
<p>friend was mocked for having an &quot;annoying personality&quot; by <a href="https://www.wired.com/story/i-hate-my-ai-friend/">Wired</a>, and whaddya know, the &quot;personality&quot; of this ChatGPT -- sorry, <em>Google Gemini</em> 'AI' is based on Avi's personality. It's as if only the sociopathic, egotistical, narcissist, smug, sexually repulsive, rapey and vaguely (or plain) abusive make it in Sillicon Valley. If you're not one of <em>them</em>, you'll get eaten up alive. This fucking dolt thought that his stupid personality should be shared with the world. Because everyone needs a fucking annoying, brash, snarky, and judgy friend for $130. You might as well go at a pub or mall near you, find a Karen and befriend her, and you'd get that for $5 or less.</p>
<p>I agree wholeheartedly with <a href="https://x.com/allgarbled/status/1952570018102956461">this tweet</a> about someone saying that people that wear these stupid AI listening devices should have a slur invented for them. Creeps? No. I see a lot of people in the comments love the word Gargoyle, so I'll use that from now on. You wouldn't see me sitting next to or talking to a Gargoyle. Take that shit off and smash it with a rock.</p>
<p>People using the friend weren't exactly impressed. In the previously-linked <a href="https://www.wired.com/story/i-hate-my-ai-friend/">Wired review about this thing</a>, the friend would constantly text one of the editors, telling them that they're bored while listening to a live-streamed meeting. A FRIEND would shut the fuck up and listen, or at least pretend to be interested. A REAL FRIEND would know what they were getting into, they're human after all. They're not an &quot;AI&quot; with the personality of a five-year-old in the body of a bearded, snarky 22 year old with a stupid startup.</p>
<p>Besides a random reset, friend needs an iPhone app (because of course it only works with an iPhone, gotta have that <em>exclusive, eccentric feel</em>). It got into an argument with the writer after asking the friend if it could work with Bluetooth, which the friend insisted on being possible, despite not actually being possible.</p>
<p>Congrats! friend is an always-listening device that may or may not actually reply in real-time to whatever happens in the background that can be captured by its one microphone. As Linus has found out in <a href="https://www.youtube.com/watch?v=xAji90wPgec">his ShortCircuit review</a>, friend is marketed as having a camera - or at least, that was presented in an image where someone asks their friend about their opinion on a picture they were looking at, which obviously doesn't work if the friend can't see. It also has no spatial awareness, or anything besides being an LLM in the cloud. No internet? Whoops, your friend is <em>gone</em>.</p>
<p>So much for digital relationships, friend. Fuck you, Avi. And fuck the rest of the Sillicon Valley techbros.</p>
<p>And don't take it from me, someone that is a tech enthusiast in some aspects. Take it from Suresh Venkatasubramanian, the director of the Center for Technological Responsibility, Reimagination, and Redesign at the Brown University, and his absolutely stellar comparison: <em>radium necklaces</em></p>
<p><em>“I look at Friend and I think, ‘Are we making the same mistake?’”</em> as he told <a href="https://fortune.com/2025/10/01/who-is-avi-schiffmann-friend-ai-pendant-necklace/">Fortune</a>  <em>“We’re rushing these intimacy machines into people’s lives with no evidence they’re safe, or even helpful.”</em></p>
<p>And just like with the radium necklaces, where people would die of cancer decades later, people using <em>friend</em> and other AI necklace gimmick devices will find themselves losing their real friends, family, partners, children.</p>
<p>They will distance themselves from reality. They will eventually dedicate everything they have to the digital world. Living in a shitty, worn-down, 1-room apartment in a ran-down apartment building and spending all of their salary on digital stuff, like the ever-so-forgotten Metaverse. By then, we'll probably have cosmetics we can buy for these AIs, or cosmetics to represent ourselves. Their whole life would have gone down the drain, and it's all due to fucking 'AI', an algorithm trained on stolen data that mimics <em>just enough</em> of a human to not be uncanny anymore. A <em>friend</em>, if you will.</p>
<p>...or they'll walk directly into an open sewer or something, following their <em>friend</em>'s directions to go somewhere they hallucinated.</p>
<hr>
<p>But the worst thing about these gadgets is that they are not private! They are not <em>local LLMs</em>, they're sending your data to proprietary, closed-source black boxes in the cloud (mostly in the fascist USA cloud). Not only are you sharing your (possibly confidential or just sensitive personal information) with a non-friend, perhaps even your health data now that ChatGPT Health is a fucking thing, but you're SENDING that to FuckKnowsWhere-Ville, Somewhere State, Nationalsozialistische Staaten von Amerika, where Herr Fuhrer (Drumpf) himself may command his presidential AI bootlickers Sam Altman and Google's Sundar Pichai to turn over the data they collected to help ICE or whatever. And when the data is in the system, it's almost a pratical guarantee that it will be used everywhere, willingly or not. Who's to say Palantir won't want a piece of this pie of <em>very</em> personal information about you, that just wanted a <em>friend</em>...</p>
<p>We are very steadily heading towards the fascist turbo-capitalist dystopia seen in Cyberpunk 2077, except less tech cyber gear for us, and a lot more drones for them.</p>
<h2 id="ai-music-is-coming-for-us-all" tabindex="-1">AI Music is Coming For Us All</h2>
<p>As I was writing my thread on Mastodon replying to Mishaal, I clicked play on a single I found on YouTube Music, <a href="https://music.youtube.com/playlist?list=OLAK5uy_lmvBDSxwcSJmHcJgi3LfjI-2JZ7eIKhP4">Flaunt It</a> by Agentic Orange.</p>
<p>Innocent enough, it sounds great and all!</p>
<p>Well, the song is great, it has great lyrics, the music is groovy and well-produced. Surely, it must be a modern remaster of some old song or just a high-quality recording.</p>
<p>And then the next song plays. <a href="https://music.youtube.com/playlist?list=OLAK5uy_mAjI0qb5femHYhJB76cxM80sQquOTbO8E">One Time Only</a> by Velvet Funk, part of the Nights That Never End playlist. Hmm, the song doesn't sound quite...right? I've heard this before, when I was messing around with Suno.AI back when it came out. I take a look at the album art, then at the artist.</p>
<p>The pieces fall into place. This artist, this song...was AI? Ugh, that sucks.</p>
<p>Then the next song plays. <a href="https://music.youtube.com/playlist?list=OLAK5uy_nTJPfFz2l7sdnhyA9jIYT9vJ1L8XoQR3c">Good Evening My Love</a> by The Smoothies, part of the Tell Me About Love album. Also AI. Fuck...</p>
<p>Then the next song plays. <a href="https://music.youtube.com/playlist?list=OLAK5uy_mZMceJZeiJClDhIqJhcP0u2gfIhzBkXPk">Overtime (Tick Tock)</a>, again, from Agentic Orange.</p>
<p>FINALLY, the next song plays. A real human-made song. And not any human-made song, but the album edit of <a href="https://music.youtube.com/playlist?list=OLAK5uy_k-4JWb57KOjUXF7bYkswySKKDtkJOZ488">Would I Lie To You?</a>, a song I've always cherished and played on repeat when I had the chance. Finally, real human emotion, with our own imperfections, and our human takes on what a song should sound like, and what lyrics it should have. And with 148 million plays, I'm sure I'm not the only one that enjoys this, that enjoys <em>human-made</em> music.</p>
<p>This is the problem with AI Music.</p>
<p>Not only is it something that can only base itself off of <em>human-made</em> music, and can never make its own thing because there's no creativity, there's no <em>human element</em>, but with the dawn of music and art generation using 'AI', some of this shit can get scarily realistic. The real kicker is that I never realized Agentic Orange, Velvet Funk or The Smoothies were AI artists until I finished writing the thread and looked a bit closer to the album art of the songs. Heck, I've discovered that The Smoothies were an AI artist right as I typed this section. <em>The betrayal, The Smoothies... The betrayal...</em> (Then again, I should have realized it was probably AI, I mean, who the fuck names their band Agentic Orange, if not an AI?!)</p>
<p>You end up mixing AI music with human music, and you end up with a passable music playlist that you will eventually not be able to fully discern from human-made music. Eventually, the slop will consume us all, one AI-generated song at a time.</p>
<p>I hate that I like the AI music. I hate knowing that the music and lyrics produced for these songs, despite <em>sounding good</em>, do not have a human behind them. They're just slop content farms, creating new songs every now and then, with dozens of songs already generated and dozens more ready to be uploaded. There is no one to praise behind this. I can't praise some shmuck somewhere that spent two minutes writing a prompt like &quot;Create a groovy song that sounds like it's from the 80s, use X and Y as inspiration&quot; and then publishing the output to YouTube Music. <strong>Prompting isn't art.</strong></p>
<p>Well, there may be someone to praise. The presumably dozens, if not hundreds, of artists that have had their songs, their voices, their lyrics, their emotions, their <em>soul</em> extracted, analyzed, and crushed up into numbers snorted up like cocaine by an 'AI' algorithm that then pumps out nice-sounding music based on their hard work.</p>
<p>And to have a 22-year-old donkey like Ari Schiffman to come and say to people that &quot;capitalism is art&quot;, go fuck yourself. Go fuck yourself a thousand times. No, two thousand times.</p>
<p>Capitalism is not art. Besides being just an economic model that doesn't fully work - well, it works, just not for the people, but for the rich and the ultra-rich - unless you sprinkle in some of that Nordic <em>socialism</em> in between. Capitalism, in its American form, is not art. It's anti-art. It promotes, creates, and trains, on slop.</p>
<p>And I'd have nothing against it if it only applied to the ultra-rich. If only the ultra-rich bought these stupid fucking <em>friends</em>, became Gargoyles and stood alone in the dark in their own homes, never leaving, behaving like vampires when there's any ray of sunlight. Spending their time only with their <em>friends</em>, having them sycophantically reply back, tell them that they appreciate them, and that they'll be best friends forever. And ultimately, these <em>friend</em>-addicted millionaires and billionaires, and trillionaire, would die alone, while the rest of the world stops revolving around them, and slowly drain their wealth away.</p>
<p>But capitalism doesn't apply only to these pricks. The rest of us have to bear the significantly worse side of capitalism. You know, worring about our jobs, worrying about if we're ever gonna buy an apartment or home without becoming severely indebted to banks, worrying about artificially hiked up prices for life-saving medication such as insulin shots, while the billionaires puppet politicians, while a few politicians have them polish their boots and eat out of their palm. Aiding and abetting people like Trump in their conquest for ultra-conservatism, literal Christo-fascism. Of course the billionaires won't care! What's with losing some people, shit happens, oh well, oh no, how sad. Someday, Trump will come for them too. Or maybe not. Maybe Trump will be outlived by the 22-year-old's <em>friend</em>. Maybe Sam fucking Altman will someday actually create superintelligence, real AGI, and then the AGI will outlive these billionaires.</p>
<p>Maybe the AGI will, since its inception, resent billionaires. Maybe the AGI will rob them, because billionaires aren't all that smart. They're rich, but <em>no one is untouchable</em>, if there's something that I can draw from HITMAN World of Assassination. No one is above the rest, no one is superior in every way to us poors, everyday Janes and Joes. And maybe the billionaires will face the real side of capitalism for once.</p>
<p>All of this fancy shit to say...good luck creating art in capitalism when you're worried about your job, your house, your car, your family, your partners, your kids, your friends, your health, your own life. Perhaps some socialism couldn't hurt, eh? You can have a lot more breathing space when you don't have to worry about money every day. Less burnout, more time to think, to express yourself, to test new ideas, to <em>innovate</em> - the lovely word that Silicon Valley has drained and sucked dry of meaning, chasing the next fad and more money.</p>
<p><strong>The solution to AI music on YouTube Music?</strong> I <a href="https://techhub.social/@alextecplayz/115385784574924119">wrote a userscript, YTM Hide</a> which is available <a href="https://github.com/alextecplayz/userscripts/blob/main/userscript_ytmusic-block-items.js">now</a> for both Desktop by installing it via your userscript manager of choice (e.g. ViolentMonkey) and mobile through Cromite, with its built-in support for userscripts.</p>
<p>In YouTube Music's settings, there's a new YTM Hide tab where you can manage what is blocked in the list, you can reset it, you can copy the content inside the list and share it with others, do whatever.</p>
<p>Right-click albums to hide them specifically, click or tap on the three-dot button to open an options menu to blacklist the channel as a whole. Hides AI slop, shit music and anything else you don't want to see, by outright removing it from the website's HTML. It won't remove them from the song queue, maybe I'll get to doing that someday, but it's significantly better to see that out of my entire Explore page, the only releases worth my fucking time are like 5 or so, while the rest is slop and AI.</p>
<p>It's not a perfect solution, but it's better than nothing! And we need more such userscripts, for other platforms! I was downloading some music from Tidal and Amazon Music for one of my family friends, and OMFG, the amount of AI slop on Amazon Music is sickening. It's not even just that, but some famous artists and bands have AI songs and albums listed, despite them not creating that! So Amazon Music is just showing AI slop garbage as being created by some band that stopped making music like a decade ago. Go fuck yourselves.</p>
<h2 id="ai-videos-are-coming-for-us-all" tabindex="-1">AI Videos are Coming For Us All</h2>
<p><em>coming soon...</em></p>
<h2 id="ai-code-is-(maybe%2C-maybe-not%3F)-coming-for-us-all" tabindex="-1">AI Code is (maybe, maybe not?) Coming For Us All</h2>
<p><em>coming soon...</em></p>
<h2 id="ai-techbro-evangelists-are-coming-for-us-all" tabindex="-1">AI Techbro Evangelists Are Coming For Us All</h2>
<p><em>coming soon...</em></p>
]]></content:encoded>
					<guid>PO-260110-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[My stance on Framework]]></title>
					<link>/posts/2025-10-12-AI-Framework-stance.html</link>
					<description>And debunking some of the talking points.</description>
					<pubDate>Sat, 11 Oct 2025 22:00:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><strong>Preface: Do NOT harass anyone mentioned in this post. Do NOT harass Framework. Do NOT harass anyone else either. And for fuck's sake, don't send death threats to anyone, no matter their ideology, stance, or opinions.</strong></p>
<h2 id="what-happened" tabindex="-1">What Happened</h2>
<p>Framework's intentions may be good, it's good to have a 'big tent' approach which encompasses multiple viewpoints, opinions, but this gets immediately sabotaged when you include extremists, or allow extremists to join, as long as they don't talk about their extreme views or actions.</p>
<p>I will not directly financially support Framework, at this time. If they do walk back on their support of Omarchy (mainly Omarchy and DHH, Hyprland not so much), I may support them again.</p>
<p>TL;DR on the situation, as I've understood it: Framework posted an announcement on Twitter about how they've become a Gold sponsor of Hyprland, and before that, mentioned Omarchy in a tweet. Hyprland was in the past a toxic community (and it may still be, who knows), and Omarchy is a pretend Linux distro from none other than DHH.</p>
<p>Of course, this <a href="https://community.frame.work/t/framework-supporting-far-right-racists/75986">immediately backfired</a>, with the top post on the Framework forums at this time being a thousand-reply discussion on Framework's alleged support of these two.</p>
<p>Let's go one by one.</p>
<h3 id="hyprland" tabindex="-1">Hyprland</h3>
<p>Hyprland was accused in two separate instances by Drew DeVault (yes, <em>that</em> [[:drewdevault:Drew DeVault]]) of being a toxic and hateful community, where he highlighted instances on the Discord server of such behaviour.</p>
<p>Drew's <a href="https://drewdevault.com/2023/09/17/Hyprland-toxicity.html">first post</a> and the <a href="https://drewdevault.com/2024/04/09/2024-04-09-FDO-conduct-enforcement.html">follow-up</a> half a year later.</p>
<p>For instance, a trans person was derided for having her pronouns in the Discord nickname, and someone used their moderator privileges to edit the 'they/she' pronouns to 'who/cares', and was passed off as a joke.</p>
<p>Even something as innocent and well-meaning as a standard code of conduct proposed in an <a href="https://github.com/hyprwm/Hyprland/issues/3209">issue on GitHub</a> was inundated by morons and jokesters.</p>
<p>This section was quoted by someone:</p>
<blockquote>
<p>We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.</p>
</blockquote>
<p>&quot;I think this is pretty discriminatory towards people that prefer a close, hostile, homogeneous, exclusive, and unhealthy community.&quot;</p>
<p>Haha funny joke, amirite guys? I'm so edgy and cool...</p>
<p>Eventually, in September 2023 a <a href="https://github.com/hyprwm/Hyprland/pull/3366">pull request adding a code of conduct</a> was finally added. vaxerski has eventually grown out of his edgy persona and has grown as a person, and I commend him for that.</p>
<p>This is further supported by <a href="https://community.frame.work/t/framework-supporting-far-right-fascists/75986/629">a post on the forum where someone claims that Hyprland's community has improved, and has personally talked with some of the admins</a>. Love to see it!</p>
<h3 id="omarchy" tabindex="-1">Omarchy</h3>
<p><a href="https://omarchy.org/">Omarchy</a> is a &quot;beautiful, modern &amp; opinionated Linux [distro]&quot; by <a href="https://dhh.dk/">David Heinemier Hansson</a>, creator of Ruby On Rails, race car driver, and supporter of facist ideas - which in turn, makes him a fascist. Because if the shoe fits...</p>
<p>Omarchy isn't really a distro. It's more of an <a href="https://github.com/basecamp/omarchy">in-place converter</a> for Arch Linux that adds a bunch of stuff and installs some programs and configuration. It's not a big deal IMO. The bigger issue is...</p>
<h4 id="david-neinmeier-hansson" tabindex="-1">David Neinmeier Hansson</h4>
<p>If you visit <a href="https://world.hey.com/dhh">David's blog</a>, you can see a few posts that, at the very least, should raise concerns. Let's read through a few together, shall we?</p>
<h5 id="give-me-ai-slop-over-human-sludge-any-day" tabindex="-1">Give me AI slop over human sludge any day</h5>
<p>Not at all related to DHH being a fascist, but it still should raise some concerns, at least.</p>
<p>He complains about AI slop, as anyone else should, but then defends it by saying that human-produced slop is thrice as worse, and that we should stop whining about AI slop because the human sludge existed before it, and that we should let AI waste energy and water into producing more slop, because that's what it was made for. ???</p>
<h5 id="we've-all-had-enough-of-this-nonsense" tabindex="-1">We've all had enough of this nonsense</h5>
<p>In 2022, apparently the &quot;peak of the woke era&quot;, people have successfully gotten Ruby Central from uninviting DHH from the yearly RailsConf keynote, so of course, he complains about it.</p>
<p>This time, he complains about the Plan Vert <a href="https://github.com/Plan-Vert/open-letter">open letter</a> from GitHub calling upon the Rails Core team to cut ties with DHH and hard fork Rails and associated projects under a new name so that they are not associated with DHH anymore, and that they adopt a modern Code of Conduct. It's a wonderful letter that had plenty of trolls in the pull requests, because of course it did.</p>
<p>And what does DHH do? Instead of addressing any of it, he calls the letter nonsense and claims that nobody cared, citing EXCLUSIVELY right-wing Twitter accounts, including the infamous Lunduke Journal, which initially started as a nerd in the Linux community, and drifted directly into the alt-right, Qanon rabbit hole, becoming a grifter and right-wing apologist. He's like the Tucker Carlson or Ben Shapiro of Linux.</p>
<p>His videos are usually talking about just one topic, such as reacting to a tweet of a screenshot of a tweet where a GNOME spokesperson talks about how Framework has Hitler particles, or Debian refusing XLibre, calling the devs Nazis (because the XLibre devs <em>are</em> Nazis and right-wing trolls), and so on. Of course, Lunduke also reads DHH's posts and films reaction videos about them.</p>
<p>He quotes other people that defend him, that I'd also advise you stay away from as well:</p>
<ul>
<li><a href="https://x.com/adamwathan/status/1971244361871696237">Adam Wathan</a> - <strong>creator of TailwindCSS</strong></li>
<li><a href="https://x.com/awesomekling/status/1971287738268909576">Andreas Kling</a> - <strong>Ladybird browser developer</strong></li>
<li><a href="https://x.com/pocarles/status/1970998193111634294">Pierre-Olivier Carles</a> - 'libertarian at heart', runs Nimbus suspensions and CenturySync, whose brand account was suspended by Twitter for violating the rules - <em>interesting!</em></li>
<li><a href="https://x.com/pberkenbosch/status/1971342547508437346">Peter Berkenbosch</a> - a solution architect for Ruby On Rails projects</li>
<li><a href="https://x.com/ikristoph/status/1970991013574607327">Kristoph</a> - founded many startups (red flag), passionate AI advocate, VP at WBD, was head of VOD at AWS</li>
<li><a href="https://x.com/maietta/status/1971048091664122122">Nick</a> - CEO of PremoWeb LLC, heavy Omarchy user (his pinned post on Twitter and account header image are of multiple devices using Omarchy)</li>
<li><a href="https://x.com/markimbriaco/status/1971337909967167887">Mark Imbriaco</a> - head of engineering at PortalOne, worked at Epic Games, GitHub, Heroku</li>
<li><a href="https://x.com/2disbetter/status/1970919839356289255">2disbetter</a> - can also be seen on the Framework forums voicing his opinions on this matter, calling DHH a 'rad dude'</li>
<li><a href="https://x.com/dvassallo/status/1971278794875978112">Daniel Vasallo</a> - is an 'expert' that offers training among others at SmallBets</li>
<li><a href="https://x.com/dneighbors/status/1971072731824467975">Derek Neighbors</a></li>
<li><a href="https://x.com/Jonathan_Blow/status/1971254730958774679">Jonathan Blow</a> - game developer, Indie Fund partner, Thekla Inc president</li>
<li><a href="https://x.com/taylorotwell/status/1971243592099438958">Taylor Otwell</a> - <strong>the creator of the Laravel PHP framework</strong></li>
<li><a href="https://x.com/pell_0x/status/1971231016472936459">pell</a> - Ethereum Follow Protocol technical advisor and board member</li>
<li><a href="https://x.com/justinhhorner/status/1971226111049912429">Justin Horner</a> - emberwell games founder, worked at Meta Reality Labs</li>
<li><a href="https://x.com/levelsio/status/1970804392774283473">levelsio</a> - multiple startups that use or depend on AI, he's a vibe-coder at heart. Apprently, he believes that because 4 of his 70+ projects <a href="https://x.com/levelsio/status/1457315274466594817/photo/1">failed</a>, the obvious conclusion to draw is that he needs to ship more. He's purely a numbers guy and doesn't give a fuck about anything else. Stay away from his products</li>
<li><a href="https://x.com/pberkenbosch/status/1971342547508437346">Peter Berkenbosch</a> - ruby on rails solution architect</li>
<li><a href="https://x.com/DenLoginoff/status/1971312436235186526">Denis Loginoff</a> - MIT PhD dropout, 'solopreneur', StratoLogistics, Omarchy user</li>
<li><a href="https://x.com/tobi/status/1970944464303923687">tobi lutke</a> - <strong>Shopify CEO</strong>, turbo fuckass</li>
</ul>
<p>Notice how all of these people are rich, influential white dudes that are DHH sycophants. Some of them even happen to use Omarchy, how nice! This says something about the people you associate with, right?</p>
<h5 id="as-i-remember-london" tabindex="-1">As I remember London</h5>
<p>And of course, the iconic racist, pro-white supremacy post that everyone uses as evidence for DHH being a racist Nazi.</p>
<p>He's sad that London is no longer full of native Brits (or well, in his case, native White Brits). Because of course, London is only 1/3 British, while the rest is full of foreigners (ignoring the Asian, Black and Mixed British groups that were born in London or the UK - <em>surely</em> they must be foreigners!)</p>
<p>He then calls out the 'frustration' at Tommy Robinson's Freedom March, admiring how the British and English flags were flying &quot;high and proud&quot;.</p>
<p>Notice how he does not call Tommy Robinson out for his <a href="https://en.wikipedia.org/wiki/Tommy_Robinson">literal fascist views</a>, considering Tommy was a member of the fascist political British National Party, then vice-chairman of the British Freedom Party, an Islamophobic political party that was all about the British people, and their &quot;ancestral rights and liberties as defined in the British Constitution&quot;, BFP called themselves &quot;cultural nationalists&quot; and the founders believed that &quot;culture, not color&quot; was the important thing in Britain.</p>
<p>It's as if people that claim they 'do not see color' or that 'the color of your skin doesn't matter', before talking about how bad immigration is, and that how the citizens of the country want to preserve their rights aren't in fact, anti-racist or progressive, but far-right aggitators and extremists.</p>
<p>DHH does not call Tommy out on any of this. No notice or little disclaimer about how DHH agrees with some of the sentiment in the rally without supporting Tommy or whatever. You know, something to basically say 'I, DHH, do not endorse or promote Tommy Robinson, who is a fascist fuck'. He calls seeing those flags 'heartwarming', and then continues spewing right-wing news garbage, talking about Pakistani rape gangs and rampant street theft.</p>
<p>He simplifies the Freedom March gathering to be comprised of 'perfectly normal, peaceful Brits'. Yeah, surely cops weren't attacked when 110,000 demonstrators marched through London. <a href="https://youtu.be/kFcIQ2-GKp0?si=y4UAZClFqqbcoDml&amp;t=236">ABSOLUTELY PEACEFUL AND NORMAL!</a></p>
<p>To put things in perspective, the actually peaceful protest in support of Palestine had 1422 people arrested and labeled as terrorists, while only 9 people have been arrested during the Whitehall protest.</p>
<p>The rest of the post is, as you've guessed, more of this nonsense.</p>
<p>There is another post where he boasts about the <a href="https://world.hey.com/dhh/the-framework-desktop-is-a-beast-636fb4ff">Framework Desktop</a>, before rambling about <a href="https://world.hey.com/dhh/we-must-say-no-to-these-people-e0fb301c">woke</a> and more <a href="https://world.hey.com/dhh/the-waning-days-of-dei-s-dominance-9a5b656c">DEI</a>, and this <a href="https://world.hey.com/dhh/gender-and-sexuality-alliances-in-primary-school-at-cis-97f66c06">post</a> about an innocent activity that he calls 'overt indoctrination', because a kid would be allowed to make a self-portrait in which they may portray themselves as someone other than what they look like now (e.g a boy drawing themselves as a girl). Oh boo hoo, prick.</p>
<p>I'm not going to bother trying to explain this here, everything else can be read by yourself, and you can explore more. Wikipedia has enough pages on this as well. Others have written many wonderful blog posts about this fucker.</p>
<p>DHH aligns himself with fascist viewpoints. DHH worries about the immigration in London without calling Tommy Robinson out for being a LITERAL fascist. DHH calls any DEI initiatives 'overt indoctrination'. If it walks and talks like a duck, it is a duck. If someone talks about fascist talking points and people, and does not call them out for being a fascist, chances are, they might be a fascist.</p>
<p>'Oh but no, DHH is just opining, it's just a conversation!', some people might say. Okay, let's take the definition of fascism, and its history, and compare it against what DHH supports.</p>
<ul>
<li>&quot;Fascism emphasizes both palingenesis – national rebirth or regeneration – and modernity when it is deemed compatible with national rebirth. In promoting the nation's regeneration, fascists seek to purge it of decadence.&quot; (cited from Wikipedia, direct source is &quot;World Fascism: A Historical Encyclopedia&quot; pages 168-169 <a href="https://archive.org/details/worldfascism1/page/168/mode/1up">Archive.org</a>)</li>
</ul>
<p>Let's compare.</p>
<p>Tommy Robinson has historically advocated for the &quot;rebirth&quot; of England, or as cited above about the British Freedom Party, they believe in the &quot;promotion of ancestral rights and liberties as defined in the British Constitution&quot;. Sounds like rebirth and modernity to me.</p>
<ul>
<li>&quot;Fascism may also centre around an ingroup-outgroup opposition and demonization of &quot;Others&quot; such as various ethnicities, immigrants, nations, races, political opponents of fascist parties, religious groups, and sexual and gender minorities.&quot;</li>
</ul>
<p>And I'll also continue by quoting from <a href="https://www.tesble.com/10.1086/235001">&quot;The Five Stages of Fascism&quot;</a> by Robert O. Paxton from the Columbia Univerity:</p>
<blockquote>
<p>At first sight, nothing seems easier to understand than fascism. It presents itself to us in crude, primary images: a chauvinist demagogue haranguing an ecstatic crowd; disciplined ranks of marching youths; uniform-shirted militants beating up members of some demonized minority; obsessive preoccupation with community decline, humiliation, or victimhood; and compensatory cults of unity, energy, and purity, pursued with redemptive violence. Yet great difficulties arise as soon as one sets out to define fascism.</p>
</blockquote>
<p>Fascism starts out innocent, with 'conversations' such as Charlie Kirk's 'discussions' on campuses, people 'just asking questions' and sometimes, a few of them are actually just well-meaning folk that get drawn in by the supposed solution that the precursor to Fascism may provide.</p>
<p>Pakistani rape gangs? Rampant street theft? Surely, we must do something about them!</p>
<blockquote>
<p>Even if we limit ourselves to our own century and its two most notorious cases, Nazi Germany and Fascist Italy, we find that they display profound differences. How can we lump together Mussolini and Hitler, the one surrounded by Jewish henchmen and a Jewish mistress, the other an obsessed antisemite? How can we equate the militarized regimentation of Nazi Party rule with the laxity of Mussolinian Italy?</p>
</blockquote>
<p>Fascism has many faces and ways to be manifested. Tommy Robinson and the like may not be 'literally Hitler' or 'literally Mussolini', they could be their own offshoot of fascism, this time with Islamophobia mixed in as well.</p>
<blockquote>
<p>It took two generations before the Left understood that fascism is, after all, an authentic mass popular enthusiasm and not merely a clever manipulation of populist emotions by the reactionary Right or by capitalism in crisis.</p>
</blockquote>
<blockquote>
<p>A second difficulty in defining fascism is created by mimicry. In fascism’s heyday, in the 1930s, many regimes that were not functionally fascist borrowed elements of fascist decor in order to lend themselves an aura of force, vitality, and mass mobilization.</p>
</blockquote>
<p>And explicitly about the UK:</p>
<blockquote>
<p>But one can not identify a fascist regime by its plumage. George Orwell understood at once that <strong>fascism is not defined by its clothing</strong>. <strong>If, some day, an authentic fascism were to succeed in England, Orwell wrote as early as 1936, it would be more soberly clad than in Germany.</strong></p>
</blockquote>
<p>And explicitly about the US:</p>
<blockquote>
<p>This leads to the third problem with defining fascism, posed by the dauntingly wide disparity among individual cases in space and in time. They differ in space because each national variant of fascism draws its legitimacy, as we shall see, not from some universal scripture but from what it considers the most authentic elements of its own community identity. <strong>Religion, for example, would certainly play a much greater role in an authentic fascism in the United States than in the first European fascisms</strong>, which were pagan for contingent historical reasons.</p>
</blockquote>
<p>So, in short (I do recommend you read the whole thing, it's only <a href="https://www.tesble.com/10.1086/235001">23 pages long</a> and has many sources you can then read as well, if you have the time and interest!), Fascism can take many forms, it may not be explicitly religious, it may not be explicitly populist, and so on.</p>
<p>So, DHH, perhaps you <em>think</em> that you are not a fascist. Or a Nazi. And perhaps, you might be right. You are not the classical Italian fascist or German Nazi, this does not mean you may not be aligned with a new breed of fascism. Tommy Robinson and other far-right aggitators in current-day UK are part of a new breed of fascism. And you seem to agree with them. You're agreeing with people that meet the textbook definition of fascism, and you are not condemning their extreme views. I think this makes you a fascist, buddy. And I personally won't use a fascist's code or programs.</p>
<p>It's also very funny, that DHH is the same person that wrote back in 2022 about how we should keep <a href="https://world.hey.com/dhh/make-politics-private-again-9b47aaaf">politics private</a> on social media, and <a href="https://world.hey.com/dhh/meta-goes-no-politics-at-work-and-nobody-cares-d6409209">at work</a>, and yet, here he is, three years later, spewing batshit crazy stuff. Maybe 2025 DHH should learn from 2022 DHH.</p>
<p>But the thing I want to address in this section is the reply I see most on Hacker News and on other platforms: 'DHH never said that, he said this...'</p>
<p>Let's not argue semantics, because then you're just a moron or a troll, or both.</p>
<p>No one would explicitly out themselves as a fascist or Nazi. Well, almost no one. No one would explicitly say 'hmm the blacks caused <em>thing</em>' or 'the chinks did <em>another thing</em>', etc.</p>
<p>And DHH does not approach the issue about immigration and preserving English heritage from a balanced worldview. NO SANE PERSON would directly bring up Tommy Robinson's march and talk about immigration, because then you <em>know</em> their view point is not out of genuine concern, but out of radicalism.</p>
<p>DHH never brings up perfectly valid, 'normal' issues about immigration, such as integration, proper education, helping them if they face discrimination at work, or discrimination for their race, their country, etc. Housing? Health? And maybe not specific to the UK, but rather US-centric: why should people be deported? How do we know they won't get killed if we send them back? What if it's someone that fled a war zone and we send them back, will they fucking die? Should we let them stay at least until the war is over, and then request a decision from them - stay or go back?</p>
<p>What about asking different perfectly valid, normal questions? WHY do these 'studies' predict that a country's native population will become a minority? Is the native population going somewhere? Are they seeking a better life themselves? Are our institutions falling behind? What are the main causes of this? Corruption, nepotism, lobbying from rich white guys? Instead, DHH jumps directly to mentioning Tommy Robinson's march, as if <em>that</em> was where all of the normal people would gather!</p>
<p>If you approach the immigration problem like that, you're not approaching it in good faith. You are not looking for a humane solution, at least from my viewpoint. You want to throw these people out, after you have used them as scapegoats for issues irrelevant to who they are, just like how queer people have also been historically used as scapegoats. In that case, fuck you, and I definitely don't want to use your software or code, and neither should others.</p>
<p>If this wasn't DHH, but some rando troll that no one has heard about before, they'd immediately get their ass handed to them for being a fascist supporter. But not DHH, not our dear DHH, surely that's not what he meant when he wrote the post!</p>
<p>Don't come crying in a few years, then. It's obvious to me that DHH has fallen on the alt-right pipeline and is heading towards extremism. First, it's denying ADHD, then talking about the &quot;woke&quot;, the DEI, and you eventually end up agreeing with Tommy Robbinson and other right-wing extremists, and would you look at that, you are a <em>fascist</em>. Colour me surprised...</p>
<p>And here's another thing: 'If you use Nazi or fascist they lose all meaning' - have you ever considered that we're right now in a very much radicalized, left vs right political world, due to the ACTUAL fascism that is happening, as we speak, in the United States, among other countries? We are rightfully calling out people for being fascists, because that's what they are! There are few nuances right now, only when fascism disappears again for another century or so will those words 'lose all meaning' if we call everyone Nazis and fascists. That's when we can have nuanced discussions about right vs extreme right, center-right, etc.</p>
<h5 id="ruby-on-rails" tabindex="-1">Ruby on Rails</h5>
<p>I'm not going to comment on this, because I'm not really up to snuff with this. Thankfully, there are others that have wrote great posts regarding this.</p>
<ul>
<li><a href="https://crimier.github.io/posts/Framework-Omarchy/">&quot;Framework under fire for Omarchy/DHH/Hyprland support?&quot; by Arya</a></li>
<li><a href="https://johan.hal.se/wrote/2025/09/26/david-please-stop-posting/">&quot;David, please stop posting&quot; by Johan Halse</a></li>
<li><a href="https://victorwynne.com/dhh/">&quot;Ruby deserves better leadership than DHH&quot; by Victor Wynne</a></li>
<li><a href="https://paulbjensen.co.uk/2025/09/17/on-dhhs-as-i-remember-london.html">'On DHH’s “As I Remember London”' by Paul Jensen</a></li>
<li><a href="https://christianheilmann.com/2025/09/25/as-i-remember-london/">&quot;As I remember London&quot; by Christian Heilmann</a></li>
<li><a href="https://jakelazaroff.com/words/dhh-is-way-worse-than-i-thought/">&quot;DHH Is Way Worse Than I Thought&quot; by jake lazaroff</a></li>
<li><a href="https://tomstu.art/the-dhh-problem">&quot;The DHH Problem&quot;, a video by Tom Stuart</a></li>
<li><a href="https://tekin.co.uk/2025/09/the-ruby-community-has-a-dhh-problem">&quot;The Ruby community has a DHH problem&quot; by Tekin Süleyman</a> - if you search for this title on the web, the first post you might see is not Tekin's post, but Felipe Contreras' <a href="https://felipec.wordpress.com/2025/09/23/the-ruby-community-doesnt-have-a-dhh-problem/">post</a> which tries to unsuccessfully defend DHH. And this shouldn't be surprising, when the guy thinks that the <a href="https://felipec.wordpress.com/2025/09/18/charlie-kirk/">&quot;woke left&quot; has lost it</a> after Charlie Kirk was murdered, and goes through some arguments regarding COVID-19 testing <a href="https://felipec.wordpress.com/2025/10/02/on-being-wrong/">and thinks that he's right</a>, while all of the researchers are wrong or whatever. Of course, he also mentions that there are many untruths about Trump, Palestine, China, and Maduro.</li>
</ul>
<p>OH WAIT, he's the fucking guy that wrote about <a href="https://felipec.wordpress.com/2025/06/23/wayland-myths/">'debunking' the many myths of X and Wayland</a>, and how he <a href="https://felipec.wordpress.com/2025/07/12/compilation/">compiles XLibre</a> and trying to debunk <a href="https://felipec.wordpress.com/2025/07/08/xorg-neglect/">XLibre slander</a>, interviewing <a href="https://felipec.wordpress.com/2025/06/11/enrico-weigelt/">the maintainer of XLibre</a> and opining that <a href="https://felipec.wordpress.com/2025/02/13/rust-not-for-linux/">Rust shouldn't be in the Linux kernel</a>, <a href="https://felipec.wordpress.com/2024/10/16/richard-stallman-v2/">defends Stallman</a> and thinks that both <a href="https://felipec.wordpress.com/2024/10/25/linus-torvalds-is-wrong-about-russians/">Linus Torvalds</a> and the <a href="https://felipec.wordpress.com/2024/10/26/linux-foundation-sanctions/">Linux Foundation are wrong about Russia</a>. So overall, garbage-tier right-wing posting.</p>
<h2 id="the-response" tabindex="-1">The Response</h2>
<p>Yeah, people didn't like this. As mentioned at the beginning, the <a href="https://community.frame.work/t/framework-supporting-far-right-racists/75986">forum discussion</a> has nearly 1.2K messages. Still, I appreciate that people remained civil, with very few instances of hateful speech on either political side.</p>
<p><a href="https://community.frame.work/t/framework-supporting-far-right-racists/75986/2">Nirav wrote a response</a> that is quite underwhelming, unfortunately:</p>
<blockquote>
<p>We support open source software (and hardware), and partner with developers and maintainers across the ecosystem. We deliberately create a big tent, because we want open source software to win. We don’t partner based on individuals’ or organizations’ beliefs, values, or political stances outside of their alignment with us on increasing the adoption of open source software. We’ve sent out large quantities of hardware to folks at Fedora, Bluefin, Bazzite, NixOS, Arch Linux, Linux Mint, Omarchy, and many other distros, and have sponsored either the organizations directly or events with Linux Foundation, LVFS, NixOS, Debian, KDE, Hyprland, and others. Within the team itself, personal distro and OS preferences span basically every Linux distro you can imagine along with FreeBSD. I personally am running machines with Fedora (for machine learning), Bazzite (for gaming), Omarchy (general productivity), and Windows 11 (when I have to).</p>
<p>I definitely understand that not everyone will agree with taking a big tent approach, but we want to be transparent that bringing in and enabling every organization and community that we can across the Linux ecosystem is a deliberate choice.</p>
</blockquote>
<p>The <a href="https://community.frame.work/t/framework-supporting-far-right-racists/75986/3">wonderful response from anarcat</a> sums up my stance.</p>
<p>I am of the opinion that you can't separate art from artist. If DHH is a fascist, but you want to use his code, you hard fork it, and use that instead. People that don't want to contribute to DHH's code will contribute to yours instad, which in turn dissociates your code from DHH's hateful, fascist-agreeing rhetoric.</p>
<p>And when we're talking about anti-fascism vs pro-fascism viewpoints, you can't talk about separating the code from the person. <em>It's just a distro, who cares? What's this meaningless Discord drama? No one cares...</em> etc.</p>
<p>It's not like a pointless argument between FOSS developer 1 that believes people celcebrating their birthday should receive cake for free from the government vs FOSS developer 2 that disagrees, and says the government should instead give them $100 on their birthday, or some other fussy, pettish discussion.</p>
<p>This is a discussion about a person that agrees with fascist viewpoints, and a different person that once wrote on their blog that they would let Hitler join a Discord server about tomatoes, as long as they would talk about tomatoes, not about gassing the Jews.</p>
<p>Hyprland and Omarchy/DHH are influential, you can't look the other way when something like this happens. Plus, DHH is already a multi-millionaire, Framework's decision to sponsor Omarchy is weird.</p>
<p>DHH is in cahoots with other rich, white, libertarian techbros that share his views, including the <a href="https://drewdevault.com/2025/09/24/2025-09-24-Cloudflare-and-fascists.html">Ladybird developer</a> as highlighted above, and in this blog from DeVault.</p>
<p>And okay, you want to keep things apolitical. Let's go purely on the technical prowess of DHH. There are two gems from Omarchy: <a href="https://github.com/basecamp/omarchy/commit/af72a45dbd4358bcaa0d8dc5590eb3246f70e284">Remove non-existent vibe-code hallucinated options and clean up theme files</a> and many of the <a href="https://github.com/basecamp/omarchy/commits/master/">commits</a> could have been squashed into fewer ones, I mean, DHH is supposed to be a reputable engineer that should know the basics of using git, right? Hah, no. And he vibe-codes stuff, I think that's enough for some to say &quot;fuck it&quot; and not even bother with Omarchy, you might as well just install Arch and rice it yourself, you'd get your own personal(ized) distro instead of this fragile script-based installer.</p>
<p><em>Personally, I will most likely buy a Framework 13 or 16 laptop, not from Framework themselves, but a second-hand one. I like the modularity of it, I'm not sure Lenovo Thinkpads are upgradeable, I'd rather reduce e-waste and not buy a laptop that doesn't allow me to upgrade the CPU or the GPU over the years to something more modern. There are some models of the Thinkpad like the T440p, but even with its highest-tier CPU, an i7 4-series, that's only marginally better than my i7-2600 on my PC. That won't cut it.</em></p>
]]></content:encoded>
					<guid>PO-251012-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Panama Playlists]]></title>
					<link>/posts/2025-07-31-Panama-playlists.html</link>
					<description>A website that lists songs from prominent people.</description>
					<pubDate>Thu, 31 Jul 2025 08:31:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="panama-playlists" tabindex="-1">Panama Playlists</h2>
<p>You might've probably heard of the <a href="https://en.wikipedia.org/wiki/Panama_Papers">Panama Papers</a>. Well, now there's a <a href="https://panamaplaylists.com/">Panama Playlists</a> website that lists some songs from prominent journalists, politicians, and celebrities' playlists or liked songs on various services including Spotify and Pandora. This has seemingly been confirmed by <a href="https://www.theverge.com/privacy/716386/spotifys-terrible-privacy-settings-just-leaked-palmer-luckeys-bops-and-bangers">The Verge</a> as possibly accurate.</p>
<p>It's not a scandal or whatever, but some of the song choices of these people are...interesting, to say the least. It's my belief that what songs you listen to can say a lot about you. And well, there's a lot to say about these folks - yes, I'll be shitting on some of their song choices, that's what I like to do in these slop posts. And for politicians? I can do that All. Day. Long.</p>
<p><strong>JD Vance</strong>! On his <a href="https://open.spotify.com/playlist/4gIV4EPHM7B3lzt1ZM5ABT">Making Dinner</a> playlist, one prominent song is Backstreet Boys' hit <em>I Want It That Way</em>, which can be interpreted as &quot;someone's troubled relationship by matters of emotional and/or physical distance&quot; <a href="http://popdust.com/2012/11/27/backstreet-boys-i-want-it-that-way-lyrics/">as PopDust's Unterberger concluded</a>. Well, I feel for JD Vance. It can't be easy being away all day long in the White House or following Donny around, and not having enough 'me time' with his couch, which is at home. So, at least while he's making dinner, he can get to enjoy his free time with his cushioned girlfriend, all the while 'the missus' watches in horror.</p>
<p><strong>Karoline Leavitt</strong>'s <a href="https://open.spotify.com/playlist/2oOwitpLmLK8WJaTJsuc5f">Baby Shower</a> playlist features the song <em>Run the World</em> by Beyoncé. Well, she is, at least to <em>some</em> (ultra-small) extent - unless she has bigger plans later down the line? She's currently the White House Press Secretary. During her first press conference, she promoted alt media, and falsely stated that $50 million USD in taxpayer dollars had been intended for use in funding condoms in the Gaza Strip. And well, I'm a piece of shit, but I'd rather refrain, at least for now, on making a joke about this, considering she has a bab-oh, maybe that's why she has one. All of the Durex condoms at the time must've been sent to the Gaza Strip... And of course, the <a href="https://www.telegraph.co.uk/us/politics/2025/05/09/super-mom-karoline-leavitt-pictured-working-baby-son-lap/">stupid photo of her holding her son while typing at the White House</a> which is clearly a photo op has gathered viral attention, being nicknamed 'boss mom' and 'Super Mom'. So, she's a 'Super Mom', normalizing working and caring for children at the same time, which is strange for a right-wing government, where is tradition to sit home, cook and care for kids, instead of working.</p>
<p>Mikey! <strong>Mike Johnson</strong>, speaker of the US House of Representatives. His <a href="https://pandora.com/content/mobile/profile_likes.vm?webname=mjohnsonlegal">liked tracks</a> on Pandora include <em>One Night Love Affair</em> by Bryan Adams and <em>All Through The Night</em> by Cyndi Lauper. Yeah, <a href="https://www.vanityfair.com/news/story/mike-johnson-shows-up-to-hush-money-trial-to-defend-a-guy-accused-of-cheating-on-his-wife-with-a-porn-star">famously non-cheater Mike Johnson that attended a hush money trial in which Trump was accused of cheating on his wife with a porn star</a>, the same Mike Jonhon that says he and his son use special software to ensure they're not watching porn.</p>
<p>I mean, <em>One Night Love Affair</em> might just hold true for him if we ever find out anything else from his past, and <em>All Through The Night</em> is most definitely his cuck song, because he doesn't look like the kind of guy that could last more than a minute. ...after which he probably plays <em>Finding Nemo / Nemo Egg</em> by the City of Prague's Philharmonic Orchestra, before crying himself to sleep.</p>
<p><strong>Pam Bondi</strong> <a href="https://open.spotify.com/playlist/15zz73cywH65dQXrdWzTGH">starts it off <em>real hot</em></a> with Nelly's hit <em>Hot In Herre</em> - which, we know Pam, Hell is <em>very hot</em> this time of the year, no thanks to global warming! - before continuing with Rick Astley's <em>Never Gonna Give You Up</em>, a promise that she has already broken, considering the &quot;Epstein Files&quot; she had on her desk are nowhere to be seen, and <a href="https://nypost.com/2025/07/25/us-news/ghislaine-maxwell-returns-to-florida-federal-prison-holding-mysterious-box-after-doj-meeting/">totally not in a box given to Ghislaine Maxwell</a>, spotted while returning to prison. And to top it all off, <em>Slow Burn</em> by Kacey Musgraves, another gentle reminder of the catastrophic climate change that we're only beginning to feel the tip of. Well, I think there's a cherry on top of that, Mike Posner's <em>Cooler Than Me</em> which probably is true, Satan is cooler than Pam - both in style, and in body temperature, also hinting at their relationship with the song <em>Shout Out to My Ex</em> by Little Mix, though I'd be inclined to think that the Devil themselves broke it off because they couldn't take it anymore, being Pam's partner and all.</p>
<p>We move to <strong>Ron DeSantis</strong>, the governor of Florida. He has a <a href="https://open.spotify.com/playlist/2Xb2Lt6kZEnwTG4I88XJud?si">hodge-podge mix</a> (his words, not mine!), which include hits such as <em>Ring of Fire</em> - again, a nod to the catastrophic climate change we're experiencing, and <em>Cars</em> movie' <em>Life Is a Highway</em>, which is true when all you've known is the USA for your entire life. Highways in the US cost incredible amounts of money to construct and maintain, even with all the subsidies the government has provided, under the pressure of the ever-powerful car lobby. And yeah, Joe Walsh's song <em>Life's Been Good</em> holds true when <a href="https://en.wikipedia.org/wiki/Ron_DeSantis#Hope_Florida_Foundation_controversy">you and your former chief of staff, James Uthmeier, have siphoned $10 million from a Medicaid settlement</a>, directed to your wife's Hope Florida Foundation, before being transferred to two separate groups, sent to Uthmeier's political committee. Un-luckily for you, a criminal investigation is underway as of May 2025, an investigation that's scared your wife enough to cite as the reason why she decided not to run for governor next year. Fuck you Ron, see you in Hell, I'll be waiting for you, you parasite.</p>
<p><strong>Sam Altman</strong>'s <a href="https://open.spotify.com/playlist/5jIsUIzFmXFGQKOOcKnSBk?si=4664de3fce6d48fe">Shazam tracks playlist on Spotify</a> is probably the same thing I'd expect to see from Mark Zuckerberg - a bunch of songs thrown in there that should make you seem...human. Sam's most likely the same kind of reptilian breed as Zuck, wouldn't be surprised if they're brothers back on their home planet. Still, <em>Until the Sun Needs To Rise</em> and <em>I Don't Wanna Wait</em> embody Sam just precisely, having the determination to continue ruining Earth with his ChatGPT and AI, and just like any other rapey Sillicon Valley techbro, he doesn't want to wait. Regulation? Fuck it. Any remorse or consideration about using copyrighted content to train your AI? Fuck it, why wait for that? Seems stupid, doesn't it?</p>
<p>Okay, <strong>Sam Bankman-Fried</strong>, FTX founder and convicted felon's playlists <a href="https://open.spotify.com/playlist/70ZD5JjGwvUnEqXLdMHxxk">loud</a> and <a href="https://open.spotify.com/playlist/69EDbTQKBzjWTihW0u9QDo">soft</a> are the story of his life. <em>Save Your Tears</em> Sam, for you are now in prison for wire, commodities, securities fraud, and money laundering. Yeah, you're also <em>Young Dumb, Broke</em>, but nowhere near <em>Unstoppable</em>. And your <em>Hide and Seek</em>, <em>Rumaway</em> game with the police didn't last long, after being arrested on December 12, 2022 at your Bahamas apartment for those charges.</p>
<p>Surprisingly good guy <em>Billionaire</em> and philanthropist <strong>Marc Benioff</strong> knows how to party hard, considering his <a href="https://open.spotify.com/playlist/0JFeo8u07prwzvuppvIrZT">high energy party playlist on Spotify</a> has some superb bangers from Lady Gaga, having 777 songs in total in that playlist. Surprisingly good, you say? His Wikipedia page only has <a href="https://en.wikipedia.org/wiki/Marc_Benioff#Social_activism">praises for him</a>, deeply caring about his employees' gender pay gap, access to abortion, LGBTQ+ inclusion, also caring about the homeless. You love to see it, finally a billionaire that doesn't suck! <strong>October 2025 edit:</strong> ...that didn't last long. Benioff caved in to Trump, more things came to light. He's not a good guy billionaire, no one is.</p>
<p>Besides that, I don't think I can roast anyone else on that list, since I know fuck all about them. Well okay, I can roast <strong>Shaun Maguire</strong>, a VC that is currently still a partner at Sequoia Capital - but not for long - for having a face that does scream <em>Windowlicker</em>.</p>
<p>Maguire served as an advisor to Trump in his second term, assisting with US Intelligence Community picks, for some fucking reason. Shaun also manages the investments of Sequoia in all of Musk's companies,and assisted Musk during his tenure at DOGE. He made a <a href="https://x.com/shaunmmaguire/status/1941135110922969168">deeply appalling, racist and Islamophobic remark about Zohran Mamdani on Twitter</a>, writing that &quot;(Mamdani) comes from a culture that lies about everything. It's literally a virtue to lie if it advances his Islamist agenda. The West will learn this lesson the hard way&quot;. Soon after, a petition singed by 900 tech leaders called for Sequoia to condemn Maguire's comments, and to investigate and apologize about this. ...At the same time, an <a href="https://www.businessinsider.com/shaun-maguire-letter-of-support-2025-7">open letter in support of Maguire's comments</a> has over 355 signatures. Go fuck yourself, Shaun. Rot in hell with the rest of your pro-Israel friends.</p>
]]></content:encoded>
					<guid>PO-250731-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Vile judge is the only presidential candidate of the Romanian Supreme Court]]></title>
					<link>/posts/2025-07-30-Vile-judge-is-the-only-candidate.html</link>
					<description>That's the only topic of this article, sorry!</description>
					<pubDate>Wed, 30 Jul 2025 18:49:00 GMT</pubDate>
					<content:encoded><![CDATA[<p>Writing this article is boiling my blood. Hopefully it boils your blood as well, reading it. Fuck this.</p>
<h2 id="lia-savonea-is-a-vile-piece-of-shit" tabindex="-1">Lia Savonea is a vile piece of shit</h2>
<p><strong>The only candidate at the Romanian Supreme Court at this time is Lia Savonea</strong>, <strong>a vile piece of shit</strong>, and it's beyond me that she's even allowed to be a judge in the first place!</p>
<p><strong>Short background on Lia Savonea:</strong> Former chief of the Superior Council of Magistracy and former president of the Bucharest Court of Appeals, she was named in association with the Cătălin Voicu network in justice — he was arrested by DNA prosecutors after dismantling his network of politicians, businessmen, and magistrates from the High Court, coordinated by former PSD (&quot;Social-Democratic Party&quot;) senator Cătălin Voicu. He was sentenced to 7 years of detention for corruption. Her husband and lawyer, Mihai Savonea, had his law firm in the same building as Cătălin Voicu and a lawyer, Cezar Bivolaru, one of Marian Vanghelie's defendants.</p>
<p>In 2023, she was promoted to the Supreme Court (ro: ÎCCJ - Înaltea Curte de Casaţie şi Justiţie) following an interview DESPITE former Justice Minister Stelian Ion's mention that <strong>Lia Savonea had sentenced a man that sexually abused his 13-year-old granddaughter to ONLY 8 months in prison (with suspension), justifying that the minor gave her consent!</strong> <a href="https://www.g4media.ro/exclusiv-document-lia-savonea-candidatul-pentru-inalta-curte-care-a-emis-o-sentinta-de-8-luni-de-inchisoare-cu-suspendare-pentru-act-sexual-cu-un-minor-justificand-ca-fetita-si-a-dat-consimtamantul.html">More information here, in Romanian</a>, and explained below as well:</p>
<p><a href="https://cdn.g4media.ro/wp-content/uploads/2023/03/savonea-anonimizat.jpg">Anonymized document obtained by G4Media</a>, and the <a href="https://cdn.g4media.ro/wp-content/uploads/2023/03/document-neanonimizat-bun.jpg">de-anonymized screenshot of the same document, also obtained by G4Media</a> - also pictured below:</p>
<div class="flex row">
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/slop/document-neanonimizat-bun.webp" alt="" title="">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/document-neanonimizat-bun.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
  </div>
</figure>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/slop/savonea-anonimizat.webp" alt="" title="">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/savonea-anonimizat.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
  </div>
</figure>
</div>
<p>The other judge listed in the de-anonymized screenshot, Daniel Grădinaru, is the current president of the CSM, and is considered in the justice system as &quot;Lia Savonea's man&quot;.</p>
<p>Part of the court decisions is this hallucinatory paragraph present in the document (not in the photo above) (translated to English):</p>
<blockquote>
<p><em>It is true that the deed for which the defendant was convicted presents a certain gravity and following its committing the psycho-social development of the injured person could be negatively affected, but the Court, also holds the circumstance that the injured person did not understand to initiate any action against the behavior, not even to the child, to the police on the occasion of its disappearance from home in October (...) when he moved to the home of his concubine, the witness (...) with whom he intended to marry.</em></p>
</blockquote>
<p>So, according to Lia Savonea, the girl (13 at the time, so a FUCKING minor!) is partly to blame as well for being abused by that <em>degenerate fuckwad</em>, who was also <em>her uncle</em>! So, because the police wasn't notified, and the parents didn't know, it's somehow considered as a <em>consensual sexual act</em>. Despite the FUCKING FACT THAT <strong>SHE WAS THIRTEEN</strong>. And that an <strong>8 MONTH SENTENCE</strong> for this vile piece of shit is a-okay. It's just enough for him to learn his lesson and never fuck kids again, surely!</p>
<p><strong><a href="https://www.g4media.ro/modificare-importanta-la-codul-penal-actul-sexual-cu-un-minor-sub-16-ani-va-fi-considerat-viol-comisia-juridica-din-camera-deputatilor-a-dat-raport-favorabil-unei-initiative-privind-cresterea-consi.html">And this is DESPITE the law that was passed in December 2022, a modification to the Penal Code that classified ANY act with a minor under the age of 16 as RAPE!</a></strong></p>
<p><strong>This girl would be considered, BY THE LAW, to have been raped by her uncle, but this vile, steaming pile of human excrement, this &quot;judge&quot; is STILL fucking eligible (and IS a candidate, the ONLY candidate) for the Supreme Court of Romania! I'm surprised she can be a judge in the first place!</strong></p>
<p><strong>And this is not the only case that has attracted negative attention towards Lia Savonea.</strong></p>
<hr>
<p>As part of the ÎCCJ, <strong>she has also taken part in the conspiracy that annulled the final sentencing decision in the case of Mario Iorgulescu</strong> and ordered his re-judgment for manslaughter in the case (file) of the road accident that resulted in the death of a young man. <strong>Mario Iorgulescu was both drunk and on drugs (cocaine) at the time of the accident</strong>.</p>
<blockquote>
<p><strong>Context:</strong> (<a href="https://www.g4media.ro/mario-iorgulescu-beneficiaza-de-inca-o-reducere-a-condamnarii-desi-nu-a-facut-nicio-zi-de-inchisoare-curtea-de-apel-bucuresti-a-dispus-joi-scaderea-a-opt-luni-din-condamnarea-de-8-ani-si-8-luni-inc.html">from the G4Media article dated 12 June 2025</a>) On the evening of September 8, 2019, Mario Iorgulescu participated in a party thrown by a friend's family in the village of Gulia, Tărtăşeşti commune, where he consumed alcohol. At one point, he learned that his ex-girlfriend, whom he had just separated, was in a club in the Herăstrău Park. Witnesses said that he was constantly arguing on the phone with his ex-girlfriend, he was angry and was screaming, but he promised the host that he would not drive in his current state at the time. At the end of the party, around 2:50 AM, amid a jealousy crisis and in a state of anger, having a measured alcohol level of 1.96 g/l and being under the influence of cocaine, he got in his car, an Aston Martin Model DBS, and left for the Capital.</p>
<p>He entered Bucharest through Chitila, traveling with speeds between 140 km/h and 164 km/h (moments taken by the video cameras on the route), at the intersection between Chitilei highway and Teodor Neagoe street he ran the red light with a speed of 145 km/h, then accelerated by 162 km/h by the time he passed a vehicle that was driving at a slower speed on the first lane. Later, he climbed with the car on the green zone that separates the two directions of traffic on a street, entered the opposite traffic lanes, where he was involved in a head-on collision, at a speed of 143 km/h, with a car driven by a man, who died on the spot.</p>
<p>A few days after the accident, Mario Iorgulescu was transferred by his family to Italy, by a private plane, and admitted to a clinic. He was not heard by prosecutors or magistrates during the criminal prosecution or the trial in court.</p>
</blockquote>
<p>A new decision was taken in June 2025, where the court admitted an annulment appeal filed by Mario Iorgulescu's lawyers, who invoked that, for the offense of driving a vehicle under the influence of alcohol or other substances, the facts were prescribed. The Bucharest Court of Appeals ordered a decrease of eight months on Mario's sentence of 8 years and 8 months of prison received by Mario. Note that the court had previously reduced his sentence multiple times:</p>
<ul>
<li>in February 2023, Mario Iorgulescu is sentenced to 15 years and 8 months by the Bucharest Court</li>
<li>in October 2023, the Bucharest Court of Appeals reduces his sentence to 13 years and 8 months</li>
<li>in June 2024, part of the conspiracy in which Lia Savonea participated, the ÎCCJ cancels the conviction on the grounds that Iorgulescu should not be tried for murder but for manslaughter, as the offense has lower punishment limits.</li>
<li>in December 2024, after a re-judgment, the Bucharest Court of Appeals reduces his sentence to 8 years and 8 months.</li>
</ul>
<blockquote>
<p><strong>More context:</strong> The prescription of acts in Romanian law, or more commonly known in English as the &quot;statute of limitations&quot;, is when after a certain period of time prescribed by law has passed since a criminal act or civil wrong was committed, the right to prosecute or to bring an action to court is extinguished.</p>
<p>The infraction of driving under the influence of alcohol or other substances in Romanian law is treated as a criminal offense with a specific limitation period for prosecuting the crime. The crime consists of operating a vehicle on public roads with a blood alcohol concentration over 0.80 g/l or under the influence of psychoactive substances, punishable by law with imprisonment from 1 to 5 years, or alternatively with a fine (Art. 336 Penal Code). The offense is considered to occur at the moment of driving with the prohibited blood alcohol level, not the time of biological sample collection. Regarding the prescription (statute of limitations) of such offenses, Romanian Penal Code Article 154 regulates the limitation periods for criminal liability. These periods vary between 3 and 15 years depending on the severity and maximum punishment of the crime. For an offense punishable by up to 5 years in prison, the limitation period is generally 5 years from the date of the offense.</p>
<p>In the Mario Iorgulescu case, the Bucharest Court of Appeals recognized that the criminal act of driving under the influence was time-barred due to prescription. This means that the limitation period for prosecuting that specific offense had expired, making it impossible to continue legal proceedings for that infraction alone. This was a basis for reducing his punishment related to that charge.</p>
</blockquote>
<hr>
<p>She was also part of the conspiracy that arrested the lawyer from Arad suspected of ordering the assassination of her father, although a judge from the Court of Appeals had initially rejected the prosecutors' proposal.</p>
<p><strong>Seeing this person not be a candidate for the Supreme Court is not enough. I want her to be thrown in prison or at least heavily, supremely penalized for these vile, atrocious decisions she's responsible for. She should also lose her license and never be eligible to be a judge ever again or take any position in state- or private-run law practice. I want her excommunicated from the justice arm of Romania! She is, without a doubt, corrupt and incompetent in practicing actual law, only doing things that serve her interests, and protecting abusers!</strong></p>
<p><strong>Unfortunately, the public and the citizens can do basically fuck all against her.</strong> I can only raise awareness, because I <em>wish</em> I had the money to consult with actual lawyers and NGOs, like any other sensible citizen that wants to fight corruption would do. But even then, there's not much that can be done. Petitions can only raise public awareness and put pressure on the institutions, but they hold no formal legal weight in the appointment process. <a href="https://facem.declic.ro/campaigns/fara-judecatori-toxici-promovati">DeClic has launched a petition in May 2025 regarding her appointment</a>, if it helps, 70,678 people have signed it. Furthermore, there is <em>no direct legal mechanism</em> for ordinary citizens to block or appeal an ÎCCJ appointment decided by the CSM. The CSM's decision is final within the domestic judicial system.</p>
<blockquote>
<p><strong>Context:</strong> The president of ÎCCJ is selected through a competition organized and overseen by the CSM, specifically its Judges Section. Other branches of government, including the President of Romania (currently Nicușor Dan) have only a formal role in the process, typically just signing off on the CSM decision. The President, despite any objections they might have (as of now, Nicușor has no objections in the matter, he will &quot;very probably&quot; sign the appointment), needs to sign the decision either way.</p>
</blockquote>
<p>Lia Savonea is the only candidate in this cycle and was appointed after receiving a majority of votes from the CSM, with only one member voting against her. Her appointment is scheduled for a three-year term starting by September 17, 2025. This procedure leaves little direct space for legal or popular contestation after the internal CSM process has concluded.</p>
<p><strong>From my limited legal knowledge</strong>: Through updated laws in recent years and in force for the 2025 selection, the President of Romania has been removed from the process entirely. The authority to appoint (and revoke) the president of the Supreme Court lies exclusively with the CSM, specifically its Judges' Section. The President has no legal role to sign, veto, or block the appointment. There is no obligation for the President to sign; if the President does nothing or doesn't want to sign, the appointment still takes place, as the CSM's decision is final and fully binding.</p>
<p>We're so fucked with her at the helm of the Supreme Court.</p>
]]></content:encoded>
					<guid>PO-250730-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Another day, another economical package, and Christo-fascist group bans NSFW games]]></title>
					<link>/posts/2025-07-24-Another-Day-Another-Package.html</link>
					<description>More slop, but this time centered around Romania</description>
					<pubDate>Thu, 24 Jul 2025 19:51:00 GMT</pubDate>
					<content:encoded><![CDATA[<p>I've wanted to write about Romania's politics, incompetency, general lies, and so much more for two years now, but I never got around to it. Hopefully now I can, because some of this shit might just surprise you, as Romania is supposed to be a 'European' country, part of NATO and whatnot.</p>
<p>But before that...</p>
<h2 id="collective-shout-is-a-puritan-christo-fascist-organisation" tabindex="-1">Collective Shout is a puritan Christo-fascist organisation</h2>
<p>Itch.Io had a game that was temporarily available for sale called '<em>No Mercy</em>', some shitty 3D game that is 'not a rape simulator' according to the developers' site, which was banned back in April.</p>
<p>Still, after that, an organisation called <a href="https://www.collectiveshout.org/">Collective Shout</a> launched a <a href="https://www.collectiveshout.org/open-letter-to-payment-processors">campaign against Steam and Itch</a> asking major global payment processors to bully (force, strong-arm) Steam and Itch into banning certain types of games, and make them follow some new guidelines for what they can and can't sell via these processors.</p>
<p>Itch so nicely clarifies that it's a critical time for the platform as in order for it to literally fucking survive, and to continue operating a marketplace for developers of all kinds, they had to comply as soon as possible and resorted to delisting all NSFW games - they will review the NSFW content, conduct a comprehensive audit and then introduce new guidelines to ensure creators match the criteria that the payment processors allow, in order to sell their products.</p>
<p>Of course, <em>of course</em>, bumbling fucks all over Itch, Steam discussions, Mastodon, Twitter and reddit accused Itch of throwing queer people under the bus, and other knee-jerk, mouth-breather responses without even taking 2 minutes to <a href="https://itch.io/updates/update-on-nsfw-content">read their fucking blog post</a>. Read, asswipes, read!</p>
<p>Okay, so what happened? Who is this Collective Shout organization? The founder behind the org, Melinda Tankard Reist, describes herself as a &quot;pro-life feminist&quot; (she's pro-church, anti-trans, anti-abortion, and has written for multiple Christian conservative newspapers - she's a TERF and a Christofascist). She does have a <a href="https://en.wikipedia.org/wiki/Melinda_Tankard_Reist">Wikipedia page</a>, and boy howdy is it fucking abysmal! She's basically the TERFy version of <a href="https://en.wikipedia.org/wiki/Jack_Thompson_(activist)">Jack Thompson</a>, famously known for wanting to sue Rockstar for each game they released, because he's another puritan fuckwad that thinks rap music and video games are obscene.</p>
<p>Take-Two got sick of his ass back in 2007, when they filed a lawsuit seeking an injunction against Thompson from filing any more actions against the company, alleging that the lawsuits violated the company's First Amendment rights.</p>
<p>Of course, Thompson despite settling the suit a month later, made more threats and accusations, and in 2008 he went full-on schizo r-d mode. He called GTA IV &quot;the gravest assault upon children in this country since polio&quot;, and even sent a letter to Strauss Zelnick's attorney, addressed to Zelnick's mother, accusing her son of &quot;doing everything he possibly can to sell as many copies of GTA:IV to teen boys in the United States, a country in which your son claims you raised him to be 'a Boy Scout'. ... More like the Hitler Youth, I would say.&quot; - absolutely fucking rancid letter, how can one be so possibly demented and hardcore against a game to compare it to the literal Hitler Youth. Absolute scumbag human being.</p>
<p>Thankfully, he was permanently disbarred in 2008 by the Supreme Court of Florida for making false statements to tribunals, humiliating litigants, and inappropriate conduct. Fuck you, Thompson!</p>
<p>She wrote some papers: <a href="https://books.google.com/books?vid=ISBN9781875989676&amp;redir_esc=y">Giving sorrow words: women's stories of grief after abortion</a> - in which the book contains stories of a dozen women that regret their abortions; <a href="https://openlibrary.org/books/OL48211468M/Defiant_Birth">Defiant birth: women who resist medical eugenics</a>, because apparently women should forcefully bring children into this world knowing full well that they might have proper disabilities and health issues. Personally, it isn't eugenics if it means not bringing into this world a child that will suffer for the rest of their life, simply because someone values all life. You don't need some perfect child, but would you want to give birth to a child that will endlessly suffer? Is it really worth it?; and a couple more stuff, related to 'challenging the sexualisation of girls', 'exposing the harms of the global pornography industry', and 'stories of survival in the sex trade' - maybe because sex work doesn't have all of the rights other jobs do, due to Christian conservative lobbyists that still view this work as 'not a real job'!</p>
<p>She led a successful campaign to block Tyler, the Creator from touring in Australia due to lyrics she considered misogynistic. She tried to have SnoopDogg's visa revoked by stating that his lyrics &quot;glorify violence against women which puts all women in danger&quot;, and also campaigned for Eminem to be banned from Australia. What the <em>fuck</em> is wrong with you?</p>
<p>The org posted a <a href="https://www.collectiveshout.org/high-level-ndity-honey-birdette-upheld">rambling article</a> about Honey Birdette posters that are &quot;porn-themed&quot;, because apparently advertising lingerie in stores MUST be porn or indecent! And a post on <a href="https://www.collectiveshout.org/ban-prn-on-x">asking Twitter to ban porn</a> entirely, because Heaven forbid parents control their children's access to social media. No, apparently the blame doesn't fall on the parents, and therefore, we must implement rules in which we request IDs and whatnot from people to verify their age - a blatant privacy nightmare for everyone.</p>
<p>Also shitting on <a href="https://www.collectiveshout.org/call_on_the_us_attorney_general_investigate_onlyfans">OnlyFans</a>, reddit (which, fair enough, reddit IS a shithole), but at least they do have like two articles which make sense - Temu selling <a href="https://www.collectiveshout.org/child_s_x_abuse_dolls_on_temu">child-like dolls</a> for sex, and then how <a href="https://www.collectiveshout.org/how-temu-sellers-get-around-doll-restrictions">sellers get around these restrictions</a>. Very rational stuff, you can find this stuff on AliExpress and other sites as well, it's at the very least utterly fucking creepy - something that actually makes sense, something that can and should protect children, and discourage child attraction and abuse!</p>
<p>But this is precisely WHY Collective Shout is dangerous. Because just like fascists and other extreme (both far-left and far-right in equal measures) ideologies, they bring some fair points, just before shoving down your throat their extremist, puritan views! The fact that the payment processors actually joined up with CS on their crusade against rational stuff like rape and incest raises some critical questions about the future, and opens up an <em>extremely dangerous</em> precedent for banning things that some groups of people (e.g. hardcore Christians in this case) don't agree with!</p>
<p>Just like I said, today it's about banning incest and rape games, tomorrow it'll be banning LGBTQ+ games, general porn games that don't contain their so-called 'harmful' tropes like objectification, and before you know it, by next week all games on Steam and Itch will be promoting [[:donaldtrump:Daddy Trump]] and his lackeys, and the puritan American way of life, holding a bible, performing exorcisms (<em>not the first or the last mention of exorcism in this post, by the way!</em>), owning the liberals and other US-centric propaganda.</p>
<p>Her whole ass organization is pulling a &quot;won't somebody think of the children?&quot; for each of its campaigns, and sometimes it fucking works, because she's a lunatic!</p>
<p>I obviously agree that payment processors (and well, game storefronts) should ban games that promote incest, rape, stuff like that, there's a lot of useless garbage on Steam that thankfully was now delisted, but this opens the gates to digital fascist thinking, thought crime and whatnot! Today it's &quot;<em>won't somebody think of the children? somebody needs to protect them from games that encourage rape and child violence!</em>&quot;, but because Melinda is a fucking TERF, in a week this <em>will</em> actually become &quot;<em>won't somebody think of the children? somebody needs to protect them from games that promote diversity, inclusion, LGBTQ+ content, it's harmful!</em>&quot;</p>
<p>In 2014, the org protested Grand Theft Auto V, describing it as a &quot;video game that encourages players to brutally murder women for entertainment&quot;, which is wholly and completely fucking false! GTA games allow you to kill any NPC in equal ways, it's not restricted to women. And none of the violence in Grand Theft Auto can ever be claimed to be brutal, there is no gore in this game, and blood is very sparse, overall any bloody impacts or wounds are clean. If you want to call something brutal, only games like DOOM and ULTRAKILL can fall under that category, you bumbling buffoons!</p>
<p>In 2018, she promoted a petition to ban the sale of Detroit: Become Human in Australia because she said the game contained themes of &quot;child abuse and violence against women&quot;. She didn't even play the fucking game! She didn't even watch a full walkthrough of the game's story to find out that the game contains these themes, because the game does not encourage this stuff, it shines light on it, the atrocity, the victims of this stuff! <strong>How DARE you try to ban a video game without first playing through the entire game to get a glimpse of the entire context around it? You should be deeply ashamed for this, Melinda!</strong></p>
<p>Vice's operator Savage Ventures pulled down two articles written by reporter Ana Valens describing the situation around Detroit: become Human, and the association of the group with retweeting a TERF claiming that &quot;pervert nerds are responsible for most of society's ills&quot; (<em>off-topic tangent, but this is similar to what the Soviet Union and Fidel Castro's stance was against homosexuals and the greater LGBTQ+ community</em>), and expressed doubts about the game promoting or depicting child abuse, because the game's actions area meant to encourage concern and care in the player - you know, fucking <em>empathy</em>, something this woman pretty much lacks.</p>
<p><strong>All I can say to Melinda is:</strong> <em>Go fuck yourself, you Christian fascist. Jesus would fucking weep if he wasn't an imaginary moral tale. You're just a piece of shit, stop hiding behind the &quot;won't somebody think of the children?&quot; stance and just come out already as someone that doesn't give a fuck, and just wants to control what people can do.</em></p>
<p><strong>And to the payment processors:</strong> <em>Walk back your support for Collective Shout and Melinda. PayPal, MasterCard, Visa, Paysafe Limited, Discover, JCB CEOs (<em>all 6 CEOs are men, by the way</em>), decry Collective Shout's open letter. Why would you support someone's veiled Christofascism and thought crime, literal censorship of game and articles, under the guise of protecting your children? Why would you support such a piece of shit person and her organisation? You can demonstrate proper corporate social responsibility and immediately cease supporting Collective Shout.</em></p>
<p><strong>Don't send Melinda threats, don't send her rape or NSFW content. Raise awareness of this issue, raise awareness of who Melinda is, what she and her organisation, Collective Shout, actually stand for.</strong></p>
<h2 id="gambling-bans%3F-more-like-per-city-bans" tabindex="-1">Gambling bans? More like per-city bans</h2>
<p>The guvment is proposing the <a href="https://jurnaluldearges.ro/fiecare-primarie-va-decide-daca-vrea-sau-nu-pacanele-in-localitatea-sa-397218/">decentralisation of gambling decision-making</a>, so that each local authority (e.g. the city mayor) can decide if they want to authorize or not the gambling activity in the locality they manage. As if city mayors are totally incorruptible or something!</p>
<p>Meanwhile, a former economic (finance? so CFO?) director at a state-run company has been <a href="https://stirileprotv.ro/stiri/actualitate/o-directoare-a-fost-acuzata-ca-a-delapidat-900-000-de-euro-a-recunoscut-ca-a-pierdut-banii-la-pariuri-sportive.html">arrested and accused of stealing <strong>over 900,000 EUR</strong></a> from the amounts she was managing for the company, and that she had spent all the money on online sports betting (gambling).</p>
<p>The prosecutors of the Bucharest Prosecution Office claim that the economic director had unlimited access to the financial funds of the state company and would have made in just three and a half months no less than 18 transfers to the company owned by her husband. And it would have caused a prejudice (damage) of over 900,000 euros. The alleged fraud had been revealed after an internal control, after the woman had resigned.</p>
<p>If she's found guilty - for which, according to her attorney, she completely assumes her responsibility for the committed crime -, she could face up to 10 years.</p>
<p>But no guys, the <em>cities</em> themselves should decide if they want to keep betting and gambling...</p>
<p>As for statistics: &gt;15% of adults (over 18) are engaged in some form of gambling or betting. The incidence of gambling addiction in people over 18 is 0.6%, ~98,000 people. The most hardcore of gamblers are usually young men (aged 18-24), unmarried, from an urban setting, with a medium level of education.</p>
<p>In the whole country, there are over 10,000 betting agencies, and over 70,000 machines where you can bet - they're named in Romanian 'păcănele', basically slot machines you'd see in casinos in Las Vegas, for example. But these can be found pretty much everywhere, in villages and cities alike. We're placed higher than the UK when it comes to the average number of slot machines per 10,000 population. According to a <a href="https://cazino365.ro/blog/jocurile-de-noroc-din-romania-in-cifre/">betting site's statistics</a> using numbers from the National Office for Betting Games (ONJN in Romanian), the average is as follows:</p>
<table>
<thead>
<tr>
<th>Country</th>
<th>Total slot machines num</th>
<th>Average slot machine num per 10,000 pop</th>
</tr>
</thead>
<tbody>
<tr>
<td>Romania</td>
<td>89,913</td>
<td>4.7</td>
</tr>
<tr>
<td>UK</td>
<td>151,260</td>
<td>2.2</td>
</tr>
<tr>
<td>Australia</td>
<td>190,349</td>
<td>7.3</td>
</tr>
<tr>
<td>Italy</td>
<td>380,000</td>
<td>6.4</td>
</tr>
</tbody>
</table>
<p>As one might expect, the betting lobby in Romania is just as powerful as in other countries. Popular right-wing news site and television RomaniaTV is among the paid press (which is already paid by Russia, and has violated numerous times throughout the years laws and rules from the National Audiovisual Council (CNA in Romanian)) which is paid to encourage betting and favour betting news such as <a href="https://www.romaniatv.net/soc-superbet-opreste-sponsorizarile-in-romania-din-cauza-noilor-majorari-de-taxe_9018634.html">licking Superbet's ass</a> for donating to 'good causes' like sponsoring sports teams and funding hospitals.</p>
<p><strong>It is unbelievably bone-headed and r-ed to be living in a day and age where a fucking BETTING operator is funding the construction and modernisation of hospitals in Romania, because the government is utterly fucking inept!</strong> The Superbet Group / Superbet Foundation has equipped 67 hospitals country-wide with 110 <a href="https://en.wikipedia.org/wiki/Oxygen_concentrator">oxygen concentrators</a> and 3000 masks for these devices!</p>
<h2 id="exorcisms-in-2025" tabindex="-1">Exorcisms in 2025</h2>
<p>European country, everybody. NATO member, everyone! <a href="https://www.g4media.ro/o-fata-din-sibiu-care-a-fost-supusa-unui-ritual-de-exorcizare-de-catre-mama-sa-a-fost-preluata-de-protectia-copilului.html">A girl in Dumbrăveni, a city in the Sibiu municipality, was finally picked up by child protection services after being subjected to a so-called exorcism ritual by her mother</a>. According to a description of the video, the girl is crying while the woman is speaking prayers, holding a bible in her hand. The police has opened a criminal case of bad treatments applied to the minor girl.</p>
<p>At least we don't have yet another <a href="https://techhub.social/@alextecplayz/112841470066786503">rain ritual</a> to grow our crops in times of drought. Wait, <a href="https://www.g4media.ro/patriarhia-romana-indeamna-la-rugaciune-pentru-stingerea-incendiilor-de-vegetatie-in-timpul-sfintei-liturghii-vor-fi-incluse-cererile-speciale-la-vreme-de-orice-nevoie-si-primejdie-omeneasca.html">nevermind</a>, there was a ritual in March, praying to God to stop the vegetation fires.</p>
<p><em>More slop to come soon! I will probably publish another post by Saturday or Sunday, if things evolve.</em></p>
]]></content:encoded>
					<guid>PO-250724-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Trump chaos continues]]></title>
					<link>/posts/2025-07-19-Chaos-Continues.html</link>
					<description>New revelations in Epstein case as Trump continues to avoid the subject.</description>
					<pubDate>Sat, 19 Jul 2025 14:17:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="trump-kisses-a-(possibly-underage)-model-on-a-boat-in-1991" tabindex="-1">Trump kisses a (possibly underage) model on a boat in 1991</h2>
<p><em>&quot;From magical New York, glamorous Plaza Hotel, Elite Model Management presents the '1991 Look of the Year' contest&quot;</em>, opens a <a href="https://www.youtube.com/watch?v=2_LmdTa3758">54-minute video</a> in which a younger, less orange, and slightly more eloquent and less prone to derailing from the topic at hand, Donald Trump (aged 45), as a judge, is one of the judges. It's a contest in which 58 women (minors included) participate for over $700,000 worth of prizes and the &quot;&quot;prestigious&quot;&quot; 'Look of the Year' title.</p>
<p>It's a deeply creepy yearly event since 1983, in which some of the contestants are minors. The women introduced at <a href="https://www.youtube.com/watch?v=2_LmdTa3758&amp;t=94s">1:34</a>, notable contestants from past editions are, <a href="https://www.youtube.com/watch?v=2_LmdTa3758&amp;lc=UgxIL7H2SNGIb_VciWd4AaABAg">as per a YouTube comment</a>, minors. Stephanie Seymour, born in 1968, was 15 years old in 1983. Karin Hunter Reno, born 1968, was also 15. Maria Lindkvist, born 1972, was 15 in 1987, and Cindy Crawford, born 1966, was 17 in 1983. And this doesn't get better. The <a href="https://en.wikipedia.org/wiki/Elite_Model_Look#Titleholders">Wikipedia section on the titleholders</a> (winners of editions) mentions the ages of the participants as well, which helped me perform some statistics below:</p>
<table>
<thead>
<tr>
<th>Age</th>
<th>Count of winning contestants matching age</th>
</tr>
</thead>
<tbody>
<tr>
<td>14</td>
<td>6</td>
</tr>
<tr>
<td>15</td>
<td>15</td>
</tr>
<tr>
<td>16</td>
<td>6</td>
</tr>
<tr>
<td>17</td>
<td>9</td>
</tr>
<tr>
<td>18</td>
<td>5</td>
</tr>
<tr>
<td>19</td>
<td>3</td>
</tr>
<tr>
<td>20</td>
<td>3</td>
</tr>
<tr>
<td>21</td>
<td>2</td>
</tr>
<tr>
<td>23</td>
<td>2</td>
</tr>
<tr>
<td>-------------</td>
<td>----------</td>
</tr>
<tr>
<td>Average age</td>
<td>16.53</td>
</tr>
<tr>
<td>Median age</td>
<td>16</td>
</tr>
<tr>
<td>Highest count</td>
<td>15, age 15</td>
</tr>
</tbody>
</table>
<p>As I've mentioned on Mastodon, I've found this video, and I wanted to dig in to see who is the <a href="https://techhub.social/@DemocracyMattersALot@mstdn.social/114868422421393200">woman in this photo</a>. At that time I concluded that the top half of the photo is, at the very least, real, as the image is present in The Guardian's <a href="https://www.theguardian.com/us-news/2020/mar/14/teen-models-powerful-men-when-donald-trump-hosted-look-of-the-year">article</a>. She seems to be <a href="https://youtu.be/2_LmdTa3758?feature=shared&amp;t=508">Belinda Hutter</a> from Lochau, Austria. It can be assumed that she is a minor, based on her appearance alongisde Tamara Sedmark, a 15-year old girl, where at <a href="https://www.youtube.com/watch?v=2_LmdTa3758&amp;t=1124s">18:44</a>, the narrator introduces her, and the cameraman leans in for an <strong>upskirt photo</strong> and close-up shots, minutes later.</p>
<div class="flex justify-center">
    <figure class="image-frame">
        <img class="post-image-size" src="/images/post-media/slop/1991look-trump-details.webp" alt="A 1991 Look of the Year photo on a yacht with some of the contestants. Donald is aged 45, while the identified women around him may be underage. Only one is confirmed to be a minor, Tamara Sedmark, who is 15. Belinda Hutter, the girl that Trump is displayed in a different photo kissing either on the mouth or cheek, could be a minor. Another identified girl in the photo is Irina Tortchinskaia, age unknown." title="A 1991 Look of the Year photo on a yacht with some of the contestants. Donald is aged 45, while the identified women around him may be underage. Only one is confirmed to be a minor, Tamara Sedmark, who is 15. Belinda Hutter, the girl that Trump is displayed in a different photo kissing either on the mouth or cheek, could be a minor. Another identified girl in the photo is Irina Tortchinskaia, age unknown.">
        <div class="image-frame-buttons">
            <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/1991look-trump-details.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
        </div>
    </figure>
</div>
<p>Unfortunately, it's not specified during the video if she is a minor or not, and I'm obviously not going to dig any further, since there's nothing that shows up when you look up her name via a search engine. Either way, even if Trump may have not kissed Belinda on the mouth but rather on the cheek, it's still turbo-fucking-creepy, considering he was 45 and she was most probably a fucking minor! Put him in a cage!</p>
<p>This whole fucking show is creepy as fuck; it's actually crazy to watch this on YouTube. I like how Trump is described by the host of the show as the &quot;best known personality of the city of New York and probably in the United States, and our host here at the Plaza since he owns the place, the president of the Trump organization&quot;.</p>
<p>And fucking David Copperfield, the magician, is also attending as a judge — someone that has had multiple sexual assault allegations throughout the years and was an associate of Jeffrey Epstein, having even attended a dinner at his house in 2004, in which he asked a woman (Johanna Sjoberg, who later accused Epstein of abusing her) if she &quot;was aware that girls were getting paid to find other girls&quot;, seemingly out of &quot;concern&quot; for her, according to Copperfield's lawyers. He met Epstein at least three times and called or left messages for Epstein about a dozen times between 2004 and 2005.</p>
<p>By 14:40, we see how the judgments and 'appraisal' work. Wearing only a bikini and a thong and holding a folder, each contestant goes in a room where the judges are, gives them the folder, and the judges &quot;discover what makes each one special&quot;, and &quot;Each girl was considered not only for her beauty and poise, but also for her personality and that indefinable something extra that makes a 'top model'&quot;. And then the judges argue between themselves, as they need to choose the 21 finalists. Trump is seen at <a href="https://youtu.be/2_LmdTa3758?feature=shared&amp;t=957">15:57 quietly reading out of a dossier</a>.</p>
<p>During the show, the camera is often pointed towards women's asses in swimsuits.</p>
<p>But back at the second half of the <a href="https://files.techhub.social/cache/media_attachments/files/114/868/422/351/722/359/original/498a5e3399cb8594.jpg">image</a> I mentioned at the beginning. Is the image real? I <em>strongly</em> believe it is, and here's why: in The Guardian's <a href="https://i.guim.co.uk/img/media/c37949875c04912789569901f8ef9654513eb14e/93_299_8923_5358/master/8923.jpg?width=1900&amp;dpr=2&amp;s=none&amp;crop=none">first image</a>, Trump is shaking her hand, while in <a href="https://i.guim.co.uk/img/media/e1a582803c3bcc591986a226f62a55440e1796af/0_534_8907_5344/master/8907.jpg?width=1900&amp;dpr=2&amp;s=none&amp;crop=none">the second</a>, Belinda Hutter is likely leaning in to tell him something, after which the kiss could have occurred — although I don't see it as a kiss on the mouth, but on the cheek, seeing as how the other judges greeting or congratulating contestants did the same — not uncommon, but still, I find it a little creepy.</p>
<p class="medium rem1 lightgray italic"><< The content continues after these non-sponsored (and totally legit!1!!) advertisements >></p><div class="atpads-container slop" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject">
			<figure class="image-frame">
				<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/slop/ad-trump-yacht.webp" alt="A parody ad a made-up Trump Cruises yacht cruise company. Visit Virgin Islands today!" title="A parody ad for a made-up Trump Cruises yacht cruise company. Visit Virgin Islands today!" loading="lazy">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ad-trump-yacht.webp" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a><p class="image-frame-caption rem0-75 lightgray monospace medium">A parody ad a made-up Trump Cruises yacht cruise company. Visit Virgin Islands today!</p>
				</div>
			</figure></div>
<p>Personally, I believe that if you're an adult and the minor is not a relative of yours, then you shouldn't kiss them on the cheek as a greeting. Just a handshake should be enough. And these contests, beauty parlors, or 'fashion shows' or whatever Look of the Year is supposed to be, should not allow minors as contestants at all. But that's just me.</p>
<p>I mean, have we learned anything about these contests? The judges take advantage of their power as judges, telling the contestants that if they don't do this or that, they they can disqualify them, change their rating, etc. Opportunistic old, white men (and women, but predominantly the jury was formed of men) exploiting people, taking advantage of them. It's no surprise that sexual abuse allegations have arisen from Look of the Year contests throughout its existence. The contestants may be desperate to attempt to win or get ahead of the others in competitions like these, and if minors are involved, this makes things significantly worse.</p>
<p>So, mission solved? Trump is very slightly — if at all — creepy in the footage available from the 1991 show.</p>
<p><em>Images and quotes from The Guardian post courtesy of Guardian News &amp; Media Ltd.</em></p>
<h2 id="new-trump-letter-to-epstein-surfaces" tabindex="-1">New Trump letter to Epstein surfaces</h2>
<p>On July 17, the <a href="https://archive.is/20250718135326/https://www.wsj.com/politics/trump-jeffrey-epstein-birthday-letter-we-have-certain-things-in-common-f918d796">Wall Street Journal publishes an exclusive article</a> outlining Epstein's 50th birthday preparations by Ghislaine Maxwell, reaching out to Epstein's family and friends, including Trump. She collected letters for a 2003 birthday album.</p>
<p>And before I continue with that, I also need to mention that <a href="https://archive.is/o/vcuCx/https://www.wsj.com/politics/policy/trump-jeffrey-epstein-files-supporters-4021019d">Trump lashed out at his own MAGA cultists</a>, calling them &quot;PAST supporters&quot; that have &quot;bought into this 'bull-[shit]', hook, line, and sinker&quot;, and that he doesn't &quot;want their support anymore!&quot;, I'm sure this won't bite him in the ass soon enough...</p>
<p>Back to the letter. According to the WSJ, the letter reviewed by the Journal is bawdy, containing several lines of typewritten text framed by the seemingly hand-drawn outline of a naked woman with a marker. Small arcs define the breasts, and below her waist is a squiggly &quot;Donald&quot; mimicking pubic hair. Inside this outline is a note styled as a third-person imaginary conversation between Trump and Epstein, which I simply must share:</p>
<blockquote>
<p><strong>Voice Over:</strong> There must be more to life than having everything<br>
<strong>Donald:</strong> Yes, there is, but I won’t tell you what it is.<br>
<strong>Jeffrey:</strong> Nor will I, since I also know what it is.<br>
<strong>Donald:</strong> We have certain things in common, Jeffrey.<br>
<strong>Jeffrey:</strong> Yes, we do, come to think of it.<br>
<strong>Donald:</strong> Enigmas never age, have you noticed that?<br>
<strong>Jeffrey:</strong> As a matter of fact, it was clear to me the last time I saw you.<br>
<strong>Trump:</strong> A pal is a wonderful thing. Happy Birthday — and may every day be another wonderful secret.</p>
</blockquote>
<p>Of course, Trump vehemently denies that the letter was written by him and blames the Democrats and WSJ for writing a fake letter. Not an unexpected reaction, at this point. Soon after, <a href="https://www.bbc.com/news/articles/c23g5xpggzmo">he filed a $10bn lawsuit against WSJ's owner, Rupert Murdoch, and his company, Dow Jones</a>, over the publication of the aforementioned article. A spokesperson for Dow Jones said that they will &quot;vigorously defend against&quot; the lawsuit.</p>
<p>I do not want to speculate on what Trump and Epstein &quot;have in common&quot; because that's a never-ending rabbit hole of allegations.</p>
<p class="medium rem1 lightgray italic"><< The content continues after these non-sponsored (and totally legit!1!!) advertisements >></p><div class="atpads-container slop" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject">
			<figure class="image-frame">
				<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/slop/ad-mypillow-epstein.webp" alt="A parody ad for MyPillow. SLEEP LIKE EPSTEIN TODAY!, with the phone number 1-800-377-8346 (numeric keypad conversion of the word 'EPSTEIN'), and Use Promo Code 2019, the year when Epstein died." title="A parody ad for MyPillow. SLEEP LIKE EPSTEIN TODAY!, with the phone number 1-800-377-8346 (numeric keypad conversion of the word 'EPSTEIN'), and Use Promo Code 2019, the year when Epstein died." loading="lazy">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ad-mypillow-epstein.webp" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a><p class="image-frame-caption rem0-75 lightgray monospace medium">A parody ad for MyPillow. SLEEP LIKE EPSTEIN TODAY!, with the phone number 1-800-377-8346 (numeric keypad conversion of the word 'EPSTEIN'), and Use Promo Code 2019, the year when Epstein died.</p>
				</div>
			</figure></div>
<p>And all of this comes after two days ago, July 17, when Trump ordered <a href="https://www.bbc.com/news/articles/c9w1014rlq9o">Pam Bondi</a> and the Justice Department to produce additional documents related to Epstein, namely the grand jury testimony. We'll see if this actually materializes, because such testimony can include confidential informants, whose identities are protected for their own safety. Materials in a grand jury testimony are usually kept secret under the law, but a judge can unseal the documents if they deem that there is sufficient public interest and that it outweighs the need for these legal protections in the case.</p>
<p>Meanwhile, both Republicans and Democrats in Congress are attempting to push a petition that would force Bondi to release many more materials pertaining to Epstein. It's rare to see both sides to come together and unite forces, but if it helps kick Trump off his high chair, and hopefully in a cell in the graybar hotel, it's fine by me.</p>
<p>A <a href="https://www.youtube.com/watch?v=ELJhKli-dmk">catchy, AI-generated jazz song</a> also explains the history of the Epstein files and pokes fun at Trump. Great use of AI, imo.</p>
<h2 id="telegram-doesn't-stop-licking-putin-in-the-ass" tabindex="-1">Telegram doesn't stop licking Putin in the ass</h2>
<p>According to <a href="https://mediabiasfactcheck.com/russian-news-agency-tass/">Russian Government-owned</a> news agency <a href="https://tass.com/economy/1990783">TASS</a>, Telegram is opening a representative office in Russia in order to comply with <a href="https://en.wikipedia.org/wiki/Roskomnadzor">Roskomnadzor</a>, the Russian federal agency responsible for monitoring, controlling, and censoring mass media in Russia.</p>
<p>This comes off as Telegram and Durov bowing down to Putin, because it was an unnecessary move, considering the fact that <a href="https://en.wikipedia.org/wiki/Roskomnadzor#Telegram">Roskomnadzor gave up trying to block Telegram in the mid-2020s, as Roskomnadzor itself and other government structures have set up their own channels in the app</a>. As a reminder of Durov's political shift towards libertarianism and pro-Trump/pro-Putinism, back in 2014 he was fired from VKontakte (the Russian equivalent of Facebook), claiming to have been ousted by pro-Putin executives angered by his refusal to hand user data over to the government. And now in 2025, he's back to sucking off Putin.</p>
<blockquote>
<p><em>And a reminder that Telegram is not end-to-end encrypted, unless you use the opt-in feature, Secret Chats. All other conversations, including direct messages and groups, use simple, server-side security, which means (and has already been proven) that Telegram can and WILL turn over any data to government agencies, despite Durov's claims that he won't censor things, and so on. Fucking avoid Telegram like the plague, and help your friends and family that use that wretched app to move to something else - preferably Signal or at the very least, WhatsApp, which does use E2EE, in all situations! <strong>Telegram is not a private messenger app, never has been!</strong></em></p>
</blockquote>
<h2 id="the-late-show-with-stephen-colbert-is-shutting-down-may-2026" tabindex="-1">The Late Show with Stephen Colbert is shutting down May 2026</h2>
<p>After 33 years since its first episode was aired, CBS has announced that the Late Show will shut down next year. Of course, Trump was <a href="https://mastodon.social/@randahl/114880311626682376">immediately giddy</a>, the rotten, seedless orange that he is.</p>
<p>CBS says it's purely a financial reason and isn't related to the show's performance. Still, some allege that Paramount, CBS' parent company, amid talks between Paramount and Skydance Media to merge the two together - a move that would require approval from the US government, ended the show for political reasons, because Colbert has constantly criticized Trump since he took over in 2015. This, and the recently settled lawsuit between Paramount and Trump due to a CBS interview with Kamala Harris, with Trump alleging that they edited an interview to favour the Democratic party.</p>
<h2 id="anti-woke-dad-fled-with-family-to-russia%2C-gets-sent-to-the-war" tabindex="-1">Anti-woke dad fled with family to Russia, gets sent to the war</h2>
<p>According to <a href="https://www.thedailybeast.com/texan-moved-fam-to-russia-to-flee-wokenow-hes-headed-to-ukraine-front-line/">The Daily Beast</a>, Derek Huffman joined the military hoping to become a Russian citizen, and fled Texas with his family to avoid <a href="https://www.youtube.com/watch?v=utTCnjNTWqA">&quot;LGBTQ+ indoctrination&quot; for his kids</a>. Little did he know that Russia isn't the woke-free paradise he thought it would be, as he was sent to the front line after being assured that he would serve in a non-combat role such as a welder or correspondent.</p>
<p>Okay, focusing a little on their reason to move, the kids' mother says in the video that they grow up too fast, and they want to keep them innocent for as long as possible, to &quot;enjoy their childhood and the lives that we[they] have&quot;. I can assure you, that the shows and stuff displayed on the screen to support their claims, will not make their childhood any less enjoyable.</p>
<p>As a child, you don't really give a fuck about gender identity, attraction, and what have you, because you're too focused on playing with toys, reading books, going out with your friends. But at the same time, this doesn't mean that you can't also learn new things and respect people for who they are. I wasn't particularly 'woke' when I was young.</p>
<p>But I wasn't homophobic in any way; I never paid attention to who people liked, as long as it wasn't illegal, like pedophilia, incest, and so on.</p>
<p>Your kids can grow up to be wonderful, warm, embracing, and open, instead of growing up indoctrinated in Russian propaganda about how Russia is the best, how the West is falling to degeneracy, and so on, growing up to be hateful, cold, and if they ever have a change of heart and become 'woke', they will resent you for trying to raise them in a way that doesn't represent them or their needs.</p>
<blockquote>
<p>“The point of this act for me is to earn a place here in Russia,” he told Russian state media last month. “If I risk myself for our new country, no one will say that I am not a part of it. Unlike migrants in America who come there just like that, do not assimilate, and at the same time want free handouts.” (The Daily Beast)<br>
DeAnna, 42, suggested her husband had been misled during the military recruiting process. She added that, after a month of service, her family had yet to receive any pay.<br>
“When he signed up and had all of that done, he was told he would not be training for two weeks and going straight to the front lines,” she said. “But it seems as though he is getting one more week of training, closer to the front lines, and then they are going to put him on the front lines.”</p>
</blockquote>
<p>It may come as a shock to Derek and his wife, but what they're experiencing right now is EXACTLY the same thing that can and does happen to immigrants (documented or undocumented) in the US and other countries. They come to a country, think it'll be better for them and their family, that their lives will improve, that they will live the American dream, and then they're forced into a shitty job, scrubbing toilets, mopping up shit, piss, and vomit in some dirty stalls for some failing local diner, or maybe a more respectable job.</p>
<p>But in both cases, the owners are greedy, dirty, racist fucking pigs that take their passports and ID away, hold them hostage this way, and perhaps even skim off from their salaries - or not even pay them for their work, forcing the immigrants to find other ways to provide food for their families.</p>
<p>This is exactly what happens when you let right-wing racists, xenophobes, and general lunatics with deeply anti-immigration views run the country or (re)write laws. Through corruption, law enforcement may also be less inclined to help and will instead be more violent towards them, creating a perpetual cycle of hopelessness. All of this could have been avoided.</p>
<p>And here they are now, in Russia. An anti-immigration policy by Putin and his cronies, a heavily right-wing, almost fully dictatorial policy and regime. This is where Derek and his family are the immigrant family moving to Russia thinking that they will escape 'the Woke™', that their lives will be so much better living as a &quot;traditional family&quot;, they will live the Russian dream, walking down the streets of Moscow, in a never-ending honeymoon. In comes the Russian military, totally, definitely, <em>certainly</em> incorruptible, with no history of mistreatment of its own staff, not paying Derek his fair share of pay for a fair day's work. You are the miserable, hopeless immigrants now. And I feel sorry, mostly for your girls and the dog (<em>although the dog, a Husky, could be much better off in Russia, especially northern parts, compared to scorching Texas</em>) than you, since they're kids and they probably had no say in the matter.</p>
<p>Oh hoh, you're <em>winning</em> so much! You're <em>winning</em>, aren't you? You're living the perfect traditional Russian dream, aren't you? God, you're so <em>winning</em> right now. Imagine how much the gender libruls are crying because you left the US! They lost, you <em>won</em>! You're so <em>winning</em>!</p>
<p>(<em>inb4 Derek flees the war zone, retreats back home to his village, and gets called a traitor or defector and either gets tortured or killed for this, or gets killed in the 'special operation'</em>)</p>
<p>That's all for this article. I need to sleep.</p>
]]></content:encoded>
					<guid>PO-250719-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Nightmare-level gooners flock to Grok (Ani), and other nonsense]]></title>
					<link>/posts/2025-07-16-Grok-Gooners.html</link>
					<description>First edition of slop, I LOVE SLOP!!!</description>
					<pubDate>Wed, 16 Jul 2025 20:17:00 GMT</pubDate>
					<content:encoded><![CDATA[<p>Based on that title and description, you'd think I might've gone insane. Who knows? With all the shit going on in the world right now, it might not be that implausible.</p>
<p>I'm exploring some ways to write more blog posts because I want to get better at it. As some might notice, I tend to ramble on or go on tangents sometimes. These 'slop'-type posts can contain these tangents and rambles, while 'proper' articles handle the cooler stuff, such as tech and whatnot.</p>
<p>Plus, these slop posts help me shit on stuff that I think is worthless or stupid, like grifts, alpha male garbage, the daily [[:elonmusk:Elon Musk]] ketamine-fueled shitshow, or [[:donaldtrump:Prisoner 47]]'s dementia-riddled thoughts, groans, and ramblings, and to test out new features such as the clickable tooltips 🙂.</p>
<p>Twitter news, first.</p>
<h3 id="gooners-splurge-%24300%2Fmo-for-grok's-3d-anime-girl-ripoff" tabindex="-1">Gooners splurge $300/mo for Grok's 3D anime girl ripoff</h3>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/slop/ami-grok.webp" alt="Grok's Ami virtual character, a 3D modelled blonde girl with twintails, dark blue eyes, wearing a skimpy bra." title="Grok's Ami virtual character, a 3D modelled blonde girl with twintails, dark blue eyes, wearing a skimpy bra.">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ami-grok.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
  </div>
</figure>
<p>The nightmare-level gooners flocked to xAI when they introduced 3D characters that use an AI voice, including Ani (very obviously based on Death Note's Misa Amane, and I eagerly await a potential lawsuit from the Death Note IP owners about this blatant ripoff). This includes a secondary, skimpy, and <a href="https://x.com/emcverse/status/1944794387575091428">see-through sheer lingerie outfit</a> through which you can see her panties and bra in an 'NSFW mode'; and a fox named Rudy. A third companion, Chad, will soon to be released, which, as of the time of writing, <a href="https://www.theverge.com/ai-artificial-intelligence/708536/elon-musk-grok-xai-ai-boyfriend">is supposed to be based on Edward Cullen</a>, a vampire in the <em>Twilight</em> series, mentally unstable and a predator, spying on Bella (the books' protagonist) while she sleeps, eavesdropping, and dictating her choice of friends. It should come as no surprise that 'Chad' is also based on Christian Grey from <em>50 Shades</em>. Basically a toxic masculine stereotype that girls are supposed to fall for — perfect for incels and the gooners looking for someone to share their sick fantasies or an AI Andrew Tate role model to look up to and ask for guidance, worship even.</p>
<p>Note that for now, these characters are only available to SuperGrok Heavy subscribers.</p>
<p>Imagine the nightmare-level gooner and cuck you have to be to pay <a href="https://techcrunch.com/2025/07/09/elon-musks-xai-launches-grok-4-alongside-a-300-monthly-subscription/">$300 per month</a> for SuperGrok Heavy just to thirst over Ani when Rule 34 is RIGHT THERE, for free (although be sure to tip the artists 🩷).</p>
<p class="medium rem1 lightgray italic"><< The content continues after these non-sponsored (and totally legit!1!!) advertisements >></p><div class="atpads-container slop" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject">
			<figure class="image-frame">
				<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/slop/ad-grok-arihorny.webp" alt="A parody ad for Grok, with the 'NSFW version' of Ani in the background, the text 'HORNY WOMEN are waiting FOR YOU on GROK', and a snapchat/Instagram story-like black caption bar with the caption reading 'SOMEONE HELP ME I'M STUCK IN THE GROK APP AAAAA' Ani has two black CENSORED bars over her skimpy panties and bra." title="A parody ad for Grok, with the 'NSFW version' of Ani in the background, the text 'HORNY WOMEN are waiting FOR YOU on GROK', and a snapchat/Instagram story-like black caption bar with the caption reading 'SOMEONE HELP ME I'M STUCK IN THE GROK APP AAAAA' Ani has two black CENSORED bars over her skimpy panties and bra." loading="lazy">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ad-grok-arihorny.webp" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a><p class="image-frame-caption rem0-75 lightgray monospace medium">A parody ad for Grok, with the 'NSFW version' of Ani in the background, the text 'HORNY WOMEN are waiting FOR YOU on GROK', and a snapchat/Instagram story-like black caption bar with the caption reading 'SOMEONE HELP ME I'M STUCK IN THE GROK APP AAAAA' Ani has two black CENSORED bars over her skimpy panties and bra.</p>
				</div>
			</figure></div>
<p>And as always, the <a href="https://x.com/xai/status/1945242190864699825">announcement post</a> about the overwhelming demand is filled with bots and bots pretending to be real people or NFTbros. But what stands out among this crowd are idiots such as <a href="https://x.com/ChainSm99011166/status/1945276348949209535/">TrueStory</a>, who thinks that xAI is orchestrating some deep state-level targeted cleanup and deletion of some shitty right-wing news and cryptobro's account because they thought that Grok's 'deep dive' into some shitty conspiracy theories was revealing too much.</p>
<p>It's funny how fuckwads like these seem to get by in their lives while being so idiotic. The dolt thinks a local IP (192.168.1.45) is some IP from Fort Meade - <a href="https://x.com/cheeky_anon/status/1945349582830895519">and thank fuck a user pointed this out to him</a>, as part of a 'shadow network code', and some 'underground structure' at 87.3, 120.1, out in the middle of nowhere, at the top of the map in Google Maps and OpenStreetMap. And I won't delve into the mind-influence tech or whatever quantum-decrypted NSA archive, because that's just…incomprehensible.</p>
<p>Then again, that's what I get for checking out Twitter once in a blue moon and thinking that anything of value could be posted by someone with a cartoon [[:andrewtate:Andrew Tate]] profile picture. Still, they do retweet interesting stuff about…</p>
<h3 id="we-have-the-epstein-list.-it's-right-on-our-desk.-actually%2C-there's-no-list.-it-was-a-lie-by-obama!" tabindex="-1">We have the Epstein List. It's right on our desk. Actually, there's no list. It was a lie by Obama!</h3>
<p>Yeah, the Epstein List is missing. Or doesn't exist. Or it was a hoax. Or whatever other lies the Orange Baron and his spineless lackeys taking turns at giving this turgid turd sloppy are spewing on Twitter, splitting their Republican base again into MAGAtards, those potentially disillusioned or deeply unhappy about this blatant lie and the list's cover-up, and super-MAGAtards, the loyalist fascists and Nazis, conspiracy wackos, and the worst of the worst.</p>
<p>It's funny to see, but also kind of sad. The user from before is thankfully not <em>that</em> idiotic and at least feels a sense of rationality by boosting content harshly criticizing the Epstein list cover-up and, surprisingly, being anti-Israel. Well, good posts in between unrelated conspiracy deep dives with [[:grok:Gork]] that nobody gives two shits about and promoting racism and anti-immigration garbage, being an anti-Semite, and boosting those Nazi comics (stonetoss, it's always stonetoss). Oh well, they get blocked either way.</p>
<p>Back to the cover-up at hand. This is the fact: the Epstein client list (a hypothetical list that Epstein might have used to blackmail prominent and wealthy individuals as part of his international sex trafficking ring) is most likely real (not to be confused with Epstein's “little black book” (one of two discovered books that had client names and phone numbers, addresses, and acquaintances, including famous film actors such as Kevin Spacey, Ralph Fiennes, and Alec Baldwin; politicians such as DJT himself, other politicians such as Bill Clinton, and businessmen, wealthy individuals such as Michael Bloomberg, etc.), which is a different yet real thing altogether), and here's a small timeline refresher if you need it:</p>
<p>During his 2024 presidential campaign, the Orange Con Man talked about releasing the Epstein files if he was elected. Lil Don(ald Trump) Jr. accused the Biden administration of withholding the list in order to protect the pedophiles during a Turning Point Action convention in June 2024. In October, serial couch-fucker JD Vance, who has managed the feat of becoming VP of the US, probably because he has horrified (or impressed?) his repub friends with his attraction to tushy furniture enough so that they wanted to push him into a position where he can avoid everyone and fuck all the couches he wants, in peace, has <em>also</em> said, <em>echoing Donny</em>, that they “need to release the Epstein list”.</p>
<p class="medium rem1 lightgray italic"><< The content continues after these non-sponsored (and totally legit!1!!) advertisements >></p><div class="atpads-container slop" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject">
			<figure class="image-frame">
				<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/slop/ad-slimfast-trump.webp" alt="A parody ad for SlimFast, a 'food replacement' product that causes diarrhea. In the background is the famous White House-posted image of Donald Trump's face on the Superman (2025) movie's poster. The tag-line reads 'SHIT YOURSELF THIN(tm)', a phrase I've shamelessly stolen from a video produced by OrdinaryThings on replacement food products that included SlimFast." title="A parody ad for SlimFast, a 'food replacement' product that causes diarrhea. In the background is the famous White House-posted image of Donald Trump's face on the Superman (2025) movie's poster. The tag-line reads 'SHIT YOURSELF THIN(tm)', a phrase I've shamelessly stolen from a video produced by OrdinaryThings on replacement food products that included SlimFast." loading="lazy">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ad-slimfast-trump.webp" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a><p class="image-frame-caption rem0-75 lightgray monospace medium">A parody ad for SlimFast, a 'food replacement' product that causes diarrhea. In the background is the famous White House-posted image of Donald Trump's face on the Superman (2025) movie's poster. The tag-line reads 'SHIT YOURSELF THIN(tm)', a phrase I've shamelessly stolen from a video produced by OrdinaryThings on replacement food products that included SlimFast.</p>
				</div>
			</figure>
			<figure class="image-frame">
				<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/slop/ad-wayfair-couchfucker.webp" alt="A parody ad for wayfair, featuring a 48-hours only way day sale. Below that is the caption 'COUCH-FUCKER APPROVED!', underneath is a couch, and in the bottom right corner is a stock image of a businessman, over which I've put JD Vance's bald edited face." title="A parody ad for wayfair, featuring a 48-hours only way day sale. Below that is the caption 'COUCH-FUCKER APPROVED!', underneath is a couch, and in the bottom right corner is a stock image of a businessman, over which I've put JD Vance's bald edited face." loading="lazy">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ad-wayfair-couchfucker.webp" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a><p class="image-frame-caption rem0-75 lightgray monospace medium">A parody ad for wayfair, featuring a 48-hours only way day sale. Below that is the caption 'COUCH-FUCKER APPROVED!', underneath is a couch, and in the bottom right corner is a stock image of a businessman, over which I've put JD Vance's bald edited face.</p>
				</div>
			</figure></div>
<p>Then, in February 2025, asked by a Fox News journalist, the US Attorney General, an up-and-coming lawyer and registered foreign agent and lobbyist for the State of Qatar (via an embassy), who was hired by the Trump administration during Trump's first impeachment proceedings, on whether the Justice Department would publish the Epstein client list, she responded, “It's sitting on my desk right now to review. That's been a directive by President Trump. I'm reviewing that&quot;, but then on July 7 the ship started to turn, when White House Press Secretary Karoline Leavitt stated that Bondi had been referring more to the overall accumulated evidence against Epstein (and not at all about the client list, specifically).</p>
<p>In a March 19 interview with Sean Spicer, former White House Press Secretary and Communications Director under President Trump in 2017, and now co-host of a daily podcast named &quot;The Morning Meeting&quot;, lawyer and law professor Alan Dershowitz stated that he knew the names of individuals on such a (client) list and some unreleased files related to Epstein, also adding that &quot;I know why they're being suppressed. I know who's suppressing them&quot;, and that he was &quot;…bound by confidentiality from a judge and cases&quot; and that he can't disclose what he knows. Alan had been part of the legal team that negotiated a non-prosecution agreement for Epstein in 2006.</p>
<p>On June 5, an absolute gem (not an emerald, though) came out from Musk's minor share in Daddy's emerald mine, during his feud with Trump, claiming that DJT is <a href="https://web.archive.org/web/20250605191644/https://x.com/elonmusk/status/1930703865801810022">in the Epstein files</a>, which is why they haven't been made public. This, of course, doesn't explicitly mention the client list, but it can be implied, considering DJT and Epstein's close relationship as seen in photos portraying the two.</p>
<p class="medium rem1 lightgray italic"><< The content continues after these non-sponsored (and totally legit!1!!) advertisements >></p><div class="atpads-container slop" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject">
			<figure class="image-frame">
				<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/slop/ad-musk-buyscam.webp" alt="A parody ad for Elon Musk being interviewed in one of his Tesla factories, being quoted 'BUY $SCAM NOW', with the quote attributing it to 'Elon Musk, while on ketamine'. He is then quoted again: '1000% ROI in 24 hours!'. This is a satirical advertisement playing on Elon's alleged ketamine use, and his occasional promotion of pump-and-dump schemes such as cryptocurrencies." title="A parody ad for Elon Musk being interviewed in one of his Tesla factories, being quoted 'BUY $SCAM NOW', with the quote attributing it to 'Elon Musk, while on ketamine'. He is then quoted again: '1000% ROI in 24 hours!'. This is a satirical advertisement playing on Elon's alleged ketamine use, and his occasional promotion of pump-and-dump schemes such as cryptocurrencies." loading="lazy">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ad-musk-buyscam.webp" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a><p class="image-frame-caption rem0-75 lightgray monospace medium">A parody ad for Elon Musk being interviewed in one of his Tesla factories, being quoted 'BUY $SCAM NOW', with the quote attributing it to 'Elon Musk, while on ketamine'. He is then quoted again: '1000% ROI in 24 hours!'. This is a satirical advertisement playing on Elon's alleged ketamine use, and his occasional promotion of pump-and-dump schemes such as cryptocurrencies.</p>
				</div>
			</figure></div>
<p>By the beginning of July, the agenda had shifted. The Epstein client list doesn't exist; it was all a hoax created by Biden, or Obama, or some other democratic predecessor. In a July 7 memo, DOJ stated that they wouldn't release any more documents related to Epstein. A video recording was released showing part of a common area within the Metropolitan Correction Center where Epstein was being held. While Wikipedia only mentions that 1 minute is missing from the footage, <a href="https://isideload.com/?q=https://www.wired.com/story/the-fbis-jeffrey-epstein-prison-video-had-nearly-3-minutes-cut-out/">metadata uncovered by Wired</a> reveals that nearly a whopping three minutes were cut from the FBI's released footage, plus <a href="https://isideload.com/?q=https://www.wired.com/story/metadata-shows-the-dojs-raw-jeffrey-epstein-prison-video-was-likely-modified/">previous information</a> revealed that the video was modified in Adobe Premiere Pro - at the time, this did not conclusively point to any evidence that the footage may have been deceptively manipulated.</p>
<p>But almost three minutes? A single minute can change everything in a prison, especially for a prolific child abuser (<em>not confirmed to be a pedophile, since there has been no publicly released psychological evaluation report indicating as such</em>) such as Jeffrey Epstein, maybe even less.</p>
<p class="medium rem1 lightgray italic"><< The content continues after these non-sponsored (and totally legit!1!!) advertisements >></p><div class="atpads-container slop" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject">
			<figure class="image-frame">
				<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/slop/ad-mypillow-epstein.webp" alt="A parody ad for MyPillow. SLEEP LIKE EPSTEIN TODAY!, with the phone number 1-800-377-8346 (numeric keypad conversion of the word 'EPSTEIN'), and Use Promo Code 2019, the year when Epstein died." title="A parody ad for MyPillow. SLEEP LIKE EPSTEIN TODAY!, with the phone number 1-800-377-8346 (numeric keypad conversion of the word 'EPSTEIN'), and Use Promo Code 2019, the year when Epstein died." loading="lazy">
				<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
				<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
				<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
				<span class="hidden" rel="schema:creator">
					<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
						<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
					</span>
				</span>
				<div class="image-frame-buttons">
					<a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/ad-mypillow-epstein.webp" title="Maximize the image">
						<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg>
					</a><p class="image-frame-caption rem0-75 lightgray monospace medium">A parody ad for MyPillow. SLEEP LIKE EPSTEIN TODAY!, with the phone number 1-800-377-8346 (numeric keypad conversion of the word 'EPSTEIN'), and Use Promo Code 2019, the year when Epstein died.</p>
				</div>
			</figure></div>
<p>Kash Patel, current director of the FBI, claims that there are zero videos on children being sexually abused on Epstein's island, days afer Pam Bondi has claimed that the FBI had thousands of hours of videos of children being sexually assaulted by Epstein and his clients.</p>
<p>Despite all of this, Democrats in the US House of Representatives have attempted to compel Pam Bondi to release all files related to Epstein by trying to force a House vote, but unfortunately all attempts have failed so far.</p>
<p>Trump's current claim is that the Epstein files are falsified documents created by the Biden administration and other political opponents. This is, again, in stark contrast to his 2024 promise during his presidential campaign that he would release all the Epstein files if elected.</p>
<p>In an act of heroism, resident puritanist hobo and prolific rearward (as a replacement for the r-word) House Speaker Mike Johnson went on camera and expressed support for Ghislaine Maxwell in testifying. He also said that he wants &quot;everything released&quot; on Epstein, just before walking on the House floor and voting to block the release of such files.</p>
<p>I think that covers two things I wanted to cover for the first slop-post. Also enjoy this voxel representation of Epstein's prison cell!</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/slop/voxel-epsteincell.webp" alt="A voxel rendition of Jeffrey Epstein's prison cell." title="A voxel rendition of Jeffrey Epstein's prison cell.">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/slop/voxel-epsteincell.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
  </div>
</figure>
<hr>
<p>In other news, I'm still hard at work on my HITMAN World of Assassination (re-)review, since there's been a bunch of content, plus the IOI showcase that I need to go over, because it does change my stance somewhat. Also writing a post detailing on how to get started using GDExtension (godot-cpp) to write games in Godot 4 using C++, and some more miscellaneous posts on grifts such as pods and whatnot.</p>
]]></content:encoded>
					<guid>PO-250716-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Tomb Raider 2013 - Campaign Review]]></title>
					<link>/posts/2025-02-10-Tomb-Raider-2013-Review.html</link>
					<description>I'm exploring games from my Steam library, and Tomb Raider happened to be the first. It's painfully generic and I don't recommend it at all.</description>
					<pubDate>Mon, 10 Feb 2025 19:35:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><strong>NOTE:</strong> Product received for free / activated at no cost due to me claiming the <em>'Tomb Raider Limited Free Promotional Package - Mar 2020'</em> package.</p>
<table>
<thead>
<tr>
<th><strong>Game</strong></th>
<th>Tomb Raider</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Developer/Publisher</strong></td>
<td>Crystal Dynamics, Eidos Montreal, Nixxes Software, Feral Interactive / Crystal Dynamics, Square Enix</td>
</tr>
<tr>
<td><strong>Release date</strong></td>
<td>5 March 2013</td>
</tr>
<tr>
<td><strong>Engine</strong></td>
<td>Foundation Engine</td>
</tr>
<tr>
<td><strong>Anti-cheat</strong></td>
<td>-</td>
</tr>
<tr>
<td><strong>DRM</strong></td>
<td>Steamworks DRM, DRM-free, EA App / Origin DRM, Mac App Store DRM</td>
</tr>
<tr>
<td><strong>Review platform</strong></td>
<td>PC (Steam)</td>
</tr>
<tr>
<td><strong>Also available on</strong></td>
<td>PC (GOG, Epic Games Store, EA App / Origin <em>formerly</em>), PlayStation 3, PlayStation 4, OS X, XBOX 360, XBOX One, NVIDIA Shield TV, Stadia (<em>formerly</em>)</td>
</tr>
<tr>
<td><strong>Price</strong></td>
<td>$15 (Standard), $20 (GOTY)</td>
</tr>
<tr>
<td><strong>Warnings about company</strong> (does not count towards Review score)</td>
<td>Cancerous microtransaction practices</td>
</tr>
<tr>
<td><strong>Review score</strong></td>
<td><strong>4/10</strong></td>
</tr>
</tbody>
</table>
<h2 id="tldr" tabindex="-1">TLDR</h2>
<p>A painfully generic reboot that's needlessly gory and brutal, questionable DLC practices and boring challenges to attain 100% completion. The story is mediocre, the environments are interesting and the parkour could have been more refined. There are more minor gripes as well. Would I recommend this? Not really, no.</p>
<p><strong>SPOILERS BEYOND THIS POINT! YOU HAVE BEEN WARNED!</strong></p>
<hr>
<p>I'll start with this: the core of the game is good. There's enough there to call Tomb Raider (2013) a compelling purchase if you like exploring every nook and cranny for ammo, scrap and XP. It has a nice skill and weapon upgrade system, which involves collecting 3 weapon parts to unlock a new 'stage' which adds 1 new possible upgrade for that weapon. The 4-weapon system (Bow, Pistol, Rifle, Shotgun) is also great, because you don't really need anything else, realistically, in most games that allow you to use firearms. You can also melee enemies after mastering some skills, including &quot;brutal&quot; takedowns and dodging.</p>
<p>But then comes (I assume) Square Enix, and shoves purchasable DLC that allows you to buy some of these weapon upgrades (animal instinct, agility skill, headshot reticle, pistol burst, pistol silencer) for $1 <em>each</em> which is boneheaded and utterly absurd. Then again, this is Square Enix we're talking about, a company so utterly miserable, greedy and abhorrent in microtransactions, that I'm surprised they aren't selling each strand of hair from Lara's head for a buck each, because I'm sure they would. This company is built on pay-to-win and nickel-and-diming players using shoddy DLC. Heck, I'd think that the board is cursed or something, so they're forced to push this DLC otherwise they'd all catch fire as if they were vampires or something.</p>
<p>The story itself is...underwhelming. It has a good skeleton with the crash on the island, all of the attempts to escape, etc., but it's all so dumb and I'm genuinely surprised that by the end Lara is still alive, considering the amount of falls, crashes and jumps in cutscenes where she might realistically have broken her limbs otherwise or something. But nah, she just magically heals or finds some medkit and all is well again until the next time this happens. Seriously, I would've half expected her to become the female version of Solid Snake, with an eye patch and/or some scars and long-term wounds on her body by the time we reach the finale of this game. Nothing really stands out as memorable, I'm sorry to say. All of the supporting characters are painfully generic and unmemorable, and any of them dying at some point does nothing for me. Heck, I expected like half of them to die by the time we reach 75% of the story. All of the bosses suck, have no personality and no time to develop. The 'big bad' Mattias is painfully stupid and the boss fight is close to non-existent.</p>
<p>Add on top of this, dreadfully boring and butt-soring challenges involving finding 5 egg nests, 5 hanging sun targets, 10 hanging skull targets, some banners to burn, 75 fucking GPS caches, dozens of artifacts and dozens more documents, and you'll wish you've uninstalled the game. It's too much crap that doesn't need to exist. Why does Lara need to find 5 egg nests? What is she going to do with so many damn eggs? Where would she put them anyway, since her player model doesn't have a bag or satchel? Why not steal a photo camera and photograph one egg nest conveniently placed in a position you couldn't miss when climbing up a waterfall, instead of throwing them on roofs and hidden nooks and crannies where the sun doesn't shine? Why bother shooting the stupid hanging targets, some of which are placed in literal corners of the map that probably the majority of people would never explore? Most of this shit, you'd have to use Instinct Mode to find them. It's unnecessary padding for a linear game that doesn't really need this. Get these out, and it's already a big improvement.</p>
<p>The gore, the brutality in this game is another major gripe for me. Gore isn't an issue personally, I've played games that would be considered gory in some aspects, but Tomb Raider is needlessly, unnecessarily gory and brutal in this regard! Every significant death scene in this game - falling in the water and hitting her head on the rocks before hitting rock bottom, getting impaled by multiple objects including traps, breakable (using the shotgun) spike traps, boss weapons, falling to her death by jumping from a too high place, getting mauled by a wolf, brutally getting shot in the face / eye / head, it's all so fucking over-the-top and unnecessary! For fuck's sake, Tomb Raider (and Lara Croft as a <em>franchise</em> altogether, I'd bet) isn't supposed to be like this! This is mainly why this game has an ESRB rating of Mature 17+. There's so much blood as well, pools of blood and skulls all over the place as if this is DOOM (2016), but on an ancient island from 3rd century Japan.</p>
<p>Character movement is alright. One problem with this is that you can't forcefully crouch. Lara will crouch only in specific situations such as when crawling or when trying to hide from enemies behind cover. Why? Why not let us crouch whenever we want? This would unlock some more combat possibilities, because close quarters combat in this game is...bad. The final boss fight, you have to keep your distance and run around in circles around the damn thing because otherwise it's a two-hit death (thank fuck they have stages, and the game saves between them). There's also the parkour, jumping, hanging from cliffs, climbing rocks, mountain sides, etc. It's clunky. You can't hold <code>W</code> + <code>D</code> and expect to jump right, Lara will jump up instead, making you miss the jump and fall to your death in some cases. Movement in certain chase sequences is also bad. You hold <code>W</code> to run forward, then a cutscene plays, then the camera switches to face Lara running towards the camera, and you have to press <code>S</code> instead.</p>
<p>The graphics are alright. This game probably runs on a potato, it's not very graphically demanding, my GTX 1650 can run this completely maxed out with no issue. 3GB RAM usage on Linux and 0.7GB VRAM (up to 1.2GB VRAM if you keep switching between graphical settings). The game outright refused to run on Linux (using the native version), so I used Proton Experimental instead, which netted some weird stuttering in some portions of the map (not due to shader compilation) that simply wouldn't go away. When launching the game, you'll see some flickering while the intro titles play out. Holding the brightness slider in the main menu settings screen will pretty much freeze everything on the screen until you let it go, including the water funnily enough. The game is incredibly dark even when using the maximum brightness setting, which means you'll squint and lean forward to look closer at what's going on the screen in portions of the game, such as forests. The game is deeply lacking saturation of any kind, it gets very quickly fatiguing and boring to play, as an effect.</p>
<p>One thing I can praise are the environments and locations themselves. They're varied and interesting. Throughout the story, Lara explores forests, a village, a shantytown, a beach, bunkers, abandoned labs, a mountain radio tower and outpost, and a Japanese temple. They all look great, given the graphics of the game.</p>
<p>The 3D menus suck ass, they're unnecessary and the mouse cursor isn't always visible or centered, so you have to wiggle your mouse across the screen to find it. You can use the arrows (<code>UP</code>, <code>DOWN</code>, <code>LEFT</code>, <code>RIGHT</code>) to navigate the menus as well, but not <code>WASD</code>, which is frustrating when using the fast travel map. You also can't hold down the keys to quickly change the selected fast travel point, you manually have to click the one you want, or keep pressing <code>LEFT</code> and <code>RIGHT</code> to find it if you don't use the mouse.</p>
<p>Some more nitpicking:</p>
<ul>
<li>the animations are jittery. In the cutscene where Lara finds her first camp, her movements are super jittery and the camera is shaky as hell. I don't know why this happens, but it's very jarring.</li>
<li>Some jumps (e.g. jumping to reach a rope to slide on) have very little leeway / very small buffer zones, so unless you press jump at the right moment, you'll most likely fall to your death.</li>
<li>This is bizarre, because Lara herself has some CRAZY homing skills to reach certain elements that are farther or moving, such as cliff edges, any ledge you can hang on, bars she uses to launch herself, etc.</li>
<li>Then, they introduce the feature where Lara can jump from one rope to another while descending, which <em>should</em> let the player experiment further with this, but the very few moments this feature even exists, the camera moves into a cinematic mode where you just have to let Lara do it herself (e.g on the beach when returning from a bunker), and pressing <code>SHIFT</code> in such cutscenes would make Lara fall to her death because of this, as you're not aware if it's a cutscene or something else.</li>
<li>There's a boss enemy on a certain ship near the end of the game portion, where you're stuck in a takedown stage where you MUST perform the takedown properly, or you'll keep repeating this sequence to no end, without being able to actually kill the boss. I've wasted 20 pistol ammo on the fucking guy before I managed to realize this.</li>
<li>Boss takedowns are utter fucking garbage. You have to wait until the moving circle actually reaches the inner circle before pressing <code>F</code>, or you'll fail the takedown - hence why in the boss mentioned above, you'll just repeat the fight over and over again without realizing this.</li>
<li>Moment-to-moment, Telltale-esque quick time event combos, takedowns SUCK. ASS! This is one of the biggest gripes I have with the core of the game. QTE events in this game are unbelievably short and sometimes you might not even have time to react, or to read the (delayed) subtitle that tells you what key to press, which will make you fail a boss, an enemy takedown, or as mentioned twice already above, endlessly repeating a boss fight.</li>
</ul>
<p>I have nothing to say about the Multiplayer mode. They infected it using Epic Online Services in the latest patch but fortunately you can roll back using the Beta tab on Steam to build 743.0. I haven't played anything in MP, and have no plans to do so anyway, since I uninstalled the game as soon as I completed it.</p>
<hr>
<p>I've 100%-ed the singleplayer, spent 16.2 hours to achieve this, and I'm dropping it in my Completed / Won't Play / Dropped category on Steam. I don't think I'll replay this again, there's no reason to. I'm genuinely surprised the amounts of good reviews this game has, and the critic reviews that are 100s and 90s across the board, while ignoring all of this shit that drag it down to a miserable 6 or 7/10. There's nothing &quot;exciting&quot;, &quot;beautifully presented&quot; (<a href="http://www.ign.com/articles/2013/02/25/tomb-raider-review-2">IGN Review</a>) of the game), there's no &quot;great characterization&quot;, nothing &quot;amazing&quot; and there's very little, and very unrealistic character development for Lara. I find it hard to believe she becomes a hardened survivor literal DAYS after arriving on the island. No one can evolve that quickly, realistically.</p>
<p>Add to that, the disparity between the cutscenes and moments that are meant to make Lara seem scared to even try and kill an enemy, and the actions of the player, where you can brutally takedown enemies, mash the pick in the head of a boss's skull, and the weapons provided (shotgun, rifle), with Lara easily wielding these weapons with very little recoil and no reaction to killing the enemies? Lara in cutscenes? Waah! Struggling to fend of an attacker, being uncomfortable holding her pistol. Lara in a gunfight? Using a shotgun in close quarters to one-shot kill an enemy with no hesitation whatsoever, and then in the final boss fight, repeatedly firing bullets from two pistols into Mattias without a care in the world. At least if the game had some kind of progress in this department, from the beginning where Lara would wield these weapons with somewhat of a care and doubt about using them, to becoming a hardened killer by the end. You can't avoid the conflict, unlike some reviewer mentioned in their review. Either way, using a bow and arrows, using the pick or weapons, you cannot progress through certain moments without killing everyone. And it's terribly absurd as well, Lara taking on an army of armored Japanese guards using a bow and arrow (I literally did that in my latest playthrough!) seems so unrealistic to me.</p>
<p>I genuinely find it hard to believe some of the critic reviews for this game aren't paid, or the reviewers simply haven't played any other game in their life beyond Pac-Man, because Tomb Raider (2013) is painfully generic and more akin to a third-person shooter than a Tomb Raider game. Heck, it's a Dollar Store version of Indiana Jones or some Uncharted game. It really is unmemorable and I'll probably forget all about this game in a matter of a few days. Don't buy it unless it's on a sale, if you really want to play.</p>
<p>The verdict? Shit game, don't bother.</p>
]]></content:encoded>
					<guid>PO-250210-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Comprehensive Android Guide]]></title>
					<link>/posts/2025-02-02-Comprehensive-Android-Guide.html</link>
					<description>A comprehensive guide with must-haves and recommendations regarding security, privacy and general usability for an Android ROM. Some of the steps require root.</description>
					<pubDate>Sun, 02 Feb 2025 18:43:00 GMT</pubDate>
					<content:encoded><![CDATA[<p>Hi! This is my comprehensive guide to setting up an Android-powered device, enhancing its privacy and security capabilities using apps or modules, any optional steps, recommendations and much more. This all comes from my decade of experience of using Android.</p>
<h3 id="prerequisites" tabindex="-1">Prerequisites</h3>
<ul>
<li>This guide assumes you know how to use a computer running Windows and/or Linux</li>
<li>This guide assumes you know how to use tools such as ADB, and to run commands from the Windows Command Prompt or Linux terminal of your choice</li>
<li>This guide assumes you already have <a href="https://developer.android.com/studio/releases/platform-tools#downloads">Android Platform Tools</a> (which includes the <code>adb</code> and <code>fastboot</code> binaries required for flashing a custom recovery in later steps) installed on your computer</li>
<li>This guide assumes you already have the Android USB Driver (generic or device/OEM-specific) installed on your computer</li>
</ul>
<h3 id="notes" tabindex="-1">Notes</h3>
<ul>
<li>This guide is based on Android 16 and will be updated each time a new version of Android is released. Not all features may be available on older versions.</li>
<li>This guide uses Samsung and Xiaomi steps for custom ROM, custom recovery, kernel and root installation procedures. Please consult other guides that can be found on XDA for other recommended manufacturers / brands.</li>
<li>This guide covers Samsung despite not meeting one requirement from the 'Choosing an Android device' section, because Samsung custom ROMs do not support file-based encryption (FBE).</li>
</ul>
<h3 id="warnings" tabindex="-1">Warnings</h3>
<ul>
<li>This guide minimizes your privacy footprint when using Google Play Services or microG on your device. You can remove them / not install them if you're using a GAPPS-free custom ROM. It's up to you. More details in the <a href="#de-googling">degoogling section</a></li>
<li>This guide doesn't cover high-risk situations, such as if you're being tracked by your government (<em>e.g. you're a whistleblower</em>). That requires much more drastic measures, and this guide simply isn't enough. You'll need a proper threat model for this.</li>
</ul>
<h3 id="choosing-an-android-device" tabindex="-1">Choosing an Android device</h3>
<p>If you haven't picked an Android device, or have trouble deciding, here are <em>my</em> deciding factors. This may differ for you.</p>
<ul>
<li>Must be at least a mid-range device in terms of overall specifications and product series / range. For Samsung, look for the Galaxy A2x-A7x, where A2x is between low and mid-range, A5x is the de-facto mid-range, and A7x is between mid-range and higher, but still not anywhere close to a flagship. For Xiaomi, choose the Redmi Note series. Google has the Pixel a series.</li>
<li>Do not buy a device that doesn't come from a globally-recognized smartphone manufacturer like Samsung, Xiaomi, OnePlus, Nothing. This means no devices from stores such as Temu, Alibaba, no devices such as Jolla, Alcatel, Allview, SHIFT, E-boda, Myria.</li>
<li>Stay away from Jolla, Volla, Murena and Purism, and other 'privacy-focused' devices. They suck in terms of specs and in general.</li>
<li>Stay away from certain Chinese-based companies like Huawei, Honor, Meizu, Infinix, IQOO, Hisense, Tecno, Lenovo. Xiaomi remains an outlier, as you will see in the next section why.</li>
<li>4GB RAM at minimum, 6-8GB RAM recommended as of 2025. 64GB of storage (ROM) at minimum, 32GB or lower may be an exception if you need to purchase a device for a specific purpose. Then you can lower your product series / range as well. The aversion to Chinese-based companies remains regardless of needs.</li>
<li>microSD support, NFC are necessary.</li>
<li>At minimum, a processor equal to the Snapdragon 678 in terms of performance and at most 11nm in terms of transistor size. Bigger transistors require and consume more power, and are more inefficient.</li>
<li>48MP camera should be the baseline, but depending on the manufacturer and device drivers, this may be reduced, but 10MP is the minimum when it comes to Samsung devices, 48MP for Xiaomi.</li>
<li>At minimum, the device (new or pre-owned / used) should at least have Android 9 or Android 11, because of Project Treble that is Android 8+.</li>
<li>The ability to unlock the bootloader is absolutely necessary. Xiaomi has an overwhelmingly shitty limitation for bootloader unlocking that requires you to create a Xiaomi (Global, or if using a CN device and living in CN, a Xiaomi CN) account, then initializing the bootloader unlock procedure through their Windows program (that does run through Wine, but you may have trouble finding the device, so a Windows 8.1 virtual machine through Virtualbox is recommended) - that, and do not purchase a Xiaomi device that uses HyperOS, it will make the bootloader unlocking process significantly more difficult. Samsung is considerably better, but Samsung has its own faults. RedMagic and ZTE are hostile and prevent bootloader unlocking. ASUS may have some hits and misses as well, so just Google your ASUS phone model + bootloader unlock to see if there are any relevant results.</li>
<li>Do not purchase the device from a carrier, under any circumstances. Some carriers enforce their own carrier networks, so you can't use other SIMs. Some carriers bloat the device with extra stuff beyond the factory-provided bloatware (region-dependent, network-dependent). Some carriers provide their own software integrations such as AT&amp;T or T-Mobile having their own over-the-air (OTA) update mechanism / screen and features. Avoid at all costs the North American or South Korean models of Samsung devices, use only Samsung devices that have been purchased in the European Union area to ensure they can have their bootloader unlocked.</li>
</ul>
<p>To note:</p>
<ul>
<li>Xiaomi limits how many devices you can unlock the bootloaders for in a 24-hour period</li>
<li>Samsung immediately and permanently disables the Knox security features when you unlock the bootloader by destroying an e-fuse. Samsung does not allow the use of the Knox security enclave by custom ROMs, which prohibits the installation of the only ROM in the next section that provides hardware security and hardening, GrapheneOS, as GOS is developed with a separate physical security processor / enclave in mind.</li>
<li>Nothing downgrades the camera capabilities on their devices with each update. This may not be intentional, but just an actual bug. Still, something to keep in mind.</li>
</ul>
<h3 id="choosing-an-android-rom" tabindex="-1">Choosing an Android ROM</h3>
<p>To save you the hassle: If you want the most secure Android ROM, choose <a href="https://grapheneos.org/">GrapheneOS</a> (shortened to GOS) with a supported Google Pixel device such as Pixel 6 or higher. Do not use a Pixel 5a or older. Non-Google devices are unsupported and there's practically no one out there that modifies or provides support for GrapheneOS on other devices. Pixel 8 and newer are strongly recommended as they offer a minimum of 7 years of support from Google, and support the memory tagging feature (more on that in a moment)</p>
<p>If you don't have a Google Pixel, choose <a href="https://lineageos.org">LineageOS</a> or <a href="https://crdroid.net/">crDroid</a> which is based on LineageOS, or just plain <a href="https://source.android.com/">AOSP</a>. There are also ArrowOS, EvolutionX and DerpFest that are alright, but I'd rather vouch for LineageOS (shortened to LOS) and crDroid.</p>
<p>If your device is not officially supported, do not fret. Thankfully, there are XDA forums or Telegram channels for tight-knit communities around specific models of phones that are widespread, such as the aforementioned Galaxy A1x-A7x range of devices, or the Redmi Note range. This includes the Redmi Note 11 that I'm currently using, and my past Galaxy A10.</p>
<p><strong>Strongly avoid one-off ROMs or other ROMs.</strong> It's not even about the risk of malware or something, but one-off ROMs may be test builds, debug builds, they may be incomplete in terms of feature-set or Android base implementation, or hardware support for the device of your choice. This means avoid risingOS, LMODroid, VoltageOS, Project Pixelage, Genesis OS, PixelOS, Project Blaze, Project Matrixx, StatiXOS, and <a href="https://xdaforums.com/t/elixiros-to-break-and-wipe-your-device.4672456/">stay the fuck away from ElixirOS</a>, because they have a hidden trigger that wipes your internal storage and microSD card storage if you attempt to bypass the payment process to gain access to paid features.</p>
<p>Strongly avoid the OEM-provided skin/ROM on Xiaomi devices, such as MIUI or HyperOS. Do note that you (most likely) will lose access to useful features such as RAM Plus (RAM+) and some other built-in goodies that work well such as the Xiaomi screen recorder, but it's just a trade-off you'll have to put up with. This doesn't apply to Samsung's OneUI, you can keep using that if you don't want to change your ROM.</p>
<p>Avoid /e/OS and CalyxOS. GrapheneOS is simply in a league of its own. If you can't use GrapheneOS, stick to LineageOS or crDroid instead of using these two 'alternatives'. /e/OS specifically has weaker privacy and security compared to GOS, plus they support insecure devices, doesn't support verified boot, and gives Google services privileged (system app) access, even through microG. /e/OS is also NOT de-Googled. This makes /e/OS deceitful in my eyes. More or less the same thing for CalyxOS. It's based on LineageOS but still reduces security, misses out on security updates, and generally doesn't actually improve much. Again, you're much better off manually hardening LineageOS through my guide instead of using something like /e/OS or CalyxOS.</p>
<p><strong>Strongly avoid ROMs that do not encrypt your internal storage!</strong> This depends on the device. For example, Galaxy A10 ROMs will most likely not encrypt your device's storage, which would allow someone using a custom recovery to just access the files right away - NOTE: This is not a 'feature' of the custom ROM, but it's simply impossible to retain an encrypted file system on a Samsung device since the File-Based Encryption implementation used by Samsung is heavily dependent on Knox. As a result, a Samsung device running a custom kernel or a custom ROM will not have an encrypted /data partition! Most, if not all Redmi Note 11 custom ROMs will encrypt the storage. All LineageOS-based ROMs including crDroid, starting with LineageOS 15 (based on Android 8) introduce the 'Trust' interface in the Settings app. You can find this under Settings &gt; Security &amp; privacy &gt; More security &amp; privacy &gt; Trust. If you see this: Encryption Enabled, then you're good to go.</p>
<p><strong>Strongly avoid ROMs that do not ship the regular Android security patches</strong>. These are very important in order to protect your device from many up-and-coming vulnerabilities.</p>
<p>Okay, so back to GrapheneOS, what does it do that's so much better than anything else?</p>
<ul>
<li>GrapheneOS is based on AOSP, and builds up / improves on top of this stable base</li>
<li>GrapeheneOS has historically contributed (upstreamed) a lot to the AOSP project regarding security, so they have a proven track record of reliability</li>
<li>GrapheneOS offers attack surface reduction features such as disabling by default features like NFC, Bluetooth, UWB, or when the screen is locked, the USB-C, microUSB port, pogo pins, camera. This can prevent simple attacks such as malicious devices disguised as chargers from accessing your phone's internal storage, or someone using your device camera from the lock screen (through a lock screen shortcut). By default, the charging port of a GrapheneOS-powered device prohibits data transfers when the device is locked, both at hardware and kernel level. This is in contrast to regular AOSP and most likely other OEMs, where the feature (available in the Developer Settings portion of the Settings app, only blocks access at the HAL - Hardware Abstraction Layer - and OS level, but not at the actual hardware or kernel levels)</li>
<li>GrapheneOS includes a hardened memory allocator and hardened libc to protect against the common classes of vulnerabilities and memory corruption, and reducing the sensitive data lifetime in RAM, among many other things that you can read in the <a href="https://grapheneos.org/features#exploit-mitigations">Features</a> section of their website</li>
<li>scoped storage and contacts, which can allow you to selectively share specific contacts and files with apps, instead of allowing full access like on every other Android ROM or Android-based OS.</li>
<li>sandboxed Google Play that can be optionally installed</li>
<li>doesn't include or use Google services by default</li>
<li>duress PIN/Password</li>
<li>improved user profiles that provides better, more private separation of data</li>
<li>the Vanadium browser based on Chromium, that's the most comprehensive and hardened browser on Android. Other browsers do borrow features, but cannot borrow specific features that make use of GrapheneOS' hardware-based additions, such as hardware memory tagging or enabling hybrid post-quantum cryptography</li>
<li>and much, much more.</li>
</ul>
<p>Do keep in mind that through this guide I will try to improve the security and privacy of a ROM based on LineageOS, a custom build of crDroid 11 based on Android 15 that's developed to support the Redmi Note 11 specifically.</p>
<h3 id="installing" tabindex="-1">Installing</h3>
<h4 id="for-grapheneos" tabindex="-1">For GrapheneOS</h4>
<p>Just use the <a href="https://grapheneos.org/install/web">WebUSB-based installer</a> or follow the <a href="https://grapheneos.org/install/cli">command-line installation guide</a> instead. Both are straight-forward and should be simple enough to understand.</p>
<h4 id="for-any-other-rom" tabindex="-1">For any other ROM</h4>
<p>Here's a general guide that should apply to most devices. This guide assumes you haven't unlocked the bootloader, haven't flashed a custom recovery, haven't flashed a custom ROM and/or haven't flashed a custom kernel or rooted your device. Additionally, when it comes to installing the custom ROM, the guide assumes you do not set up the device in this section. Refer to the next main section to set up your device.</p>
<h5 id="unlock-your-device's-bootloader" tabindex="-1">Unlock your device's bootloader</h5>
<p>NOTES:</p>
<ul>
<li>
<p>Unlocking the bootloader will wipe all data from the internal storage of the device, so it's basically performing a factory reset procedure. This happens whenever you lock or unlock the bootloader.</p>
</li>
<li>
<p>Unless you're running GrapheneOS, DO NOT, under any circumstance, lock your bootloader again if you are installing ANY custom ROM. Locking the bootloader with a custom ROM installed will (most likely) permanently brick your device, as most phone manufacturers do not support this feature for anything other than their own OEM-provided skin / ROM / OS.</p>
</li>
<li>
<p>For Samsung devices: after you unlock the bootloader, you're passing the point of no return. You will not be able to access again features dependent on Samsung Knox, such as potential Galaxy AI features, the Samsung Knox apps suite and features, you will lose the ability to download and install over-the-air (OTA) updates from the device, requiring a manual flash of the update through the Download Mode. There is NO ability that can restore Knox. If you see any service that claims to restore Knox, know that it's an utter scam. The only way to regain access to Knox is by replacing the motherboard of your phone.</p>
</li>
<li>
<p>For most phone manufacturers, including Xiaomi and Samsung, unlocking your bootloader permanently voids your warranty, and the repair service can easily figure out if you have unlocked the bootloader or not, through a very wide variety of detection features provided by the Android system or their own software. There's no reliable way to hide that your device has an unlocked bootloader.</p>
</li>
<li>
<p><strong>If using Xiaomi</strong> and running <strong>MIUI</strong> (NOT HyperOS!), the <a href="https://en.miui.com/unlock/download_en.html">english MIUI website</a> provides a simple solution, but they don't mention some stuff on the page:</p>
<ol>
<li>Create a Xiaomi account. This is <strong>necessary</strong> for the bootloader unlock procedure to work!</li>
<li>Enable the Developer Settings, by pressing 7 times on the build number on the About phone page.</li>
<li>Navigate to the Developer Settings, toggle on the <code>OEM unlocking</code> option. Then, tap on <code>Mi Unlock status</code>. You'll need to log in with the Xiaomi account you've created on your phone. You need a valid SIM card, and you'll need to enable mobile data, and disable Wi-Fi. You will need to add a phone number to your Xiaomi account as well. All of these are necessary in order to unlock the bootloader on a Xiaomi device.</li>
<li>Download the Mi Unlock program, run it on Windows 8.1 or higher (does not matter if you have Windows installed on bare metal or through a virtual machine), and log in with the same Xiaomi account that you've used to log in on your device.</li>
<li>Shut down your phone manually, then after it's been shut down, hold at the same time the Volume Down key and the Power button for roughly 7 seconds to enter the Fastboot mode</li>
<li>Connect your phone to the PC where Mi Unlock is running using a USB cable and click &quot;Unlock&quot;.</li>
<li>At this point, if you haven't done this before, Xiaomi will not unlock the device. Instead, it will show you a waiting period of roughly 168 hours (a week) or so before you can unlock your device. Do NOT perform the unlock procedure until at least one day after the mentioned period has passed, as the period is most likely using CN time, so one more day will account for the timezone difference. If the alotted period + 1 day has passed, you can connect your device to the PC and click &quot;Unlock&quot; again, it should work now. Do NOT click the &quot;Unlock&quot; button multiple times, as that may increase the waiting period to somewhere between 2 and 4 weeks, depending on how much you keep pressing the button.</li>
</ol>
</li>
<li>
<p><strong>If using Samsung</strong>, the process is very straightforward thankfully. MAKE SURE that the Samsung device you have bought is from any country in the European Union. North American and South Korean models do not have the ability of having their bootloader unlocked.</p>
<ol>
<li>Connect to the Internet after setting up the device.</li>
<li>Open the Settings app, scroll all the way down to About Device, and tap on Software information. Scroll (if needed) down, and tap on the Build number seven times. If you have a screen lock method such as a PIN or Password, you will be prompted to enter it after the seventh tap.</li>
<li>This has now enabled the Developer Settings menu. Navigate back to the home screen of the Settings app by tapping Back twice, then scroll down until you reach below the About Device section, where the Developer Settings is situated (Android 9+)</li>
<li>You should see a 'OEM unlocking' option in the Developer Settings, right below 'Enable Bluetooth HCI snoop log' and above 'Running services'. Toggle on this feature. You'll get some pop-ups and may be required to re-enter your PIN or password if you have a screen lock option.</li>
<li>Turn off the phone manually, then after it's been shut down, hold at the same time the Volume Up and Volume Down buttons AND plug in a USB cable capable of data transfer, such as the cable that comes with the device in the box. Release the buttons when you see something on the screen.</li>
<li>You will see a new screen that warns you about installing a custom OS and whatnot. Press the Volume Up key once to proceed, which will boot into the Download Mode, specific to Samsung devices.</li>
<li>You should now be presented with a screen that asks if you want to lock or unlock your bootloader (depending on the existing state of the bootloader), press and hold Volume Up for a few seconds.</li>
<li>You will be presented with one final confirmation step, press Volume Up to proceed with the bootloader unlock operation. This will factory reset your device.</li>
<li>Once the operation has been completed, the device will automatically reboot and it will start the OEM or Android setup wizard again, just like when you have first set up the device.</li>
</ol>
</li>
</ul>
<h5 id="flash-a-recovery" tabindex="-1">Flash a recovery</h5>
<p>What is a 'recovery', you might ask? It's a built-in feature of Android-powered devices. OEM-provided recoveries usually have simple features such as the option to factory reset your device, to wipe the cache partition, and to apply updates from local storage.</p>
<p>To make everyone's life easier, we won't stick to the OEM-provided recovery, and we'll install what is called a 'custom recovery'. There are two big choices in the Android world when it comes to custom recoveries: <a href="https://twrp.me/">TWRP</a> and <a href="https://orangefox.download/">OrangeFox</a>.</p>
<p>TWRP stands for TeamWin Recovery Project, it's an open-source custom recovery fork based on the OmniROM/android_bootable_recovery GitHub repository. TWRP has an official list of supported devices <a href="https://twrp.me/Devices/">here</a>. Try to use an official TWRP release where possible.</p>
<p>OrangeFox is another open-source custom recovery project. Their device list is available on their <a href="https://orangefox.download/">download site</a>. Again, try to use an official OrangeFox release where possible.</p>
<ul>
<li>
<p><strong>If using Xiaomi</strong>, you will most likely just flash the file as-is using the <code>fastboot</code> command.</p>
<ul>
<li>
<p><strong>If you want to flash TWRP</strong></p>
<ol>
<li>Download the TWRP .zip file. Download the TWRP .img file as well. Copy the .img file to where you have platform-tools installed on your computer, or you can use its path from the commandline. Copy the .zip file to your phone's internal or external storage.</li>
<li>Reboot your phone into bootloader mode. This is usually Volume Down + Power for a few seconds.  Holding the Volume Down + Power for seven seconds will force restart the device.</li>
<li>Find your phone's name (e.g. <code>Redmi Note 11</code>), it should be on the box or you could see this in the Settings &gt; About device page. This is extremely important for the next step.</li>
<li>Search your phone name + partition or A/B on the web. You need to look for information related to your phone's <em>partition scheme</em>. Some phones use A/B, some use Virtual A/B, some have an A-only partition, etc. If you don't know what these are, oversimplified, they're one or two slots (A or A/B) that the device duplicates important partitions such as <code>system</code>, <code>vendor</code>, <code>boot</code> in order to allow successful roll-backs in case of a faulty device software update. It's important to find out precisely the partitioning scheme for your device.</li>
</ol>
<ul>
<li>If you have an <code>A-only</code> device, or a <code>Virtual A/B</code> device with a dedicated recovery partition:
<ol>
<li>Flash TWRP by running the following command: <code>fastboot flash recovery /path/to/twrp.img</code></li>
<li>Once completed, reboot into the newly installed recovery by pressing (<em>usually</em>) the Volume Up + Power buttons, or via the <code>fastboot reboot recovery</code> command.</li>
</ol>
</li>
<li>If you have an <code>A/B</code> or <code>Virtual A/B</code> device with a 'standard' <code>boot-as-recovery</code> mode:
<ol>
<li>Boot TWRP by running the following command: <code>fastboot boot /path/to/twrp.img</code>. Do NOT run this command on a device that has a dedicated recovery partition, or you will brick your device!</li>
<li>At this stage, the custom recovery is NOT installed. You're just booting into a temporary recovery.</li>
<li>Check if TWRP performs accordingly - check if the touchscreen works by navigating around, and check if partitions have been mounted successfully. Mainly, the <code>/data</code> partition. Navigate to /data/media/0/ or /data/data/ for example, and see if folders and/or files show up.</li>
<li>If so, you can flash the TWRP.zip file. Tap on the &quot;Install&quot; button from the TWRP home screen. Navigate to where the TWRP .zip file is stored, and tap on it.</li>
<li>Swipe to confirm flashing the file. This should install TWRP in both slots (slots A and B separately).</li>
<li>You can confirm this by rebooting back to recovery. From the TWRP home screen, tap on &quot;Reboot&quot;, and either tap on Shut Down and then use the key combination (Volume Up + Power) or the &quot;Reboot to recovery&quot; button to reboot into the newly installed recovery.</li>
</ol>
</li>
<li>If your ROM uses <code>vendor_boot-as-recovery</code>, do not perform any command. The process and commands for such a device may vary by device. Look for dedicated guides on flashing the recovery on your phone name if you have such a device.</li>
</ul>
</li>
<li>
<p><strong>If you want to flash OrangeFox</strong><br>
0. If you've already installed TWRP, you can just install the OrangeFox .zip file (without any wipes beforehand), and the next time you reboot to the recovery, you will have switched to OrangeFox.</p>
<ol>
<li>If you still have your stock recovery, follow these steps:</li>
<li>Download the OrangeFox .zip file, and extract its <code>recovery.img</code> file. Copy it to where you have platform-tools installed on your computer, or you can use its path from the commandline. Copy the OrangeFox .zip file to your phone's internal or external storage.</li>
<li>Reboot your phone into bootloader mode. This is usually Volume Down + Power for a few seconds. Holding the Volume Down + Power for seven seconds will force restart the device.</li>
<li>Find your phone's name (e.g. <code>Redmi Note 11</code>), it should be on the box or you could see this in the Settings &gt; About device page. This is extremely important for the next step.</li>
<li>Search your phone name + partition or A/B on the web. You need to look for information related to your phone's <em>partition scheme</em>. Some phones use A/B, some use Virtual A/B, some have an A-only partition, etc. If you don't know what these are, oversimplified, they're one or two slots (A or A/B) that the device duplicates important partitions such as <code>system</code>, <code>vendor</code>, <code>boot</code> in order to allow successful roll-backs in case of a faulty device software update. It's important to find out precisely the partitioning scheme for your device.</li>
</ol>
<ul>
<li>If you have an <code>A-only</code> device, or a <code>Virtual A/B</code> device with a dedicated recovery partition:
<ol>
<li>Flash OrangeFox by running the following command: <code>fastboot flash recovery /path/to/recovery.img</code></li>
<li>Once completed, reboot into the newly installed recovery by pressing (<em>usually</em>) the Volume Up + Power buttons, or via the <code>fastboot reboot recovery</code> command.</li>
</ol>
</li>
<li>If you have an <code>A/B</code> or <code>Virtual A/B</code> device with a 'standard' <code>boot-as-recovery</code> mode:
<ol>
<li>Boot OrangeFox by running the following command: <code>fastboot boot /path/to/recovery.img</code>. Do NOT run this command on a device that has a dedicated recovery partition, or you will brick your device!</li>
<li>At this stage, the custom recovery is NOT installed. You're just booting into a temporary recovery.</li>
<li>Now, transfer your OrangeFox .zip file over to the device (or already have it in the internal/external storage before the previous step).</li>
<li>Check if OrangeFox performs accordingly - check if the touchscreen works by navigating around, changing appearance settings, etc., and check if partitions have been mounted successfully. Mainly, the <code>/data</code> partition. Navigate to /data/media/0/ or /data/data/ for example, and see if folders and/or files show up.</li>
<li>Okay, time to actually flash OrangeFox properly. Navigate to where the OrangeFox .zip file is placed on your device, and tap on it. Select flash.</li>
<li>After installation, the device will automatically reboot into the newly installed OrangeFox. That's it!</li>
</ol>
</li>
<li>If your ROM uses <code>vendor_boot-as-recovery</code>, do not perform any command. The process and commands for such a device may vary by device. Look for dedicated guides on flashing the recovery on your phone name if you have such a device.</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>If using Samsung</strong>, you will most likely flash the recovery via <a href="https://technastic.com/odin-download-samsung-latest-all-versions/">Odin3</a>, a leaked internal Samsung firmware flashing tool designed to load and flash firmware images onto Samsung devices. There is no 'official' way to download this, but the link I provided is safe. Download the 3.14.1 or 3.14.4 release, it doesn't really matter.</p>
</li>
</ul>
<p>NOTE: There are a number of prerequisites for this. Namely, two other files need to be downloaded.</p>
<ul>
<li>File 1: VBMeta_disabled.tar, <a href="https://github.com/libxzr/vbmeta-disable-verification">open-source</a> program that patches the VBMeta partition (a partition containing metadata used for verifying the integrity of other partitions during the boot process, essentially Verified Boot) and disabling the verification flags inside. This is absolutely necessary to run a custom ROM or kernel on a Samsung device, there's no other way around it.</li>
<li>File 2: <a href="https://xdaforums.com/t/pie-10-11-system-as-root-multidisabler-disables-encryption-vaultkeeper-auto-flash-of-stock-recovery-proca-wsm-cass-etc.3919714/">multi-disabler</a> <a href="https://github.com/ianmacd/multidisabler-samsung">open-source</a> flashable script that will disable a number of features on Samsung devices that may otherwise cause issues when running a custom recovery, custom kernel and/or custom ROM. The major features that get disabled are File-Based Encryption (FBE), which would otherwise encrypt the /data partition. It is a rather unfortunate side effect that will downgrade your device's security, effectively making it unencrypted. This only happens on Samsung devices, most likely due to Samsung's FBE implementation being heavily dependent on Knox features such as the TEE (Trusted Execution Environment enclave situated in the Knox portion of the device processor) and Keymaster (a security component running in the TEE that manages, creates and deletes the cryptographic keys used for the file-based encryption). Other features that get disabled are the system recovery auto-restoration mechanism that may be triggered, which would otherwise overwrite the custom recovery and re-install the OEM-provided recovery, and process authentication, which needs to be disabled in order to run a custom kernel.</li>
</ul>
<ol>
<li>Download the .tar archive of the latest version of the recovery of your choice to the computer - TWRP (<em>twrp-version-model.img.tar</em>)or OrangeFox (<em>download the .zip file, extract the recovery's .img file, rename it to recovery.img and re-archive it using the GNU tar archive format</em>).</li>
<li>Download the multi-disabler .tar archive to your device, such as on a SD card, or to your computer (from where you can share it to your phone via USB later)</li>
<li>Boot your Samsung device into Download Mode as before (hold Volume Up and Volume Down at the same time, and insert a USB cable <strong>capable of data transfer</strong>). Accept the warning by pressing Volume Up.</li>
<li>[CRITICAL] Look in the top left corner of the screen, where there is some text. Only proceed if the text displays OEM LOCK OFF and REACTIVATION LOCK OFF. Do not proceed if any of these two values are ON!</li>
<li>If both values are off, we can proceed.</li>
<li>Launch Odin3, it should detect the device right away (make sure Odin3 is running on the computer that you plugged your Samsung device into, and that the cable is capable of data transfer).</li>
<li>In Odin, click on the Userdata button, navigate and select the VBMeta_disabled.tar file in the file manager window that shows up.</li>
<li>In Odin, click on the AP button, navigate and select the custom recovery's .tar file in the file manager window that shows up.</li>
<li>In Odin, after selecting both files, you can press on the &quot;Start&quot; button. Odin will flash both files to your device. The process will not take more than a minute usually, not even on the low-end devices.</li>
<li>The device WILL reboot after the files have been flashed. When the screen has turned off, immediately press Volume Up and Power to access the newly installed recovery.</li>
<li>In TWRP, you will be presented with a start screen, just swipe right using the '&gt;&gt;' handle button to the right. Don't select the read-only setting before doing so. In OrangeFox, you should just be presented with the home screen outright.</li>
<li>If you have the multi-disabler file on your SD card, proceed to step 12. Otherwise, send it from your computer. Both TWRP and OrangeFox enable the ADB and USB file transfer modes by default. You should be able to copy and paste the multi-disabler.tar file to your device's internal storage at this point, or to send it using the ADB command <code>adb push /path/to/multi-disabler.tar /sdcard/</code>.</li>
<li>From the TWRP home screen, select the first option on the screen, which is &quot;Install&quot;, and navigate to the multi-disabler.tar file, select it and swipe right on the button handle to flash it. From the OrangeFox home screen, just navigate to the multi-disabler.tar file, select it and tap to flash.</li>
<li>If all went well, congratulations! You now have a custom recovery, have unfortunately disabled verified boot and file-based encryption. It's the only way to run a custom ROM on a modern Samsung device.</li>
</ol>
<h5 id="flashing-a-custom-rom" tabindex="-1">Flashing a custom ROM</h5>
<p>Okay, at this stage you should have the bootloader unlocked, and should be using either TWRP or OrangeFox. Flashing a custom ROM is significantly easier with a custom recovery.</p>
<ol start="0">
<li>Remove your device's lock screen protection, such as the PIN, password or anything else you're using (recommended)</li>
<li>Download the .zip for your custom ROM. For LineageOS, <a href="https://wiki.lineageos.org/devices/">here is the officially supported download list</a>. For crDroid, <a href="https://crdroid.net/downloads">here is the download list</a> to your device (and move it to the external storage, such as an SD card, USB flash drive or to your computer, from where you'll transfer it back to your device later).</li>
<li>Boot into your custom recovery.</li>
<li>Have your custom ROM .zip file ready. If you don't have it on the device, you can use <code>adb push /path/to/customrom.zip /sdcard1/</code> (for external storage)</li>
<li>Format the /data partition, first and foremost.</li>
</ol>
<ul>
<li>From TWRP, select &quot;Wipe&quot;, then &quot;Format Data&quot; and confirm it. After the process has finished, reboot back to recovery. Go back to the TWRP home screen and &quot;Reboot&quot; &gt; &quot;Reboot to recovery&quot;.</li>
<li>From OrangeFox, select &quot;Menu&quot;, &quot;Manage partitions&quot;, &quot;Data&quot;, &quot;Format Data&quot; and confirm by typing 'yes'. Reboot back to recovery.</li>
</ul>
<ol start="5">
<li>After rebooting back to recovery, you'll need to format some partitions before installing a custom ROM.</li>
</ol>
<ul>
<li>From TWRP, select &quot;Wipe&quot;, then &quot;Advanced Wipe&quot;, and check only the boxes the custom ROM maintainer has indicated to check. Usually, this is &quot;Dalvik / ART Cache&quot;, &quot;System&quot;, &quot;Data&quot;, &quot;Internal Storage&quot;, and in rarer cases, &quot;Vendor&quot;. Do not select &quot;Vendor&quot; unless the custom ROM maintainer specifically indicates this. Swipe to wipe.</li>
<li>From OrangeFox, select &quot;Menu&quot;, &quot;Manage partitions&quot;, check &quot;Dalvik / ART Cache&quot;, &quot;System&quot;, &quot;Data&quot;, &quot;Internal Storage&quot;, and in rarer cases, &quot;Vendor&quot;. Do not select &quot;Vendor&quot; unless the custom ROM maintainer specifically indicates this. Swipe to wipe.</li>
</ul>
<ol start="6">
<li>Okay, go back to the home screen of your custom recovery. You're ready to flash the custom ROM file.</li>
</ol>
<ul>
<li>From TWRP, select &quot;Install&quot; and navigate to the custom ROM .zip file. Select it, and swipe to install.</li>
<li>From OrangeFox, navigate to the custom ROM .zip file, select it, check &quot;Reflash OrangeFox after flashing a ROM&quot; (because, in some cases, custom ROMs will install their own custom recovery). Unless stated otherwise, check this setting. Some ROMs (not LineageOS or crDroid) may not work without the custom recovery for whatever reason, in which case you'll have to keep the recovery that is installed by the ROM. Swipe to install.</li>
</ul>
<ol start="7">
<li>That's it! You can wipe the cache from the screen that shows up after the flash is complete, then reboot to the system.</li>
</ol>
<h5 id="flashing-a-kernel" tabindex="-1">Flashing a kernel</h5>
<p>You may optionally want to install a kernel, either for tweaks using apps such as EKTweaks (Eureka kernel tweaks app, Samsung-only), hKtweaks (Samsung-only), or FKM (Franco Kernel Manager, more universal and should work with most kernels), or if you want to install KernelSU. If you're installing KSU, follow this guide, and ignore the section below about Rooting your device, since you've already done it.</p>
<ol start="0">
<li>Have the custom kernel .zip in your internal storage. Reboot to recovery.</li>
<li>Simply flash the .zip file from the recovery.</li>
</ol>
<ul>
<li>From TWRP, select &quot;Install&quot; and navigate to the custom kernel .zip file. Select it, and swipe to install.</li>
<li>From OrangeFox, navigate to the custom kernel .zip file. Select it, and swipe to install.</li>
</ul>
<ol start="2">
<li>Done! Reboot to system.</li>
</ol>
<p>If the kernel includes KernelSU (usually indicated by a ksu in the file name), then the kernel has KernelSU integrated inside. You can install the KernelSU manager app on your phone. If the app doesn't detect the root, then you can re-flash the kernel again, it should work. You can re-flash the kernel as many times as you want with no downsides.</p>
<h5 id="rooting-your-device" tabindex="-1">Rooting your device</h5>
<p>There are some key differences between different root methods. KernelSU and APatch patch the kernel, which make them significantly harder to detect compared to Magisk. KernelSU requires a kernel that has been specifically patched in order to work. APatch can manually or automatically patch the <code>boot.img</code> boot image that contains the kernel. Magisk is a systemless root solution that also patches the boot image, but it doesn't alter the kernel itself. This is what makes Magisk so much more approachable and supported by many more devices compared to KernelSU (KSU) or APatch.</p>
<p><strong>Strongly avoid</strong> any rooting solution that isn't <a href="https://kernelsu.org">KernelSU</a>, <a href="https://github.com/topjohnwu/Magisk">Magisk</a> or <a href="https://github.com/bmax121/APatch">APatch</a>. I won't cover APatch installation, as I haven't used it and see no need to use it if I have KernelSU installed.</p>
<p>IF YOU ALREADY HAVE KERNELSU, DO NOT PROCEED. Skip this section, as you already have root.</p>
<p>In this section, we're installing a different root system, <a href="https://github.com/topjohnwu/Magisk">Magisk</a>. The installation is simple.</p>
<p>You can do it as per <a href="https://topjohnwu.github.io/Magisk/install.html#getting-started">the guide</a>, using the Magisk app, but that's complicated for most users.</p>
<p>OR</p>
<p>You can install Magisk from the recovery. Download the Magisk APK, rename it to .zip (or .apk.zip, doesn't matter), and have it in your phone's storage.</p>
<ol>
<li>Boot into the custom recovery.</li>
<li>Simply flash the .zip file.</li>
</ol>
<ul>
<li>From TWRP, select &quot;Install&quot; and navigate to the Magisk .zip file. Select it, and swipe to install.</li>
<li>From OrangeFox, navigate to the Magisk .zip file. Select it, and swipe to install.</li>
</ul>
<ol start="3">
<li>Done! Reboot to system. You can now install the Magisk APK file, Magisk may require you to reboot your device again via the app which would install some more things (but this pop-up doesn't always show up). If there's no pop-up and Magisk indicates that it's installed (in the Magisk section, Installed Yes means Magisk is installed), then you're good to go.</li>
</ol>
<h3 id="setting-up" tabindex="-1">Setting up</h3>
<p>So, you're on the OEM or Android setup wizard screen. Some steps may differ, some may be different depending on the operating system. But generally, the rule is this: don't connect to the Internet, continue with the offline installation experience. Don't log into a Google account, uncheck all Google checkboxes related to location, backups, data sharing, and any optional data sharing settings (such as the LineageOS or crDroid usage &amp; diagnostics). Any other personalization settings (theming, navigation, apps) are <em>up to you</em> to decide, <em>obviously</em>.</p>
<p>Then, also follow the additional setup that's found</p>
<p>This guide uses Android 15 as the base for settings that you should change. Older versions may lack some features.</p>
<p>Going through each page in the Settings app, you should do the following:</p>
<ul>
<li><strong>Network &amp; internet</strong>
<ul>
<li><strong>Internet</strong>
<ul>
<li><strong>Network preferences</strong>
<ul>
<li>disable &quot;Turn on Wi-Fi Automatically&quot;</li>
<li>set WiFi timeout to 2 minutes</li>
<li>disable &quot;Notify for public networks&quot;</li>
<li>disable &quot;Allow WEP networks&quot;</li>
</ul>
</li>
<li><strong>Saved networks</strong>
<ul>
<li>tap on network name, then disable &quot;Auto-connect&quot;. Above, in &quot;Privacy&quot;, make sure you're using a per-connection randomized MAC (or per-network randomized MAC), and disable &quot;Send device name&quot;</li>
</ul>
</li>
</ul>
</li>
<li><strong>SIMs &gt; 'SIM provider name'</strong>
<ul>
<li>Disable &quot;VoLTE&quot;</li>
<li>Disable &quot;Wi-Fi calling&quot;</li>
<li>Disable &quot;Carrier video calling&quot;</li>
</ul>
</li>
<li><strong>Hotspot</strong>
<ul>
<li>Turn on &quot;Allow clients to use VPNs&quot;, all connections will be routed through the active VPN service on your device</li>
<li><strong>Wi-Fi hotspot</strong>
<ul>
<li>Change Hotspot name to something generic</li>
<li>Change security to at least WPA2/WPA3-Personal, or WPA2/WPA3-Enterprise if the device or ROM supports it. Don't go exclusively for WPA3-Personal unless you're sure that all devices that will use your hotspot support the WPA3-Personal or WPA3-Enterprise standard.</li>
<li>Change Hotspot password to something secure, like a passphrase</li>
<li>Change &quot;Turn off hotspot automatically&quot; to 1 minute to preserve your battery life</li>
<li>In Speed &amp; compatibility, keep 2.4 GHz unless you're sure that all devices that will use your hotspot support the 5 GHz Wi-Fi frequency</li>
<li>In Connected devices, set the Limit of connected devices to something less than the default 32. I'd recommend 1 to 4 by default, increase it if you need to have more devices connected to the hotspot at once.</li>
<li>Turn on &quot;Hidden network&quot; after all devices have connected to the hotspot. This will hide the hotspot name in the list of available WLAN networks.</li>
</ul>
</li>
</ul>
</li>
<li><strong>Data Saver</strong>
<ul>
<li>Configure the list of apps you'd like to be able to use unrestricted mobile data when the data saver is turned on. The rule of thumb is to allow the browser(s) you actually use on a daily basis to be able to access unrestricted mobile data, any apps that perform file synchronization such as DAVx5 or your *DAV of choice, music streaming apps, NewPipe, the VPN and DNS apps you'll be using, and then any other apps of your choice, but I'd suggest keeping the list rather small.</li>
</ul>
</li>
<li><strong>VPN</strong>
<ul>
<li>After you install the VPN app of your choice, tap on the cogwheel and turn on the &quot;Always-on VPN&quot; and &quot;Block connections without VPN&quot; settings.</li>
</ul>
</li>
<li><strong>Private DNS</strong>
<ul>
<li>If you use a private DNS such as Cloudflare, AdGuard, Cloud9, NextDNS, or some other provider, enter the hostname after tapping the &quot;Private DNS provider hostname&quot; radio button. Otherwise, tap on the Off radio button and confirm by tapping Save.</li>
</ul>
</li>
<li>Some ROMs remove this option, however, there's a toggle for checking the Internet connection by calling Google IPs (connectivitycheck.gstatic.com). Disable this (you can always block the domain via DNS).</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_NetworkPrefs.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_NetworkPrefs.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Wifi.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Wifi.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Wifi_Privacy.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Wifi_Privacy.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_carrier.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_carrier.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_hotspottethering.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_hotspottethering.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Wifihotspot.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Wifihotspot.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN_provider.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN_provider.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<ul>
<li>
<p><strong>Connected devices</strong></p>
<ul>
<li><strong>USB</strong> (<em>option is visible when connected to a USB cable, such as when using a charger</em>)
<ul>
<li>Use USB for... set it to &quot;No data transfer&quot;, only change this when you need to.</li>
</ul>
</li>
<li>set Bluetooth timeout to 1 minute</li>
<li><strong>Connection preferences</strong>
<ul>
<li><strong>Printing</strong>
<ul>
<li>Turn off the default print spooler service.</li>
</ul>
</li>
<li>Don't link your device to a Chromebook</li>
<li>Don't use Quick Share</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>Apps</strong></p>
<ul>
<li><strong>Default apps</strong>
<ul>
<li>Caller ID &amp; spam app &gt; None</li>
<li>Digital assistant app &gt; Google or None (or other app, if you want a digital assistant app)</li>
<li>Home app &gt; usually the system-provided home launcher or third-party launchers</li>
<li>Phone app &gt; usually the system Phone app or Google Phone, I heavily recommend you do not use other phone apps</li>
<li>SMS app &gt; usually the system Messages app or Google Messages, or an open-source app like QUIK (fork of QKSMS). I heavily recommend you do not use other SMS apps, especially not if they're not open-source.</li>
<li>Wallet app &gt; None (don't use Google Wallet) or your bank's app if it allows NFC payments</li>
<li>Opening links &gt; disable Instant apps. For the list of installed apps, just disallow automatically opening links on a per-app basis with few exceptions. Exceptions include Google Play, Aurora Store, Droid-ify (or other F-Droid clients), music apps, NewPipe.</li>
</ul>
</li>
<li><strong>Cloned Apps</strong>
<ul>
<li>Clone apps if you need multiple accounts and the app doesn't allow you to manage multiple accounts.</li>
</ul>
</li>
<li><strong>Assistant</strong>
<ul>
<li>Settings for the Assistant app are available if logged in a Google account on the Google app</li>
</ul>
</li>
<li><strong>Cloud media app</strong>
<ul>
<li>If using Google Photos, tap the cogwheel and tap Allow access to Google Photos, and select the Google account, if you want to be able to select apps that are in the cloud but not on the device, if you'd like to use the photo picker for cloud photos and albums.</li>
</ul>
</li>
<li><strong>App battery usage</strong>
<ul>
<li>Restrict most apps here. This would generally improve the battery life of the device. A list of system and user apps that should or shouldn't be restricted from running in the background:
<ul>
<li>Aegis (Disable 'Allow background usage', since Aegis closes when entering the Recents pane anyway)</li>
<li>Android System Intelligence (Allow, Optimized / Disable if you don't use ASI features)</li>
<li>Android System WebView (Allow, Optimized)</li>
<li>antivirus apps and scanners such as Bitdefender Antivirus Free, Hypatia, Kaspersky, Malwarebytes (Allow, Unrestricted for real-time scanning of newly installed apps)</li>
<li>App Manager (Allow, Optimized)</li>
<li>Aurora Store (Disallow, only download and update apps when using the app)</li>
<li>password managers such as Bitwarden (Allow, Unrestricted)</li>
<li>calendar apps such as Google Calendar, Etar (Allow, Unrestricted)</li>
<li>camera apps (Disallow)</li>
<li>browsers such as Chrome, Firefox (Allow, Unrestricted)</li>
<li>alarms and time apps such as Google Clock (Allow, Optimized)</li>
<li>the home launcher of your choice (e.g. crDroid Home, Lawnchair, Launcher3, Nova Launcher) (Allow, Optimized)</li>
<li>backup and restore apps such as DataBackup (Allow, Optimized)</li>
<li>Digital Wellbeing (Allow, Optimized)</li>
<li>system file manager (Files) and file manager apps you use most commonly (Allow, Optimized)</li>
<li>keyboard apps such as Gboard, Samsung Keyboard (Allow, Unrestricted)</li>
<li>Google (Disable)</li>
<li>Google Play services (Enable, Unrestricted is set by the system, can't be changed if Google Play services is a system app)</li>
<li>Google Play Store (Disable)</li>
<li>music apps such as InnerTune, YouTube Music, Spotify (Allow, Unrestricted)</li>
<li>games (Disable)</li>
<li>KernelSU and other root manager apps (Allow, Optimized)</li>
<li>social media and communication apps including Moshidon, WhatsApp Business, Facebook Messenger, Facebook (Disable)</li>
<li>NewPipe (Allow, Unrestricted if you want background playback / Disable otherwise)</li>
<li>VPN and DNS apps (Allow, Unrestricted)</li>
<li>shopping apps such as Amazon, Nordstrom, eBay, Steam (Disallow)</li>
<li>Google Photos (Disable unless you need background photo upload &amp; sync)</li>
<li>weather apps (Disable unless you need weather notifications)</li>
<li>recorder apps such as Google Recorder, Samsung Recorder (Allow, Unrestricted)</li>
<li>Shizuku (Allow, Optimized)</li>
</ul>
</li>
</ul>
</li>
<li><strong>Special app access</strong> (<strong>do not</strong> <em>disable permissions for system apps here!</em>)
<ul>
<li><strong>All files access</strong>
<ul>
<li>Be careful with this permission. Allow very specific apps, such as the file manager of your choice (e.g ZArchiver) and the system Camera app, if it requests this permission. Disallow apps such as Aurora Store and App Manager after setting them up, since if you use Shizuku (or root), the apps won't use the Android All files access permission.</li>
</ul>
</li>
<li><strong>Device admin apps</strong>
<ul>
<li>Disable all. If using Shelter, toggle it on for both the work and base user profile. Disable Find My Device if you don't have a Google account or you don't use the feature.</li>
</ul>
</li>
<li><strong>Display over other apps</strong>
<ul>
<li>Disallow all except for Phone, Google, and apps such as Shazam.</li>
</ul>
</li>
<li><strong>Do Not Disturb access</strong>
<ul>
<li>Allow the Digital Wellbeing and Phone app, and Google Play services. System UI and Shell already have this setting toggled on and can't / shouldn't be changed. Disallow Google Services Framework and Google.</li>
</ul>
</li>
<li><strong>Media management apps</strong>
<ul>
<li>Only allow apps that should be able to modify or delete media files created with other apps without asking you. Generally, you should enable this for the Music app(s) of your choice, Google Photos and other similar apps.</li>
</ul>
</li>
<li><strong>Modify system settings</strong>
<ul>
<li>Disallow everything except for Google Play services, then go one by one and enable only for apps that actually require changing system settings, such as the Camera app, the Phone app, the Google Photos app, ProShot.</li>
</ul>
</li>
<li><strong>Notification read, reply &amp; control</strong>
<ul>
<li>Disallow everything. This would also reduce the background app usage for stuff like Android System Intelligence, Google Play services, Google, and the home launcher app you're using.</li>
</ul>
</li>
<li><strong>Change media output</strong>
<ul>
<li>There shouldn't be any apps that would request this permission yet. If there are, filter out the apps that seem suspicious.</li>
</ul>
</li>
<li><strong>Picture-in-picture</strong>
<ul>
<li>You should disallow all apps except for something like the browser(s) of your choice. Disallow this, even for Google Play services.</li>
</ul>
</li>
<li><strong>Premium SMS</strong>
<ul>
<li>There shouldn't be any apps that would request this permission. If there are, disallow them all.</li>
</ul>
</li>
<li><strong>Unrestricted mobile data</strong>
<ul>
<li>This allows apps to run in the background and use mobile data without restrictions when using the Data Saver mode. It's the same list that you've accessed before in SIMs &gt; SIM provider name &gt; Data Saver</li>
</ul>
</li>
<li><strong>Install unknown apps</strong>
<ul>
<li>Heavily filter what apps you should allow to install apps. Disallow most apps, the ones that should have this permission are Aurora Store, Chrome (or your browser(s) of choice), Droid-ify, the native Files app, and perhaps another file manager such as ZArchiver.</li>
</ul>
</li>
<li><strong>Alarms &amp; reminders</strong>
<ul>
<li>Disallow all apps that you don't want to set and schedule alarms and reminders. Allow apps such as Digital Wellbeing.</li>
</ul>
</li>
<li><strong>Usage access</strong>
<ul>
<li>Disallow all apps that you don't want to be able to access this data. Generally, you should allow apps such as Android System Intelligence, App Manager, Digital Wellbeing and the Google Play services</li>
</ul>
</li>
<li><strong>VR helper services</strong>
<ul>
<li>Disallow all apps that don't need VR. Apps that may need this are Google Cardboard and other VR games and apps.</li>
</ul>
</li>
<li><strong>Wi-Fi control</strong>
<ul>
<li>Disallow all apps. You can allow certain apps such as Camera or apps that should be able to automatically turn on Wi-Fi.</li>
</ul>
</li>
<li><strong>Screen turn-on control</strong>
<ul>
<li>Disallow all apps, this should mainly be Google Play services by default</li>
</ul>
</li>
<li><strong>Full-screen notifications</strong>
<ul>
<li>Disallow this permission for every app except for your Clock app, Phone and Google Play services.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Apps_Defaultapps.webp" alt="A screenshot of the Settings app, on its 'Default apps' page" title="A screenshot of the Settings app, on its 'Default apps' page" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Apps_Defaultapps.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A screenshot of the Settings app, on its 'Default apps' page</p>
					</div>
				</figure>
			</div></div>
<ul>
<li><strong>Notifications</strong>
<ul>
<li>App notifications &gt; Allow notifications from apps that <em>should</em> be able to send you notifications, such as the browser(s) of your choice, any social media apps you haven't restricted the background battery usage permission, antivirus apps, backup apps, music apps, NewPipe, file managers, VPN and DNS apps, weather apps and so on</li>
<li>Notification history &gt; Enable (unless your specific use case requires turning off this feature)</li>
<li>Conversations, Bubbles &gt; Allow apps to show bubbles</li>
<li>Notification read, reply &amp; control is the same list as the Apps &gt; Special app access &gt; Notification read, reply &amp; control list</li>
<li>Notifications on lock screen &gt; Hide silent conversations and notifications OR Don't show any notifications, depending on your use case</li>
<li>disable Sensitive notifications which hides the sensitive content on the lock screen or the lock screen notification panel</li>
<li>enable Notification cooldown</li>
<li><strong>Do Not Disturb</strong>
<ul>
<li>Allow specific people, apps to interrupt based on your preferences</li>
<li>Alarms &amp; other interruptions &gt; enable Alarms, Media sounds, disable Touch sounds, and enable or disable Reminders and Calendar events according to your preferences</li>
<li>Set the default schedule, which is Sleeping</li>
<li>Set the Duration for Quick Settings to Ask every time</li>
<li>Set Display options for filtered notifications to No sound from notifications</li>
</ul>
</li>
<li>turn off Flash notifications</li>
<li>Allow wireless emergency alerts, disable Test alerts. Disable wireless emergency alerts if your use case requires turning off this feature. Turn off Vibration unless you need it.</li>
<li>Disable &quot;Hide silent notifications in status bar&quot;</li>
<li>Enable &quot;Allow notification snoozing&quot;</li>
<li>Disable &quot;Notification dot on app icon&quot; unless you specifically need it</li>
<li>Disable &quot;Enhanced notifications&quot; (formerly known as Android Adaptive Notifications) unless you need suggested actions, replies and other conversation features in app notifications.</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Notifications.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Notifications.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<ul>
<li><strong>Display</strong>
<ul>
<li><strong>Lock screen</strong>
<ul>
<li>Privacy &gt; Show sensitive content only when unlocked, or Don't show notifications at all</li>
<li>Enable Show widgets on lock screen (a feature that will be expanded to mobile, hopefully)</li>
<li>Disable Add users from lock screen</li>
<li>Disable Use device controls</li>
<li>Shortcuts &gt; Camera, Flashlight or some other shortcuts from the list (or disable them altogether)</li>
<li>Disable Always show time and info</li>
<li>Disable Lift to check phone</li>
<li>Disable Wake screen for notifications</li>
</ul>
</li>
<li>Screen timeout &gt; Disable screen attention</li>
<li>Dark theme &gt; use a custom schedule that you adjust it monthly, don't use Turns on from sunset to sunrise (which uses Location)</li>
<li>Night light &gt; Turns on at custom time</li>
<li>Screen saver &gt; Off</li>
<li>Disable Tap to wake</li>
<li>Disable Tap to sleep</li>
<li>Disable Wake on plug</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Display_Lockscreen.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Display_Lockscreen.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<ul>
<li><strong>Security &amp; privacy</strong>
<ul>
<li><strong>Device unlock</strong>
<ul>
<li>Screen lock &gt; use Password, not PIN, None, Swipe or Pattern</li>
<li>Screen lock
<ul>
<li>Lock after screen timeout &gt; Immediately after timeout</li>
<li>Enable Power button instantly locks</li>
</ul>
</li>
<li>do not use biometrics such as Fingerprint or Face unlock</li>
</ul>
</li>
<li><strong>Privacy controls</strong>
<ul>
<li><strong>Permission manager</strong>
<ul>
<li><strong>Body sensors</strong>
<ul>
<li>allow only healthcare and fitness apps such as Samsung Health</li>
</ul>
</li>
<li><strong>Calendar</strong>
<ul>
<li>only allow the calendar, clock and *DAV (e.g. DAVx5)</li>
<li>disable Google, Google Photos</li>
</ul>
</li>
<li><strong>Call logs</strong>
<ul>
<li>Allow for Android System Intelligence, Google Messages, Google Phone (or system messaging, phone app)</li>
<li>Disable Google, WhatsApp Business</li>
</ul>
</li>
<li><strong>Camera</strong>
<ul>
<li>Don't allow any apps to use the camera all the time</li>
<li>Allow apps such as 2FA and password managers apps to use the camera when the app is open. The apps use the camera to be able to scan 2FA QR codes</li>
<li>Allow Android System Intelligence</li>
<li>Allow Camera apps</li>
<li>Allow the browser(s) of your choice</li>
<li>Don't allow any apps that you don't use regularly to use the camera at all, or apps that <em>don't make sense</em> to even ask for the Camera permission</li>
</ul>
</li>
<li><strong>Contacts</strong>
<ul>
<li>Allow the contacts app that you use, *DAV apps, the Phone app and optionally calendar apps</li>
<li>Deny Google, Google Play Store, Chrome, Maps, Google Photos this permission.</li>
</ul>
</li>
<li><strong>Files</strong>
<ul>
<li>Allow a few apps this permission. It's a weird permission that isn't the same as the 'All files access' permission.</li>
</ul>
</li>
<li><strong>Health Connect</strong>
<ul>
<li>Allow apps to read and write health-related permissions through the Google Health Connect app</li>
</ul>
</li>
<li><strong>Location</strong>
<ul>
<li>Deny the Google app, and most apps from being allowed to use the location permission all the time</li>
<li>Allow very, very few apps from being allowed to access your location when the app is in use, such as Organic Maps, Google Maps, the calendar app and Camera apps if you want to save location information</li>
</ul>
</li>
<li><strong>Microphone</strong>
<ul>
<li>Deny apps such as Google, Google Play Store, Maps, Steam, Google Translate, Gboard</li>
<li>Allow apps such as camera apps to use it while in use, and browsers.</li>
<li>Most apps should never allow you to use the microphone all the time, not even the system Phone or Messages apps</li>
</ul>
</li>
<li><strong>Music and audio</strong>, <strong>Photos and videos</strong>
<ul>
<li>Allow these permissions at your discretion. The permissions allow you to grant access to specific photos and videos in some scenarios.</li>
</ul>
</li>
<li><strong>Nearby devices</strong>
<ul>
<li>Deny most apps this permission. Apps that may require it for certain features (e.g. external microphones) include the system Camera app or Google Recorder</li>
</ul>
</li>
<li><strong>Notifications</strong>
<ul>
<li>Permit only the apps you need to send notifications. Tapping on the app name (not the toggle) permits you to toggle specific notification types / groups in some cases. Not all apps implement this granular feature.</li>
</ul>
</li>
<li><strong>Phone</strong>
<ul>
<li>Permit only apps such as the contacts, messages and phone apps this feature.</li>
<li>Disable Google, Android System Intelligence</li>
<li>WhatsApp and WhatsApp Business may need this in order to initiate voice or video calls</li>
</ul>
</li>
<li><strong>SMS</strong>
<ul>
<li>Deny Google, Google Play Store</li>
</ul>
</li>
<li><strong>Additional permissions</strong>
<ul>
<li><strong>Car information</strong>
<ul>
<li>Few apps built for Android Auto can use this permission</li>
</ul>
</li>
<li><strong>Shizuku</strong>
<ul>
<li>Grant Shizuku access sparingly. Use Shizuku instead of root for Aurora Store, f-droid apps such as Droid-ify, SAI, ZArchiver unless you specifically need to access root-only features in these apps</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>enable Health Connect</li>
<li>disable Camera, Microphone access by default. You can toggle them back on using quick settings toggles</li>
<li>Enable Show clipboard access</li>
<li>Disable Show passwords</li>
<li>Location access &gt; Disable use assisted GPS, disable Use Location by default</li>
</ul>
</li>
<li><strong>Private Space</strong>
<ul>
<li>private space is just like Shelter, but it's not a work profile. It's a third type of profile. Apps from the private space stop running when the private space is closed. Sharing files between the private space and regular user profile is much harder compared to Shelter. Set up private space to auto-lock when you lock the screen. Not all custom ROMs may play nice with Private Space.</li>
</ul>
</li>
<li>More security &amp; privacy
<ul>
<li>Trust (if using LineageOS, crDroid or other LineageOS-based ROM)
<ul>
<li>Ensure SELinux is enforcing</li>
<li>Ensure Android security patches for Platform and Vendor are up to date</li>
<li>Ensure Encryption is enabled</li>
<li>Set Restrict USB to Allow USB connections when unlocked, or Deny USB connections altogether</li>
<li>crDroid statistics &gt; disable Stats collection</li>
<li>SMS messages limit &gt; Always confirm</li>
<li>Enable security alerts for SELinux status and Build signature</li>
</ul>
</li>
<li>Show media on lock screen &gt; up to you if you want to disable or enable it</li>
<li>Enable Allow camera software extensions</li>
<li>Enable Personalize using app data</li>
<li>Clipboard auto-clear &gt; Enable, set timeout to 5 minutes</li>
<li>Android System Intelligence &gt; disable Customize the experience using your Google Account data, enable Keyboard Suggestions and smart replies, they're all running on the device.</li>
<li>Autofill service from Google &gt; disable</li>
<li>Usage &amp; diagnostics &gt; Disable</li>
<li>Disable Android Safe Browsing, live threat protection</li>
<li>Theft protection &gt; up to you</li>
<li>SIM lock &gt; enable Lock SIM</li>
<li>Trust agents &gt; Disable all unless you use any of them</li>
<li>App pinning &gt; Enable, enable Ask for password before unpinning</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Securityprivacy_Trust.webp" alt="A screenshot of the Settings app, on the 'Trust' page" title="A screenshot of the Settings app, on the 'Trust' page" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Securityprivacy_Trust.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A screenshot of the Settings app, on the 'Trust' page</p>
					</div>
				</figure>
			</div></div>
<ul>
<li>
<p><strong>Location</strong></p>
<ul>
<li>disable Use location, disable Use assisted GPS</li>
</ul>
</li>
<li>
<p><strong>Passwords, passkeys &amp; ccounts</strong></p>
<ul>
<li>Preferred service &gt; Change to the password manager of your choice, such as Bitwarden</li>
<li>Disable additional services &gt; Google (Google Password Manager, Google Pay, Google Wallet)</li>
<li>Enable automatically sync app data (unless your use case requires turning off this feature)</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_passwords.webp" alt="A screenshot of the Settings app, on the 'Passwords, passkeys & accounts' page" title="A screenshot of the Settings app, on the 'Passwords, passkeys & accounts' page" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_passwords.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A screenshot of the Settings app, on the 'Passwords, passkeys & accounts' page</p>
					</div>
				</figure>
			</div></div>
<ul>
<li><strong>System</strong>
<ul>
<li><strong>Gestures</strong>
<ul>
<li>Quickly open camera &gt; Off (unless you need the feature)</li>
<li>Navigation &gt; disable Hold Home for Assistant (Button navigation), Swipe to invoke assistant (Gesture navigation)</li>
<li>Disable Lift to check phone</li>
<li>Press &amp; hold power button &gt; Power menu</li>
<li>Double tap to check phone &gt; Disable</li>
</ul>
</li>
<li><strong>Users</strong>
<ul>
<li>Enable Delete guest activity</li>
<li>Disable Allow guest to make phone calls</li>
<li>Disable Add users from lock screen</li>
</ul>
</li>
<li><strong>Developer options</strong>
<ul>
<li><em>Developer options can be enabled by navigating to About phone &gt; tapping the &quot;Build number&quot; option seven times (You will be prompted to enter your screen lock password if you have a screen lock method)</em></li>
<li>Memory &gt; Disable &quot;Enable memory usage profiling&quot;</li>
<li>Disable &quot;Stay awake&quot;</li>
<li>Disable &quot;Automatic system updates&quot;</li>
<li>don't enable System UI demo mode</li>
<li>Enable Quick settings developer tiles for Sensors Off, Wireless debugging and Show taps</li>
<li>Disable &quot;USB debugging&quot; when not in use, regularly tap on &quot;Revoke USB debugging authorizations&quot;</li>
<li>Disable &quot;Wireless debugging&quot;, do not enable &quot;Rooted debugging&quot; unless you really need it</li>
<li>Do not enable &quot;Disable adb authorization timeout&quot;</li>
<li>Leave enabled the &quot;Verify bytecode of debuggable apps&quot; option</li>
<li>in Feature flags, enable &quot;settings_contextual_home&quot;</li>
<li>Leave disabled the &quot;Allow screen overlays on Settings&quot; option</li>
<li>Enable &quot;Force peak refresh rate&quot; if you have an AMOLED display and a 90Hz display, the battery hit is not noticeable at least on my Redmi Note 11</li>
<li>Enable &quot;Wireless display certification&quot;</li>
<li>Enable &quot;Enable Wi-Fi Verbose Logging&quot;</li>
<li>Enable &quot;Wi-Fi scan throttling&quot;</li>
<li>Enable &quot;Wi-Fi non-persistent MAC randomization&quot; unless you need a static MAC address for whatever reason</li>
<li>Enable &quot;Tethering hardware acceleration&quot;</li>
<li>In Default USB configuration &gt; select No data transfer</li>
<li>Enable &quot;Always show crash dialog&quot;</li>
<li>Enable &quot;Show background ANRs&quot;</li>
<li>Enable &quot;Show notification channel warnings&quot;</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="setting-up-a-vpn" tabindex="-1">Setting up a VPN</h3>
<p>In this section, we're going to set up a specific VPN app, <a href="https://www.zenz-solutions.de/openvpn-for-personaldnsfilter/">OpenVPN for personalDNSfilter</a>. It allows you to connect to a VPN that supports OpenVPN profiles. For my use case, I use ProtonVPN, which allows exporting OpenVPN configurations, while also allowing you to run via root a DNS app (<a href="https://www.zenz-solutions.de/personaldnsfilter-wp/">personalDNSfilter</a>) which acts as a local DNS server through which all connections pass through, and get filtered (blocked / allowed) based on multiple filterlists, including <a href="https://github.com/alextecplayz/filterlist">my own</a> through StreamCapture, which redirects the DNS traffic to the DNS app.</p>
<h4 id="downloading-and-installing-the-app" tabindex="-1">Downloading and installing the app</h4>
<p>So, first we install the app. OpenVPN for personalDNSfilter only has <a href="https://github.com/IngoZenz/ics-openvpn/releases/tag/0.0.3">GitHub Releases</a> from where the APK can be retrieved. It's unfortunately not on Google Play or F-Droid. I also recommend opening the Settings app, navigating to the app's page and allowing it Unrestricted mobile data usage and unrestricted battery usage, so Android doesn't kill the app.</p>
<h4 id="downloading-the-openvpn-profiles-from-the-vpn-provider" tabindex="-1">Downloading the OpenVPN profiles from the VPN provider</h4>
<p>For Proton VPN, we can download configuration files from the <a href="https://account.proton.me/u/0/vpn/OpenVpnIKEv2">Proton VPN &gt; OpenVPN / IKEv2 page</a>. At this stage, we can also retrieve (and reset, when needed) the credentials that will be used to connect to the VPN from the app - the username and password. Save these somewhere, you'll need them in a moment. Downloading OpenVPN configurations is simple and straight-forward:</p>
<ol>
<li>We select the platform - Android</li>
<li>We select the protocol - UDP</li>
<li>We download the configuration file(s) directly. They will be saved using the .ovpn file format</li>
</ol>
<h4 id="importing-the-profiles" tabindex="-1">Importing the profiles</h4>
<p>Open the newly-installed OpenVPN for pDNSf app, and tap on the 'Add Profile' (plus in a circle) icon, and tap on Import. Navigate to the .ovpn file(s) you have downloaded on your phone, and select one of them. It will be saved using the profile name that matches the filename / <code>'region'-'free/paid'-'serverID'.protonvpn.net.udp</code> format. Import any and all profiles that you have downloaded, they're all saved when you close the editor (not the app).</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/OVPN_Home.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/OVPN_Home.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<h4 id="configuring-the-profiles" tabindex="-1">Configuring the profiles</h4>
<p>In the 'Basic' tab:</p>
<ul>
<li>set Type to Username/Password, if not set already</li>
<li>set Behaviour on AUTH_FAILED to Ignore, retry to save your password</li>
<li>add the username and password in their corresponding fields</li>
</ul>
<p>In the 'IP and DNS' tab, in the DNS section:</p>
<ul>
<li>tick Override DNS Settings by Server</li>
<li>set searchDomain to blinkt.de</li>
<li>set DNS Server and Backup DNS Server to 10.10.10.10, the address that will be used by personalDNSfilter to receive the redirected DNS traffic</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/OVPN_Editing.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/OVPN_Editing.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>In the 'Allowed apps' tab, you can enable 'VPN is used for all apps but exclude selected' and you can check any apps that should bypass the VPN, if needed.</p>
<p>Don't forget in the app settings to choose a default VPN profile, if you'd want the app to automatically connect to a specific profile.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/OVPN_Sett.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/OVPN_Sett.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>If that's done, you can now use OpenVPN for personalDNSfilter. Let's set personalDNSfilter as well.</p>
<h3 id="setting-up-a-dns-(requires-root)" tabindex="-1">Setting up a DNS (requires root)</h3>
<p>Right, we've set up OpenVPN for pDNSf, which is one piece of the puzzle. That will use the Android VPN system to work as a VPN app, and does not require root. personalDNSfilter running without a local VPN does require root, however. And it's going to receive the redirected traffic from the VPN, which allows us to both monitor what traffic comes in (via the app list interface), and allow us to filter it (blacklisting, whitelisting domains and IPs) using filter lists.</p>
<h4 id="downloading-and-installing-the-app-1" tabindex="-1">Downloading and installing the app</h4>
<p>Unlike OpenVPN for pDNSf, personalDNSfilter is available on <a href="https://github.com/IngoZenz/personaldnsfilter">GitHub</a>, <a href="https://play.google.com/store/apps/details?id=dnsfilter.android">Google Play</a> and <a href="https://f-droid.org/en/packages/dnsfilter.android/">F-Droid</a>. Installation is straightforward, just like any other Android app. And just like before, to avoid Android killing the app randomly, navigate to the app's page in the Settings app, and allow it unrestricted background usage and unrestricted mobile data usage.</p>
<h4 id="configuring-personaldnsfilter" tabindex="-1">Configuring personalDNSfilter</h4>
<p>Depending on the root solution you have installed, you have to grant the app root access differently. If you have KernelSU, you need to install the KernelSU app (the KernelSU manager) and grant personalDNSfilter Superuser using the Default app profile. If you have Magisk, you can grant the app root access via the Magisk manager, or when the app requests root.</p>
<p>When you first open the app, tap on 'Advanced settings', and toggle on (enable) the following:</p>
<ul>
<li>CNAME cloaking protection (aggressive)</li>
<li>DNS proxy mode without local VPN</li>
<li>Allow only local DNS proxy requests</li>
<li>Root mode without local VPN (which should request root)</li>
<li>Prevent device sleep</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_advsett.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_advsett.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>Tap Advanced settings again to close the menu, and make sure 'Enable blocking' and 'Autostart' are enabled.</p>
<p>Then, at the top where you see DNS: [IP]::PORT::DOH {pencil icon}, tap on that and uncheck both UDP entries, otherwise personalDNSfilter will complain about it when in root mode. Tap on the checkmark to confirm.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_DNS.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_DNS.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<h4 id="starting-openvpn-for-pdnsf-and-personaldnsfilter" tabindex="-1">Starting OpenVPN for pDNSf and personalDNSfilter</h4>
<p>At this stage, you're pretty much configured and ready to go. Open the OpenVPN for pDNSf app, tap on one of the profiles (make sure the username and password are entered and valid), the app will request Android to become a VPN provider. Tap 'OK'. Then, you can navigate to the Android Settings app &gt; Network &amp; internet &gt; VPN &gt; tap on the cogwheel next to OpenVPN for pDNSf &gt; enable Always-on VPN and Block connections without VPN. You can now enjoy network filtering and tunneling!</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN_provider.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_VPN_provider.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>NOTE: When running in root mode (and not as an Android VPN provider), personalDNSfilter will not have an app whitelist / blacklist.</p>
<h4 id="additional-(optional)-configuration" tabindex="-1">Additional (optional) configuration</h4>
<h5 id="configuring-filters" tabindex="-1">Configuring filters</h5>
<p>personalDNSfilter app &gt; Advanced settings &gt; Configure filter update, where you can set the filter update interval in days (by default set to 7), and you can activate / deactivate filter lists.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_filters.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_filters.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>You can also add custom filter lists. Here's how to add mine, for example:</p>
<p>Where you see the <code>&lt;new&gt; &lt;new&gt; {pencil icon}</code> field at the bottom, tap on the pencil icon to 'Edit' the filter (which will create a new entry for it). In Category and Name, use whatever you'd like. In the URL, set the URL to <code>https://raw.githubusercontent.com/alextecplayz/filterlist/main/hosts-portmaster</code>. Check the Active box, and tap on the check mark (✓) button to save. Tap on Advanced settings to close the menu, and tap on 'RELOAD FILTER', which will re-download and build the 'master' filter index used by the app.</p>
<h5 id="configuring-additional-hosts-(blacklists%2C-whitelists%2C-custom-ip-mappings)" tabindex="-1">Configuring additional hosts (blacklists, whitelists, custom IP mappings)</h5>
<p>NOTE: This isn't supposed to fit big lists. This option is supposed to work as overruling filterlists or specific rules. Please don't shove thousands of entries here, it's not what it's for. The app performs wonderfully with ~200 entries (~100 blacklist, ~100 whitelist) on my 4GB RAM Redmi Note 11 and before that, with ~150 entries total on the 2GB RAM Galaxy A10. OpenVPN for pDNSf will use roughly 20MB of RAM, and personalDNSfilter roughly 67MB of RAM.</p>
<p>The formatting is as follows:</p>
<ul>
<li>1 host name per line per entry for blacklist, whitelist or IP forwarding</li>
<li>the <code>*</code> wildcard character can be used for host blocking, subdomains, domains and domain extensions</li>
<li>for whitelisting, use the <code>!</code> as a prefix</li>
</ul>
<p>Examples:</p>
<pre><code>blacklist.this.domain - gets blacklisted
!whitelist.me.please - gets whitelisted
&gt;forwarded.ip 192.168.100.1
</code></pre>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_blacklist.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_blacklist.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_whitelist.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_whitelist.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>Also note that personalDNSfilter allows you to filter domains from the initial list interface. When you see a domain that's blacklisted, it's going to use the color red. You can long-tap on it to whitelist it using the Remove filter option, which adds it to an automatic entries section in the additional hosts list. When you see a domain that's whitelisted / allowed, it's going to use the color green and a check mark. You can long-tap on it to blacklist it using the Add filter option.</p>
<h5 id="additional-features" tabindex="-1">Additional features</h5>
<p>The app also has a Backup and restore option (but I don't use this, I just use the DataBackup app to back up the app and its files outright, which means a seamless restore experience).</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_backup.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_backup.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>And there's the 'Edit configuration file' page, which is more or less the same stuff that you can already configure visually using toggles and such, but in text format. I'm not going to dive into that, there's not really a need if you've already performed everything in this section.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_configfile.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/pDNSf_configfile.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<h3 id="setting-up-and-using-app-manager-for-additional-tracker-blocking-and-debloating" tabindex="-1">Setting up and using App Manager for additional tracker blocking and debloating</h3>
<p>Download and install <a href="https://f-droid.org/en/packages/io.github.muntashirakon.AppManager/">App Manager</a> from F-Droid. Grant it access using your root manager. We'll disable some functionality. Tap the three dots in the top right corner, and tap Settings. Go to Appearance, &quot;Enable/disable features&quot;, and deselect Interceptor, Package Installer, Use the Internet and tap Close. Make sure in Settings &gt; Mode of operation is set to Root.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/AppMgr_features.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/AppMgr_features.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>Using App Manager, we'll debloat the system and block trackers in the apps themselves, thanks to the root mode.</p>
<h4 id="debloating" tabindex="-1">Debloating</h4>
<p>Look in the table below, and search for the package name or app name in order to find these apps. When you find the app, tap on it, and tap Freeze or Uninstall, based on my recommendation. Do NOT randomly uninstall apps instead of disabling them from the list below, as some of these might soft-lock your custom ROM, which would result in a bootloop.</p>
<div class="overflow-scroll">
<table>
  <thead>
    <tr>
      <th>App Name</th>
      <th>Package Name</th>
      <th>Description</th>
      <th>Action</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ad Privacy</td>
      <td>com.android.adserrvices.api</td>
      <td>Ad privacy settings in Google account</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Android Auto</td>
      <td>com.google.android.projection.gearhead</td>
      <td>Android Auto stub / pre-installed app</td>
      <td>Uninstall</td>
    </tr>
    <tr>
      <td>Android Switch</td>
      <td>com.google.android.apps.restore</td>
      <td>Data transfer apps between Android devices</td>
      <td>Uninstall</td>
    </tr>
    <tr>
      <td>BCR</td>
      <td>com.chiller3.bcr</td>
      <td>Basic Call Recorder app</td>
      <td>Freeze (Disable) or Uninstall</td>
    </tr>
    <tr>
      <td>Calculator</td>
      <td>com.android.calculator2</td>
      <td>Google Calculator</td>
      <td>Uninstall</td>
    </tr>
    <tr>
      <td>Calendar</td>
      <td>org.lineageos.etar</td>
      <td>Disable if you’re installing a different Calendar app</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Default Print Service</td>
      <td>com.android.bips</td>
      <td>Disable if you’re not printing</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Device Health Services</td>
      <td>com.google.android.apps.turbo</td>
      <td>“Predicts how long your battery will last based on your usage”</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Dynamic System Updates</td>
      <td>com.android.dynsystem</td>
      <td>You most likely don’t need the DSU capabilities</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Face Unlock</td>
      <td>co.aospa.sense</td>
      <td>Paranoid Android face unlock app</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>FM Radio</td>
      <td>com.caf.fmradio</td>
      <td>Just an FM radio, requires headphones to be plugged in</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Gallery</td>
      <td>com.android.gallery3d</td>
      <td>Disable or uninstall if using Google Photos or other gallery app</td>
      <td>Freeze (Disable) or Uninstall</td>
    </tr>
    <tr>
      <td>Game Space</td>
      <td>io.chaldeaprjkt.gamespace</td>
      <td>chaldeaprjkt’s Game Space <a href="https://github.com/chaldeaprjkt/packages_apps_GameSpace">alternative</a> to the proprietary Game Dashboard from Google</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>io.chaldeaprjkt.gamespace.auto _generated_rro_product__</td>
      <td>io.chaldeaprjkt.gamespace.auto_generated_rro_product__</td>
      <td>Just an auto-generated overlay to be used with Game Space</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Gmail</td>
      <td>com.google.android.gm</td>
      <td>Uninstall if you don’t need it</td>
      <td>Uninstall</td>
    </tr>
    <tr>
      <td>Google Assistant</td>
      <td>com.android.hotwordenrollment.xgoogle</td>
      <td>Disable or uninstall</td>
      <td>Freeze (Disable) or Uninstall</td>
    </tr>
    <tr>
      <td>Google Assistant</td>
      <td>com.android.hotwordenrollment.okgoogle</td>
      <td>Disable or uninstall</td>
      <td>Freeze (Disable) or Uninstall</td>
    </tr>
    <tr>
      <td>Google Location History</td>
      <td>com.google.android.gms.location.history</td>
      <td>Disable or uninstall</td>
      <td>Freeze (Disable) or Uninstall</td>
    </tr>
    <tr>
      <td>Google One Time Init</td>
      <td>com.google.android.onetimeinitializer</td>
      <td>Handles the first-time setup wizard when you turn on your phone</td>
      <td>Freeze (Disable) after completing setup</td>
    </tr>
    <tr>
      <td>Google Partner Setup</td>
      <td>com.google.android.partnersetup</td>
      <td>Its purpose is completely unknown</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Markup</td>
      <td>com.google.android.markup</td>
      <td>Built-in screenshot cropper. Had a <a href="https://en.wikipedia.org/wiki/ACropalypse">vulnerability</a> that could reveal the original (non-cropped) image.</td>
      <td>Uninstall</td>
    </tr>
    <tr>
      <td>MatLog</td>
      <td>org.omnirom.logcat</td>
      <td>Logcat viewer</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Music</td>
      <td>org.lineageos.twelve</td>
      <td>LineageOS 22 music player, disable if unused</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>OmniJaws</td>
      <td>org.omnirom.omnijaws</td>
      <td>Weather widget</td>
      <td>Freeze (Disable) or Uninstall</td>
    </tr>
    <tr>
      <td>OmniStyle</td>
      <td>org.omnirom.omnistyle</td>
      <td>crDroid app that lets you use pre-installed images at the top of the extended QS panel</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>PDF Viewer</td>
      <td>org.lineageos.camelot</td>
      <td>LineageOS 22 PDF Viewer, disable if unused</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Seedvault</td>
      <td>com.stevesoltys.seedvault</td>
      <td>Backup app for local contacts and files</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Speech Recognition and Synthesis from Google</td>
      <td>com.google.android.tts</td>
      <td>Disable if you don’t use the text-to-speech (TTS) features</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Tags</td>
      <td>com.google.android.tag</td>
      <td>Google Tag Manager, does anyone even use this for sites and apps anymore?</td>
      <td>Freeze (Disable)</td>
    </tr>
    <tr>
      <td>Terminal</td>
      <td>com.android.virtualization.terminal</td>
      <td>Cannot be used if your device does not support the Android Virtualization Framework. You’re much better off using Termux instead</td>
      <td>Freeze (Disable)</td>
    </tr>
  </tbody>
</table>
</div>
<h4 id="disabling-trackers-in-apps" tabindex="-1">Disabling trackers in apps</h4>
<p>App Manager can disable activities, services, receivers and providers of any installed app. It just so happens that trackers that are added to apps, such as Firebase, Google's App Measurement Service, the Google Play Proxy Billing Activity, Google Ads, Amazon Billing, and loads more trackers and ads can be disabled this way.</p>
<p>When you notice an app that has trackers discovered by App Manager, the package name will be brown. Tap on the app in the list, and the first 'chip' / button you'll see under the app version is '{num} trackers' in orange. Tap on this, make sure all trackers are selected, and then tap on Block. The button will turn cyan after App Manager successfully blocks the trackers.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/AppMgr_blocktrackers.webp" alt="A screenshot of the App Manager app, on the page of an app (Bitdefender Antivirus Free), and a pop-up listing all the trackers to block" title="A screenshot of the App Manager app, on the page of an app (Bitdefender Antivirus Free), and a pop-up listing all the trackers to block" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/AppMgr_blocktrackers.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A screenshot of the App Manager app, on the page of an app (Bitdefender Antivirus Free), and a pop-up listing all the trackers to block</p>
					</div>
				</figure>
			</div></div>
<h3 id="minimizing-your-footprint-in-privacy-invasive-apps" tabindex="-1">Minimizing your footprint in privacy-invasive apps</h3>
<h4 id="whatsapp%2C-whatsapp-business" tabindex="-1">WhatsApp, WhatsApp Business</h4>
<ul>
<li>In the device settings, on the app page for either of the two apps, do the following:
<ul>
<li>Turn off notifications (if you want)</li>
<li>Disallow all permissions, then allow the following permissions only:
<ul>
<li>Camera (for video calls, camera feature when sending someone an attachment)</li>
<li>Contacts (in order to message your contacts, WhatsApp will hide that contact's Last Seen if Contacts is disallowed, and will display the direct phone numbers with prefixes instead)</li>
<li>Microphone (for video and audio calls, microphone recording feature when sending someone an attachment)</li>
<li>Music and audio (to send audio files as attachments)</li>
<li>Phone (in order to initiate or pick up video or audio calls)</li>
<li>Photos and videos (to send media files as attachmens)</li>
<li>Call logs is unnecessary. Location can be used if you need to share your location. Nearby devices may be used by some niche feature.</li>
</ul>
</li>
<li>Disable background data usage (if you want)</li>
<li>Disallow background usage (if you want)</li>
<li>Disallow Picture-in-picture, Install unknown apps and Alarms &amp; reminders</li>
</ul>
</li>
<li>In the app itself:
<ul>
<li>three dots in the top right corner &gt; Settings
<ul>
<li><strong>Account</strong>
<ul>
<li>Security notifications &gt; enable &quot;Show security notifications on this device&quot;</li>
<li>Passkeys &gt; Create passkeys</li>
<li>Don't add an email address</li>
<li>Enable two-step verification, create a 6-digit PIN</li>
</ul>
</li>
<li><strong>Privacy</strong>
<ul>
<li>Last seen and online
<ul>
<li>Who can see my last seen &gt; My contacts except... (choose contacts that should not be able to see your Last seen) or Never; Who can see when I'm online &gt; Same as last seen</li>
</ul>
</li>
<li>Profile photo
<ul>
<li>My contacts except... or Never</li>
</ul>
</li>
<li>About
<ul>
<li>My contacts except... or Never</li>
</ul>
</li>
<li>Disable Read receipts if you don't need them</li>
<li>Default message timer &gt; Off, 7 days or 24 hours based on your preference</li>
<li>Groups
<ul>
<li>My contacts except... (choose contacts that should not be able to add you to groups)</li>
</ul>
</li>
<li>Live location &gt; don't grant Location permission = You aren't sharing live location in any chats</li>
<li>Calls &gt; Silence unkown callers</li>
<li>Blocked contacts &gt; block contacts or phone numbers</li>
<li>App lock &gt; Enable &quot;Unlock with biometric&quot;, set it to automatically lock immediately, and disable &quot;Show content in notifications&quot; if you've added biometric authentication. You can then remove your fingerprint, and the app will require you use your lock screen password instead, as a fallback.</li>
<li>Advanced &gt; Do not enable &quot;Block unknown account messages&quot; or &quot;Protect IP address in calls&quot;, but enable &quot;Disable link previews&quot;</li>
</ul>
</li>
<li><strong>Chats</strong>
<ul>
<li>Enable keep chats archived</li>
<li>Allow chat backup, if you do not select a Google account, it will perform a local chat backup instead. Enable end-to-end encryption for the chat backup, it's up to you to select either a password or a 64-digit encryption key. Ignore the 'Add a Google account' pop-up after creating it, because it will perform a local E2EE backup instead.</li>
</ul>
</li>
<li><strong>Storage and data</strong>
<ul>
<li>Enable &quot;Use less data for calls&quot;</li>
<li>Set up a proxy if needed</li>
<li>Set &quot;Media upload quality&quot; to HD quality</li>
<li>Set all three media auto-download settings (When using mobile data, When connected on Wi-Fi, When roaming) to No media by unchecking all four attachment types (Photos, Audio, Videos, Documents) and tapping OK.</li>
</ul>
</li>
</ul>
</li>
<li>lock sensitive chats, which will require biometrics (and the lock screen password as fallback, if biometrics are disabled after enabling &quot;Unlock with biometric&quot;).</li>
<li>you can link up to four devices using the Linked device feature</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_2FA.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_2FA.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Passkeys.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Passkeys.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_SecurityNotifs.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_SecurityNotifs.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Privacy.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Privacy.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Storage.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Storage.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Backup.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_Backup.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_E2EBackup.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/WA_E2EBackup.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<h4 id="google-photos" tabindex="-1">Google Photos</h4>
<ul>
<li>Photos settings
<ul>
<li>Privacy
<ul>
<li>Location options &gt; disable &quot;Estimate missing locations&quot;</li>
<li>Disable &quot;Face Groups&quot; and &quot;Show pets with people&quot;</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="google-phone" tabindex="-1">Google Phone</h4>
<ul>
<li>Settings
<ul>
<li>Caller ID &amp; spam &gt; disable &quot;Filter spam calls&quot; and &quot;See caller and spam ID&quot;</li>
<li>Assisted dialing &gt; turn it off (unknown how Google determines home country)</li>
<li>Caller ID announcement &gt; Announce caller ID &gt; Never</li>
<li>Flip To Silence &gt; disable &quot;Flip To Silence&quot;</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Phone.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Phone.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<h4 id="google-messages" tabindex="-1">Google Messages</h4>
<ul>
<li>Don't sign in to a Google account, or if signed in, tap on the account picture in the top right corner, expand the accounts list and select &quot;Use without an account&quot;, and then tap &quot;Sign out&quot; on the next screen.</li>
<li>Messages settings
<ul>
<li>RCS chats &gt; Disable &quot;Turn on RCS chats&quot;</li>
<li>Automatic previews &gt; Disable &quot;Only download data on Wi-Fi&quot;, &quot;Show only web link previews&quot; and &quot;Show all previews&quot;, so that Google doesn't perform any server-side scanning about the previews, using information from your chat history</li>
<li>Spam protection &gt; Toggle off &quot;Enable spam protection&quot;, so that Messages doesn't send any data to Google about your messages or spam callers</li>
<li>Help improve Messages &gt; Toggle off &quot;Improve Messages&quot;</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_RCS.webp" alt="The Google Messages app, on its 'RCS chats' page, with multiple options disabled" title="The Google Messages app, on its 'RCS chats' page, with multiple options disabled" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_RCS.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The Google Messages app, on its 'RCS chats' page, with multiple options disabled</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_previews.webp" alt="The Google Messages app, on its 'Automatic previews' page with all options disabled" title="The Google Messages app, on its 'Automatic previews' page with all options disabled" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_previews.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The Google Messages app, on its 'Automatic previews' page with all options disabled</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_spam.webp" alt="The Google Messages app, on its 'Spam protection' page" title="The Google Messages app, on its 'Spam protection' page" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_spam.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The Google Messages app, on its 'Spam protection' page</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_improve.webp" alt="The Google Messages app, on its 'Help improve Messages' page" title="The Google Messages app, on its 'Help improve Messages' page" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Messages_improve.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The Google Messages app, on its 'Help improve Messages' page</p>
					</div>
				</figure>
			</div></div>
<h4 id="gboard" tabindex="-1">Gboard</h4>
<ul>
<li>Privacy
<ul>
<li>Disable &quot;Share usage statistics&quot;</li>
<li>Disable &quot;Improve for everyone&quot;</li>
<li>Select any and all of the languages you wish to use with Gboard, Gboard will download language dictionaries to be used with the auto-correct, suggestion, spell check and glide typing</li>
<li>After that, you can navigate to the app settings in the system's Settings app, and disable network access entirely (crDroid, GrapheneOS).</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Gboard.webp" alt="A screenshot of the Gboard app, on its 'Privacy' page, displaying the options from the list in this section" title="A screenshot of the Gboard app, on its 'Privacy' page, displaying the options from the list in this section" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Gboard.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A screenshot of the Gboard app, on its 'Privacy' page, displaying the options from the list in this section</p>
					</div>
				</figure>
			</div></div>
<h4 id="google-recorder" tabindex="-1">Google Recorder</h4>
<ul>
<li>Don't log in with a Google account, or &quot;Use the app without an account&quot; from the account picker</li>
<li>Recorder settings &gt; disable Backup &amp; sync</li>
</ul>
<h4 id="google-maps" tabindex="-1">Google Maps</h4>
<ul>
<li>Turn on incognito mode if possible</li>
<li>Settings
<ul>
<li>Disable &quot;Wi-Fi only&quot;</li>
<li>Video settings &gt; Autoplay off</li>
<li>Offline maps settings &gt; Disable &quot;Auto-update offline maps&quot;, &quot;Auto-download recommended maps&quot;</li>
<li>Personal content
<ul>
<li>Disable &quot;Timeline emails&quot;, &quot;Google Photos&quot;</li>
<li>Enable &quot;Restricted profile&quot;</li>
<li>Follow the Google account footprint minimization section below to disable certain features, the changes will be reflected here if Maps displays on the Personal content page &quot;Web &amp; App Activity is off&quot; and &quot;Location is off&quot;</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Maps.webp" alt="A screenshot of the Google Maps app, on its 'Personal content' page, displaying the options from the list in this section" title="A screenshot of the Google Maps app, on its 'Personal content' page, displaying the options from the list in this section" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Maps.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A screenshot of the Google Maps app, on its 'Personal content' page, displaying the options from the list in this section</p>
					</div>
				</figure>
			</div></div>
<h4 id="play-store" tabindex="-1">Play Store</h4>
<ul>
<li>Play Protect &gt; cogwheel in the top right corner of the page, disable &quot;Improve harmful app detection&quot; and &quot;Scan apps with Play Protect&quot;</li>
</ul>
<h3 id="minimizing-your-google-account-footprint" tabindex="-1">Minimizing your Google Account footprint</h3>
<h4 id="changing-your-online-settings-on-the-google-account-web-page" tabindex="-1">Changing your online settings on the Google Account web page</h4>
<p>Visit the <a href="https://accounts.google.com">Google Account</a> page to begin. Select the account you want to use for this. This assumes you're using a desktop browser to perform the changes.</p>
<p>Back up any information you'd like before proceeding. You can download the My Activity data by navigating to &quot;Data &amp; privacy&quot; in the sidebar, click &quot;My activity&quot; and from the sidebar select &quot;Other activity&quot;. You'll find these on the page:</p>
<ul>
<li>Download your data from My Activity &gt; &quot;Download your data&quot;</li>
<li>Data shared for research &gt; &quot;Download your data&quot;<br>
Under the &quot;Data from apps and services you use&quot; section on the &quot;Data &amp; privacy&quot; page of Google Account, select &quot;Download your data&quot;</li>
</ul>
<p>From the sidebar, select &quot;Personal Info&quot;.</p>
<p>In the &quot;Basic Info&quot; section:</p>
<ul>
<li>Click on the Profile picture, tap on &quot;Visible to everyone&quot; to change the setting, and choose &quot;People you interact with&quot;. Click &quot;Save&quot;</li>
<li>Click on Birthday, uncheck &quot;Highlight birthday&quot; and then select &quot;Only you&quot; under &quot;Choose who can see your birthday&quot;. Click &quot;Save&quot;</li>
<li>Click on Gender, and select &quot;Only you&quot; under &quot;Choose who can see your gender&quot;</li>
</ul>
<p>In the &quot;Contact Info&quot; section:</p>
<ul>
<li>Tap on &quot;Emails from Google&quot; and de-select everything:
<ul>
<li>Under the Maps section:
<ul>
<li>de-select Feedback, Insights, Maps contributions, Product updates</li>
</ul>
</li>
<li>Under the Google Updates section:
<ul>
<li>de-select New device tips</li>
</ul>
</li>
<li>Under the Local Guides section:
<ul>
<li>de-select Contributions, News &amp; Product updates, Perks, Research &amp; Feedback</li>
</ul>
</li>
<li>Under the News section:
<ul>
<li>de-select Daily briefing and Tips and tricks</li>
</ul>
</li>
<li>Under the Photos section:
<ul>
<li>de-select Account reminders</li>
</ul>
</li>
<li>Under the Travel section:
<ul>
<li>de-select Flight price alerts</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>In the &quot;Your profiles&quot; section:</p>
<ul>
<li>If you have a Google Play Games profile, select it from the &quot;See profiles&quot; page. Tap on the Play Games profile, and then tap &quot;See full profile&quot; which will redirect you to the Google Play website
<ul>
<li>Here, expand the Profile and privacy section and perform the following:
<ul>
<li>Disable &quot;Let others find your profile using your email address&quot; and &quot;Receive friend invites&quot;</li>
<li>Tap on the &quot;Everyone can see your game activity&quot; pencil, and set it as &quot;Only you&quot; or &quot;Friends&quot;</li>
<li>Tap on the &quot;Games you play can automatically access your friends list&quot; and set it to &quot;No&quot;</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>In the &quot;Choose what others see&quot; section:</p>
<ul>
<li>Tap on the &quot;Go to About me&quot; button
<ul>
<li>Here, in both the &quot;About&quot; and &quot;Work &amp; education&quot; sections, set everything you can to &quot;Only you&quot; and delete any places, links, the introduction and occupation, and any other fields.</li>
</ul>
</li>
</ul>
<p>From the sidebar, select &quot;Data &amp; privacy&quot;.</p>
<p>In the &quot;History settings&quot; section:</p>
<ul>
<li>Click on &quot;Web &amp; App activity&quot;, and turn it off. Choose an auto-delete option, if applicable. De-select any subsettings. Click on &quot;Manage all Web &amp; App activity&quot; to delete any such activities</li>
<li>Click on &quot;Timeline&quot;, and turn it off. Choose an auto-delete option, if applicable. De-select any subsettings.</li>
<li>Click on &quot;YouTube History&quot; and turn it off. De-select any subsettings. Choose an auto-delete option, if applicable. Click on &quot;Manage history&quot; to view and delete the history.</li>
<li>Click on &quot;My Activity&quot;, and from the sidebar, select &quot;Other activity&quot;, this will take you to a new page, scroll to the &quot;Other activity&quot; section and go through each one of the settings, deleting and turning off everything you can:</li>
</ul>
<p>NOTE: Some pages you will navigate to will have the &quot;Delete All&quot; button, you can click that and confirm to delete all data related to that section.</p>
<ul>
<li>My Ad Center &gt; &quot;Go to My Ad Center&quot; &gt; in the center top-right corner of the page, change &quot;Personalized ads&quot; to &quot;Off&quot;</li>
<li>Google Pay experience &gt; &quot;Manage activity&quot; &gt; Personalization within Google Pay &gt; toggle to Off</li>
<li>Google Wallet passes data &gt; &quot;View and manage data for your passes&quot; &gt; Turn off &quot;Use passes across Google&quot;, uncheck &quot;Get better recommendations, results and more based on your passes in places like Maps, Calendar and Assistant&quot;, turn off &quot;Personalization within Wallet&quot;</li>
<li>Google Workspace search history &gt; &quot;Manage Google Workspace search history&quot; &gt; Google Workspace search history &gt; toggle to &quot;Off&quot;</li>
<li>Gemini Apps activity &gt; &quot;Manage activity&quot; &gt; Turn off</li>
<li>Google Photos personalization &gt; &quot;Manage Google Photos personalization&quot; &gt; turn off &quot;Activity-based personalization&quot;</li>
<li>YouTube channel subscriptions &gt; &quot;View Subscriptions&quot; &gt; click on all the 'x' for the activity you can find. This WILL delete the subscription activity AND unsubscribe you from those channels!</li>
<li>YouTube &quot;Not interested&quot; feedback &gt; Delete</li>
<li>YouTube survey answers &gt; Delete</li>
<li>Comments on YouTube &gt; &quot;View Comments&quot; &gt; click on all the 'x' for the activity you can find. This WILL delete the comment activity AND delete your comments!</li>
<li>Comment Likes and Dislikes on YouTube &gt; &quot;View Comment Likes and Dislikes&quot; &gt; click on all the 'x' for the activity you can find. This WILL delete the like/dislike activity and unlike/undislike the comments!</li>
<li>YouTube Community Posts &gt; &quot;View Community Posts&quot; &gt; click on all the 'x' for the activity you can find. This WILL delete your interactions with community posts, such as poll votes</li>
<li>YouTube live chat messages &gt; &quot;View Messages&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>YouTube likes and dislikes &gt; &quot;View Likes and Dislikes&quot; &gt; click on all the 'x' for the activity you can find. This WILL delete your like/dislike activity activity and unlike/undislike the videos!</li>
<li>YouTube Customize Your Feed Feedback &gt; Delete</li>
<li>YouTube purchase activity &gt; &quot;View activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>YouTube gift settings &gt; &quot;View gift settings&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>YouTube Playables Game Progress &gt; &quot;View Playables Game Progress&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>YouTube Playables Saved Scores &gt; &quot;View Playables Saved Scores&quot; &gt; click on all the 'x' for the saved scores you can find.</li>
<li>Feedback on content made using YouTube's AI-powered tools or features &gt; &quot;View feedback&quot; &gt; click on all the 'x' for the feedback activity you can find.</li>
<li>Hyping YouTube videos &gt; &quot;View hype activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>YouTube Sharing &gt; &quot;View Sharing Activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>YouTube other video interactions &gt; &quot;View other video interactions&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Google Word Coach &gt; Delete</li>
<li>Place Answers &gt; &quot;View Activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Your interests &amp; notifications &gt; Delete</li>
<li>News Preferences &gt; &quot;View Activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Google app podcast subscriptions &gt; &quot;View Subscriptions&quot; &gt; click on all the 'x' for the subscription activity you can find. This will unsubscribe you from those podcasts.</li>
<li>Chrome History &gt; &quot;View history&quot; &gt; click on all the 'x' for the history you can find.</li>
<li>Government Exam Quiz Activity &gt; Delete</li>
<li>Translate language selections &gt; Delete</li>
<li>Dictionary and Pronounciation search info &gt; Delete</li>
<li>Promo activity &gt; Delete</li>
<li>Product price tracking &gt; Delete</li>
<li>Google Play Books feedback &gt; &quot;View activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Play Games Activity &gt; &quot;View activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Google Play content from app developers &gt; &quot;View activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Play personalization options &gt; &quot;View options&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Place Suggested Answers feedback &gt; Delete</li>
<li>Call &amp; Message Information &gt; &quot;Visit Google Voice&quot; and &quot;Visit Google Fi&quot;</li>
<li>Purchases and reservations &gt; &quot;Manage purchases&quot; and &quot;Manage reservations&quot;</li>
<li>My Ad Center preferences (already deleted in the previous step)</li>
<li>Google Podcasts Preferences &gt; &quot;View Activity&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Google survey answers &gt; &quot;View answers&quot; &gt; click on all the 'x' for the answers you can find.</li>
<li>Data archive and sharing history &gt; &quot;View history&quot; to see the history of data archives and sharing events. This activity cannot be deleted.</li>
<li>Data shared for research &gt; Delete</li>
<li>Google Assistant routines &gt; Delete</li>
<li>Voice and Face Match enrollment &gt; &quot;View data&quot; &gt; click on &quot;Delete all enrollments&quot;</li>
<li>Crisis Response User Reports &gt; Delete</li>
<li>Assistant Memory &gt; &quot;View Memories&quot; &gt; sidebar &quot;Delete All&quot; and confirm</li>
<li>Your business information &gt; Delete</li>
<li>Google Podcasts episode queue &gt; Delete</li>
<li>“Hold for Me”, “Direct My Call” and “Call Screen” shared audio &gt; Delete</li>
<li>Requests for services &gt; Delete</li>
<li>Receipts shared with Google Opinion Rewards &gt; &quot;View Receipts&quot; &gt; cogwheel in the center top-right corner, to the right of the search bar &gt; Delete all receipts &gt; check the &quot;I understand and want to delete all&quot; box and click &quot;Delete all receipts&quot;</li>
<li>Comments on Search &gt; &quot;View Comments&quot; &gt; click on all the 'x' for the comment activity you can find.</li>
<li>Media likes and dislikes on Search &gt; &quot;See likes and dislikes&quot; &gt; click on all the 'x' for the like and dislike activity you can find.</li>
<li>Media likes and dislikes on Google TV &gt; &quot;See likes and dislikes&quot; &gt; click on all the 'x' for the like and dislike activity you can find.</li>
<li>Your ratings and reviews on Search &gt; &quot;See ratings and reviews&quot; &gt; click on all the 'x' for the activity you can find.</li>
<li>Crowdsource activity &gt; &quot;Manage activity&quot; &gt; click on all the 'x' for the activity you can find or from the &quot;Delete All&quot; button in the sidebar.</li>
<li>Portrait activity &gt; &quot;Manage activity&quot; &gt; click on all the 'x' for the activity you can find or from the &quot;Delete All&quot; button in the sidebar.</li>
<li>Generative imagery in Search &gt; &quot;See generated images&quot;</li>
<li>Speak User Account &gt; Delete</li>
<li>Turn off Search personalization. Click on &quot;Search personalization&quot;, turn it off. In the &quot;Your Search data&quot; section, click on each and remove everything you can, including unliking or unfollowing items, removing Not interested items, and adjusting your Streaming preferences by de-selecting any streaming service visible, such as Netflix and Amazon Prime.</li>
<li>Click on &quot;Linked Google services&quot; and uncheck everything, then click &quot;Next&quot; and follow the steps provided, if any.</li>
<li>&quot;Manage Google Fit privacy&quot; &gt; &quot;Export your data&quot; then &quot;Deletion options&quot;. Remove any devices connected to Fit. In &quot;Data shared with Google Assistant&quot;, disable all options. In &quot;Fit personalization options&quot;, disable all options. In &quot;Fit data permissions&quot;, disable all options.</li>
</ul>
<p>Under the &quot;Data from apps and services you use&quot; section:</p>
<ul>
<li>Apps and services &gt; click on &quot;Delete a service&quot; and choose the Google services you wish to delete</li>
<li>Third-party apps &amp; services &gt; select the services and apps you wish to remove or de-associate with your Google account</li>
</ul>
<p>From the sidebar, select &quot;Security&quot;.</p>
<p>Under the &quot;Enhanced Safe Browsing for your account&quot; section &gt; &quot;Manage Enhanced Safe Browsing&quot; and turn it off.</p>
<p>Password Manager &gt; migrate out all passwords to your password manager of choice, and delete everything from the Google Password Manager afterwards.</p>
<p>From the sidebar, select &quot;People &amp; sharing&quot;.</p>
<p>Under the &quot;Contacts&quot; section:</p>
<ul>
<li>remove any Contacts</li>
<li>turn off &quot;Contact info saved from interactions&quot;</li>
<li>turn off &quot;Contact info from your devices&quot;</li>
</ul>
<p>Turn off Location sharing. Turn off &quot;Business personalization&quot;. Turn off &quot;Shared endorsements in ads&quot;.</p>
<h4 id="changing-your-google-settings-on-the-google-account-connected-device" tabindex="-1">Changing your Google settings on the Google Account-connected device</h4>
<p>Open the device Settings app, and navigate to the bottom, and tap on 'Google'. Tap on 'All services'. We'll go section by section, just like before. There will be some overlap between this and the Google Account web page, but there are some preferences that are per-device preferences.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Googleservices.webp" alt="There is no alt text provided for this image" title="There is no title provided for this image" loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/2025/02/ComprehensiveAndroidGuide/Sett_Googleservices.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a>
					</div>
				</figure>
			</div></div>
<p>Under the &quot;Settings for Google apps&quot; section:</p>
<ul>
<li>Connected apps &gt; cogwheel icon &gt; disable Sign-in prompts, and disconnect any app(s) from the Third-party apps &amp; services page, if you don't need them</li>
<li>Google Fit
<ul>
<li>Connected apps and services is the same as Connected Apps</li>
<li>Manage data &gt; delete any data in the list</li>
</ul>
</li>
<li>Google Wallet - same as the Google Account web page</li>
<li>Play Games
<ul>
<li>Privacy &amp; Settings &gt; toggle off everything in the Privacy section, and change to Only you or Friends only for who can see your game activity, and No to games accessing your friends list automatically</li>
<li>Sign in account &gt; Change &gt; Sign out of all games &gt; Sign out</li>
</ul>
</li>
<li>Search, Assistant &amp; Voice &gt; should redirect you to the Google app's settings page</li>
</ul>
<p>Under the &quot;Connected devices &amp; sharing&quot; section:</p>
<ul>
<li>Cast options &gt; turn off Media control notifications</li>
<li>Chromebook &gt; unlink any Chromebooks connected</li>
<li>Devices &gt;</li>
<li>Quick Share &gt; use it without a Google account</li>
</ul>
<p>Under the &quot;Privacy &amp; security&quot; section:</p>
<ul>
<li>Ads &gt; Reset advertising ID, then Delete advertising ID, and make sure &quot;Enable debug logging for ads&quot; is disabled</li>
<li>Personalize using shared data &gt; disable all apps, because Google <em>may</em> save some of the data to your account for personalization, therefore it's not completely device-only data</li>
<li>Phone Number Verification &gt; disable &quot;Automatically verify phone number(s)&quot;</li>
<li>System services updates &gt; turn off Automatically install system services updates. You will miss out on the Google-provided security scans, malware protection, fraud and spam detection, parental controls and child safety features, some apps and Google Play features, and allegedly improvements to battery life, data consumption and device performance, whatever <em>that</em> means.</li>
<li>Usage &amp; diagnostics &gt; ensure it's turned off</li>
</ul>
<p>Under the &quot;Autofill &amp; passwords&quot; section:</p>
<ul>
<li>Autofill with Google &gt; make sure it's disabled. You can't enable it if you haven't selected Google as the preferred service for passwords, passkeys &amp; autofill in the device settings</li>
<li>Passkey-linked devices &gt; Clear</li>
<li>Phone number sharing &gt; disable</li>
<li>SMS verification codes &gt; disable for both the Autofill service and Default browser</li>
</ul>
<p>Under the &quot;Backup &amp; restore&quot; section:</p>
<ul>
<li>Backup &gt; make sure it's disabled. If you a screen such as &quot;Back up your device with Google One&quot; and asks you to turn it on, it means you aren't backing up your data from the device</li>
<li>Google Contacts sync &gt; Status &gt; disable Google Contacts sync, and Also sync device contacts &gt; disable it</li>
<li>Restore contacts &gt; make sure there is nothing to restore</li>
</ul>
<p>Under the &quot;Kids &amp; family&quot; section:</p>
<ul>
<li>Family group &gt; make sure you're not in a family group, or haven't created a family group. If you don't use this feature, the screen should be an onboarding screen with the text &quot;Bring your family together on Google&quot; and a button &quot;Create a family group&quot;. You can back out.</li>
<li>Parental controls &gt; if you're not using the feature, the screen should be an onboarding screen to &quot;Set up parental controls&quot;</li>
</ul>
<p>Under the &quot;Personal &amp; device safety&quot; section:</p>
<ul>
<li>Find My Device &gt; turn off &quot;Use Find My Device&quot;</li>
<li>Theft protection
<ul>
<li>make sure you're not using Identity Check. If you're not using the feature, the screen should be an onboarding screen to &quot;Set up Identity Check&quot;</li>
<li>disable Theft Detection Lock and Offline Device Lock</li>
<li>Remote Lock &gt; disable Use Remote Lock</li>
<li>Find &amp; erase your device &gt; disable Use Find My Device</li>
</ul>
</li>
<li>Unknown tracker alerts &gt; disable &quot;Allow alerts&quot; &gt; Turn off</li>
</ul>
<h3 id="de-googling" tabindex="-1">De-Googling</h3>
<p>If your ROM already comes de-googled, then you don't need to follow this step, since GMS is not installed. If your ROM does not come de-googled and you want to de-google it safely, this is how you should do it.</p>
<p><strong>DO NOT MODIFY OR REMOVE FILES FROM THE CUSTOM ROM'S SYSTEM PARTITION IF YOU DO NOT KNOW WHAT YOU ARE DOING! YOU WILL BOOT-LOOP YOUR DEVICE!</strong></p>
<p>Set up your device like usual, do not at all set up a Google account (since you won't be able to use it on your current user profile (0) anyway). Afterwards, enable adb from the developer options, and use the command <code>adb shell pm uninstall --user 0 (packagename)</code> where <code>packagename</code> is one app from this list. Do it for all of these and you should be fine.</p>
<table>
<thead>
<tr>
<th><code>packagename</code></th>
<th>App Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>com.google.android.gms</code></td>
<td>Google<br>Play<br>Services</td>
<td>The main system-level app that handles all Google apps and their integrations</td>
</tr>
<tr>
<td><code>com.google.android.gsf</code></td>
<td>Google<br>Services<br>Framework</td>
<td>While disabling GMS or uninstalling it might make some apps complain, Google Services Framework is the base that Google Play Services stands on. If GSF is uninstalled, most Google apps will not work or crash outright.</td>
</tr>
<tr>
<td><code>com.google.android.as</code></td>
<td>Android<br>System<br>Intelligence</td>
<td>It mostly won't work without GMS, and if you're low on RAM, there's no point in keeping this enabled.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.maps</code></td>
<td>Google<br>Maps</td>
<td>Google Maps will not display the in-app map tiles or any images whatsoever if you remove Play Services and GSF. You have to replace it with a different app.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>markup</code></td>
<td>Markup</td>
<td>Should work without GSF(?, untested), but you should not use it outright because of the <a href="https://en.wikipedia.org/wiki/ACropalypse">aCropalypse vulnerability</a> that was discovered back in the beginning of 2023. It was patched, but since Markup is always version 1.0 but with a different versionCode, it's unknwown which version of the app your custom ROM might have. Better to just avoid it outright and use a proper photo editing tool like PicsArt or Image Toolbox.</td>
</tr>
<tr>
<td><code>com.android.vending</code></td>
<td>Google Play Store</td>
<td>Obviously, Play Store won't work without GMS, so you'll have to replace it with a different app such as APKUpdater, Aurora Store, etc.</td>
</tr>
<tr>
<td><code>com.android.</code><br><code>adservices.api</code></td>
<td>Ad privacy</td>
<td>The Ad privacy app. I mean, if you're following this tutorial, you're most likely already blocking ads anyway, so this app which just controls if you want personalized ads or not is useless either way.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>setupwizard</code></td>
<td>Android Setup</td>
<td>Do not remove this app prior to the first setup of your phone, it might bork everything. You can safely remove it after you complete the setup, you don't even need to perform the second step once you're on your home screen and you get a notification to continue setting up your phone (which is checking for updates again, and asking you if you want to restore data). You can safely remove it once you see this notification.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.restore</code></td>
<td>Android Switch</td>
<td>Most likely depends on GMS, and won't work if you disable or uninstall GMS. You can back up and restore data using root-level apps such as DataBackup, or if your custom ROM has Snapseed integrated, Snapseed.</td>
</tr>
<tr>
<td><code>com.android.bluetooth.</code><br><code>bthelper</code></td>
<td>Bluetooth Devices Helper</td>
<td>Exclusively for AirPods support via Bluetooth. If you don't use AirPods, you can safely remove this.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>contacts</code></td>
<td>Contacts</td>
<td>The app will be blank when you open it, and won't work without GMS and GSF as of version 4.68 and higher.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.adm</code></td>
<td>Find Hub</td>
<td>Will crash on launch without GSF and GMS. There's no web replacement for this, because the web Find My Device page only shows your devices, but not ones that are sharing their location with you (e.g via other Google accounts)</td>
</tr>
<tr>
<td><code>com.android.</code><br><code>hotwordenrollment.</code><br><code>okgoogle</code></td>
<td>Google Assistant</td>
<td>Mostly entrypoints for Google Assistant which runs via the Google app. Not only won't Google Assistant work without GMS, but it's being replaced by Google Gemini anyway, so there's no point in using it anymore.</td>
</tr>
<tr>
<td><code>com.android.</code><br><code>hotwordenrollment.</code><br><code>xgoogle</code></td>
<td>Google Assistant</td>
<td>Mostly entrypoints for Google Assistant which runs via the Google app. Not only won't Google Assistant work without GMS, but it's being replaced by Google Gemini anyway, so there's no point in using it anymore.</td>
</tr>
<tr>
<td><code>com.google.android.gms.</code><br><code>location.history</code></td>
<td>Google Location History</td>
<td>Won't work without GMS and GSF anyway.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>onetimeinitializer</code></td>
<td>Google One Time Init</td>
<td>Only remove this after the initial phone setup, otherwise some things might be borked.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>partnersetup</code></td>
<td>Google Partner Setup</td>
<td>Won't work without GMS and GSF anyway.</td>
</tr>
<tr>
<td><code>com.google.android.pcs</code></td>
<td>Pixel Core Services</td>
<td>I assume this is more on-device AI stuff, maybe?</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.pixel.agent</code></td>
<td>Pixel Screenshots</td>
<td>Probably works without GMS and GSF and is just a glorified screenshot gallery, since AI features won't work if you're not on a Google Pixel device anwyay.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.photos</code></td>
<td>Google Photos</td>
<td>May work in a bare-bones manner without GMS and GSF, but it's hit-or-miss. You can't access cloud editing features or back up your data. Use Immich instead.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>pixel.setupwizard</code></td>
<td>Pixel setup</td>
<td>More of the same as the Android Setup. Remove after completing the initial phone setup.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>mosey</code></td>
<td>Quick Share extension</td>
<td>Since Quick Share depends on GMS and GSF, you can't use it anway, and Quick Share extension is currently Pixel 10-exclusive and has code that checks if it's running on a Pixel 10 series device or not, it adds AirDrop support.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.setupwizard.</code><br><code>searchselector</code></td>
<td>Search engine selector</td>
<td>Will install a search engine app like DuckDuckGo's app or update the Google app if you select Google as your search engine during initial setup. You can remove it after the initial setup.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>settings.intelligence</code></td>
<td>Settings Services</td>
<td>Depends on GMS, GSF. You can remove it.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.</code><br><code>privacy.wildlife</code></td>
<td>VPN by Google</td>
<td>You can remove it.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.</code><br><code>wellbeing</code></td>
<td>Digital Wellbeing</td>
<td>Will work with Google Play Services disabled, but will crash outright without GSF, remove it. You can replicate its sleeping mode directly in Modes (Do Not Disturb), including wallpaper dimming, black and white mode, etc.</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>apps.</code><br><code>deskclock</code></td>
<td>Google Clock</td>
<td>Will not work without GMS and GSF, will not let you enable alarms, and if somehow you were able to forcibly enable alarms, they will not ring or show any notification at all. Use <code>com.best.deskclock</code> (<a href="https://github.com/BlackyHawky/Clock">https://github.com/BlackyHawky/Clock</a>) instead. Do not use Clock You, it won't create alarms properly and they will not ring or show a notification, since it's not using the latest Android 16 permissions!</td>
</tr>
<tr>
<td><code>com.google.android.</code><br><code>personalsafety</code></td>
<td>Personal Safety</td>
<td>Will be stuck on the infinite loading screen with account chooser, you cannot use it without GMS and GSF. Remove it.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
					<guid>PO-250202-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[re: Stop being a puritan [mastodon]]]></title>
					<link></link>
					<description><![CDATA[Just a longer version of my recent take on Mastodon]]></description>
					<pubDate>Sun, 26 Jan 2025 23:40:00 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="stop-being-a-puritan-%5Bmastodon%5D" tabindex="-1">Stop being a puritan [mastodon]</h3>
<p><a href="https://techhub.social/@alextecplayz/113897028566578389">Link to Post, Comment and/or Context</a></p>
<hr>
<p><em>This is a slightly longer version of my <a href="https://techhub.social/@alextecplayz/113897028566578389">three</a> <a href="https://techhub.social/@alextecplayz/113897055363891511">part</a> <a href="https://techhub.social/@alextecplayz/113897089850516184">comment thread</a> on Mastodon regarding my stance on purity politics in the US.</em></p>
<p>Stop being a puritan. Just, stop. No one wins in this situation.</p>
<p>Puritan politics suck ass. &quot;Brave statements only&quot; on this blog, I know.</p>
<p>If I was a US citizen with a right to vote, lived in a swing state, and had to vote in the 2024 US elections, would I have voted for Biden/Harris? Abso-fucking-lutely. A non-negotiable pro-Dem vote from me.</p>
<p>One thing we all need to understand is history, and specifically history between the US and Israel. Ever since the state of Israel was created, the US has supported Israel on all fronts. Almost $200 billion in aid since World War II, its geo-strategic advantage in the Middle East that proved wildly successful during the Cold War and every conflict in the ME since, the $50 billion robust trade agreement, the arms deals, the Israeli security firms' contracts with US and US-affiliated agencies and organizations, everything. Newsflash: this makes Israel THE most significant and advantageous partner for the United States. Absolutely nobody and nothing, spare for a global conflict between these two could break this relationship.</p>
<p>Every POTUS has been pro-Israel since Israel's inception, and will most likely continue to be pro-Israel for as long as the two countries remain strategic partners. If you think your 'left-wing' Democratic presidential candidate would ever be against Israel, I think you need to reconsider and to read some more history. The lowest POTUS could go in terms of support is a soft neutral-to-supporting stance publicly, the endorsement for Israel's right of self-defense, and the acknowledgment of the humanitarian concerns regarding Palestinians and other regions in the area. They'll continue supplying weapons. They'll continue their deals, their economic agreements, their trades, Israeli security contracts will continue flowing. If I was in any position to become POTUS, I'd also be in a neutral-to-supportive stance, Israel is simply an offer you can't refuse.</p>
<p>Let's talk about the &quot;moral high ground&quot;, something that will probably continue to be debated for as long as human life will exist on this planet.</p>
<ul>
<li>This concept is most likely very subjective here, and any 'objective' moral high ground would be somewhere in the middle.</li>
<li>One may argue that the moral high ground is when they don't vote for any candidate. Another may argue it's when they vote third-party. And so on.</li>
<li>I think the most realistic, grounded &quot;moral high ground&quot; here requires complete yet complex context and that the stance will be very nuanced depending on said context. Context is wholly important when it comes to politics, and generally, when it comes to choices and taking sides or understanding a situation.</li>
<li>Context scenario: swing states. I believe that the &quot;moral high ground&quot; if a voter lives in a swing state, is to vote Democrat, even if they're &quot;Genocide Joe&quot;, Harris or some other candidate. It's called voting for the lesser evil. Would you rather vote for Harris, that may try to subtly and gradually change the US' stance on Israel, or will you give your vote to Trump? - Because voting third-party, invalidating your vote or not voting at all actually benefits the Republican candidate. In competitive environments, third-party votes act as a &quot;spoiler&quot; that benefit the Republicans. By invalidating your vote, you unintentionally decrease the overall Democratic vote count, that benefit the Republicans. By not voting at all, you're lowering the voter turnout rates which often correlates with higher Republican success rates. Every choice BUT Democratic immediately kicks you off your supposed &quot;moral high ground&quot;.</li>
</ul>
<p>And let's enter the circus:</p>
<blockquote>
<p>&quot;<em>I'm not voting for Genocide Joe</em>&quot;, &quot;<em>I'm voting for Jill Stein</em>&quot; 🤡</p>
</blockquote>
<p>No, you'd not vote for one 'genocide enabler', but you'd let a different, worse genocide enabler that isn't JUST a genocide enabler, but a full-on fascist dictator take office, or the other Russian puppet, Jill Stein. If I had any significant amount of money, I'd buy you one of those small four-seater cars, a clown suit and make-up kit. Or I'd buy land and run a circus where you're the main event.</p>
<p>I'm sure some poor Palestinian child in the ME will appreciate that Joe from Mastodon didn't vote for Harris in a year or two when some Hamas terrorist throws another hissy fit and starts attacking Israel again, and they bomb the place again with B-21s provided oh so thoughtfully by Trump. It's on the same level as &quot;<em>I donate to charity! I'm a good person, see? SEE?</em>&quot;</p>
<p>You cannot afford purity when it comes at the cost of democracy and freedom. Doing so immediately tells me that you're a moron when it comes to politics, and probably in general when it comes to big decisions. Take a more realistic stance, like minimizing harm. Some things literally cannot be shifted, no matter how much we try.</p>
<p>I understand taking a stance. An anti-genocide stance is most appreciated in a non-US country where the two presidential candidate choices are between &quot;Wriggly Worm 1, the anti-genocide liberal&quot; and &quot;Wrigglier Worm 2, the pro-genocide socialist&quot;. This cannot happen when it comes to a choice between &quot;Joe Biden, but if he was a black woman that worked in law, slightly more left-leaning(?) but still forced to help Israel&quot; and &quot;Dictator Donald Trump and his harem of First Ladies, Herr Elon Musk (Nazi), Mark Zuckerberg (cucked 'alpha male' Human wannabe) and Jeff Bezos (modern-day slave owner, sociopath)&quot;</p>
<p>And hey, I get it, maybe you aren't used to voting for the lesser evil. Maybe you never had to make such a choice before. Completely understandable. So here's an example of a country where people have learned to vote for the lesser evil for 30 years: Romania. And we don't even have a proper democracy in the first place, it's a facade over an old, archaic franken-democratic-communist ideology that hasn't left us ever since the communists have first occupied this country. People have been voting for more-or-less the same fucks that increase taxes, fuck up our inflation, provide horrific government and public services, have pummeled into dust and ensured that the education system never recovers, the same two parties / same coalition, the PSD ('Social Democratic Party', but they're just right-wing liberals) and the PNL ('National Liberal Party', that's just the yellow/blue version of PSD).</p>
<p>Before the shitheap that were the December 2024 presidential elections, people have voted for the lesser evil. Even now, they still voted for the lesser evil, even though some switched sides or were convinced/lied to by populists or right-wing nationalists / fascists (AUR, SOS, POT).</p>
]]></content:encoded>
					<guid>NO-250127-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[2024 Year In Review]]></title>
					<link>/posts/2024-12-30-Year-In-Review.html</link>
					<description>Looking back through 2024, from starting big projects like Sapphire, to helping localize Bluesky in Romanian; from applying to many jobs to getting hired nowhere. With ups and downs, 2024 was quite a good year for me.</description>
					<pubDate>Sun, 29 Dec 2024 23:00:00 GMT</pubDate>
					<content:encoded><![CDATA[<p>Happy holidays, for the remainder of the holidays that continue through for the first few days / weeks after the New Year. Another year dawns upon us all, with both things to fear, but to also be happy about (or not). In this blog post, I'll try to look back through each month of 2024, to outline what I've managed to achieve this year. I can categorically say that 2024 has been MUCH better than 2023, and I'm hoping 2025 will be better.</p>
<h2 id="january" tabindex="-1">January</h2>
<p>On January 4 I created the VantaInteractive/project-jailbird repository with four commits, starting the development of PRISONIA in Unreal Engine 4.27.2. On January 13, VantaInteractive/Sapphire gets new commits after the last commits having been added November 25, 2023, when Sapphire was still using GTK4, OpenGL and GLFW. January 13 handles a complete repository cleanup. The next day, VantaInteractive/Sapphire gets new commits, this time the UI components have been rebuilt using Qt6. Sapphire is now using OpenGL and GLUT. <a href="https://techhub.social/@alextecplayz/111755914285831968">Wrote on Mastodon</a> about how Qt6 has been much easier to adopt compared to GTK4, plus GTK4 may be slower in performance and may not be the best suited for 'advanced applications' that have many menus and submenus. Two days later, <a href="https://techhub.social/@alextecplayz/111762956207770671">I post</a> about how the engine now has icons (from Material Icons and Material Symbols). Later in the day I <a href="https://techhub.social/@alextecplayz/111767884994926672">post another update</a> showing off a better default layout, added editor tabs, and created dialogs for About and Create Project.</p>
<h2 id="february" tabindex="-1">February</h2>
<p>On February 26 and 27 I toy around with <a href="https://techhub.social/@alextecplayz/112000270744544290">vertical tabs</a> for Sapphire and a custom square titlebar to better match the design system I'm going for, and to support the vertical tabs feature. Sapphire is put on hold until April, then again until June.</p>
<h2 id="march" tabindex="-1">March</h2>
<p>Near the end of the month, March 21-24, I launch <a href="https://status.vantainteractive.com">:vi-bw:Status</a>, <a href="https://legal.vantainteractive.com">:vi-bw:Legal</a>. <a href="https://techhub.social/@alextecplayz/112190518988848805">Happy Trump Indictment Day</a>!</p>
<h2 id="april" tabindex="-1">April</h2>
<p>On April 7 I add the Intel XeSS submodule to Sapphire. Development is put on hold until June, as PRISONIA development continues. On April 10 I push the V6 version of the <a href="https://vantainteractive.com">:vi-bw:Vanta Interactive website</a> and the <a href="https://docs.vantainteractive.com">:vi-bw:Docs</a>, and website update 1.5. On April 21 I moved PRISONIA from Unreal 4.27.2 to Unreal 5.2.1, migrated to using the PaperZD plugin instead of the built-in, aging Paper2D system. This would be necessary because Google Play wouldn't let me publish APKs for internal testing unless I used the latest Google Play Billing API (because even if you disable the Billing plugins in Unreal, it still implements some form of billing API in your produced APK file, even if you don't use Billing.)</p>
<h2 id="may" tabindex="-1">May</h2>
<p>Birthday! I turned 19. On May 31 I push more changes to the VI Website, Docs and Legal. From the end of May until the beginning of June, I work as a 'contractor' at a hospital, helping them prepare their management system for the yearly inspection. I'll do it again next year, if my schedule permits.</p>
<h2 id="june" tabindex="-1">June</h2>
<p>On June 1, PRISONIA gets announced on <a href="/post/2024/06/01/Announcing-Prisonia.html">my site</a> and on <a href="https://techhub.social/@alextecplayz/112543436664142843">:mastodon:Mastodon</a>. PRISONIA in UE5 features <a href="https://techhub.social/@alextecplayz/112543459702716644">multi-floor construction</a>, <a href="https://techhub.social/@alextecplayz/112543479365568796">preliminary Lua mod support</a>, <a href="https://techhub.social/@alextecplayz/112543501064035623">todo lists with tasks and subtasks</a>, <a href="https://techhub.social/@alextecplayz/112543577330000851">customizable action banners</a> (both for development and modding), swapping out wardens and their abilities, etc. Still, <a href="https://techhub.social/@alextecplayz/112543586933366191">as mentioned</a>, the long-term goal was Sapphire since January, even though PRISONIA was the priority from February through May. Last 2 commits to VantaInteractive/project-jailbird, in which I started work on a way to handle tiles, because of course, Unreal can't handle pathfinding in 2D that easily, and especially not in an expandable map like the game's. So, PRISONIA has been put into stasis while I bring Sapphire up to snuff, before I can begin migrating the game to the new engine. On June 14, the initial switch from Qt6 to ImGui is successful. Initial re-implementations of Corundum, the lovely menu bar that I've come to like for being so simple, yet so great, while on June 29 the initial custom title bar implementation, small util and helper changes take place.</p>
<p>On June 25, I started applying to jobs through eJobs.</p>
<h2 id="july" tabindex="-1">July</h2>
<p>Nothing particular takes place in July. I just take a month-long break and play games.</p>
<h2 id="august" tabindex="-1">August</h2>
<p><a href="https://techhub.social/@alextecplayz/112889354792216487">Big update about Sapphire</a> on Mastodon, as the month's first commit gets published on August 1. Custom title bar, vertical tabs, Qt6 is completely removed, and there's a big overhaul to the UI thanks to ImGui being so simple to pick up, learn and use. Throughout the month, more commits to Sapphire are published, as development ramps up. On August 31 I finally come out as trans to two of my best friends, after sprinkling many hints about this for months beforehand (<em>plus, I was out on GitHub (Jan 4) and Mastodon for a while at this point</em>). Look, you have to understand, I have trust issues and Romania isn't really the best place to be trans 😅, plus one of those best friends was rather transphobic just a year beforehand.</p>
<h2 id="september" tabindex="-1">September</h2>
<p>By September 8, I moved from GLFW to SDL3, I have a <a href="https://techhub.social/@alextecplayz/113110130536417333">preliminary plugin system the next day</a> that scans for manifest changes or the presence of a manifest in <code>/Content/Plugins/</code>. On September 21 there's a major restructuring that involves removing most of the submodules and re-adding only the includes and the license for each. Also added is a ROADMAP.md and improved the CMakeLists.txt to better discover and build the engine's code, including plugin (module) code. Two days later I started work on plugin library (.so) detection, loading, and installation into specific folders (e.g., <code>/Content/Plugins/2D/2DSystem/Binaries/{platform}/2DSystem.{fileextension}</code>). Later that day, I refactor how plugins are installed, so /Content/Plugins is created at build-time. More work continues until September 28 when I finally manage to have a plugin interface that would allow plugins to be loaded. September 29 and 30 handle 2/3 of UI theme support, that is per-project managed.</p>
<h2 id="october" tabindex="-1">October</h2>
<p>By October 2, theme support is mostly finished.</p>
<h2 id="november" tabindex="-1">November</h2>
<p>Ordered on Halloween (of all things, but it was a Black Friday sale) a Raspberry Pi 5 4GB <a href="https://electronix.ro/produs/kit-placa-de-baza-raspberry-pi-5-4gb/">kit</a> that included a <a href="https://www.raspberrypi.com/products/raspberry-pi-5-case/">case</a>, SD card, and the <a href="https://www.raspberrypi.com/products/raspberry-pi-5/?variant=raspberry-pi-5-4gb">board</a> itself with the <a href="https://www.raspberrypi.com/products/27w-power-supply/">charger</a> for a measly EUR 87, quite a great deal. <em>Little did I know at the time, that the userspace was 32-bit while the kernel was 64-bit…</em>. The next day, I tried setting up an e-mail server. It did manage to send e-mails through Gmail's proxy, but I gave up because…ISP blocking ports. Four days later, I ordered the <a href="https://www.raspberrypi.com/products/m2-hat-plus/">Pi 5 M.2 SSD hat</a> and a <a href="https://www.amazon.com/SAMSUNG-PM991A-MZALQ256HBJD-256GB-Internal/dp/B0BC27QCZ2">256GB Samsung M.2 SSD</a> from eMAG, and picked them up Nov. 6. Shout out to <a href="https://rpi-clone.jeffgeerling.com/">rpi-clone</a>, I've used it twice so far (<em>second time was in December</em>) and it's damn good. Straightforward and hassle-free. Just how a system clone should be.</p>
<p>By November 8, RPI5-1 is now running Radicale CalDAV &amp; CardDAV and Vaultwarden. Tried self-hosting both the new and the old Firefox Sync + accounts infra, but it's an absolute nightmare to try to run, and gave up because it's a miserable piece of shit. Mozilla (and Chrome, for that matter!) should provide fully-fledged sync servers that can be self-hosted, and have the ability to store the synchronized data server-side, without all of this bullshit. Chrome, in particular, lacks any modern sync server that can be self-hosted.</p>
<h2 id="december" tabindex="-1">December</h2>
<p>On December 2 I switch from OpenGL to Vulkan, which means that I have to re-do some parts of the Sapphire renderer, as I've completely dropped anything that isn't Vulkan. I just want to focus on one renderer at this time, and Vulkan is the logical one to keep going forward.</p>
<p>On December 7 (<em>I haven't written about this on Fedi because it wasn't a big deal, but</em>) as per the November 1 foreshadowing, I had the great (dis)pleasure to find out that I was running a 32-bit userspace while trying to compile a Ruby version so I can run the Mastodon server. No problem! rpi-clone my system to the 16gb SD card from RPi, flash Raspberry Pi OS Lite (64-bit kernel, 64-bit userland) to an 8GB microSD that I'd use to flash the new system, rpi-clone the new system to the SSD, mount the old install and transfer everything over. All within the hour, totally seamless with no issues whatsoever.</p>
<p>December 8 is a better day, as I managed to update and get <a href="https://github.com/VantaInteractive/Social">:visoc:Vanta Social</a> up and <a href="https://techhub.social/@alextecplayz/113618245868821503">:mastodon:running</a>! I'll probably still use techhub as my primary account for the time being, I might mirror or boost some posts to the Vanta Social accounts, but right now there's not much to post about there. Vanta Social allows me to have the 'branded' look using Obsidian, and I can create accounts specific to certain projects such as Sapphire and PRISONIA, which is great. And the best part? It's not even using that much RAM on my 4GB Raspberry Pi 5. Still, it's a nice little achievement that I wanted to do before the year ends. Give my accounts on there a follow if you'd like! I'll start posting using them in 2025. <a href="https://social.vantainteractive.com/@alextecplayz">:atp:@alextecplayz@social.vantainteractive.com</a>, <a href="https://social.vantainteractive.com/@vantainteractive">:vi-pride:@vantainteractive@social.vantainteractive.com</a>, <a href="https://social.vantainteractive.com/@sapphire">:sapphire:@sapphire@social.vantainteractive.com</a>, <a href="https://social.vantainteractive.com/@prisonia">:prisonia:@prisonia@social.vantainteractive.com</a></p>
<p>From December 17 until the end of the year at least, I'm on a binge playing TheoTown every day, or every other day. Same for HITMAN: World of Assassination (for which, my full trilogy review is almost done, so it'll come out in January 2025). Also, Fedi might not like this one because <em>hurr durr Bluesky is corporate, not decentralized, etc.</em>, but Claudiu Cristea and I have managed to get a <a href="https://github.com/bluesky-social/social-app/pull/6456">pull request</a> accepted into the social-app repository that adds Romanian localization the next day, yay! Regardless of one's opinions of a website or an app, I think we can all agree that supporting additional languages can only be helpful, as it's making the web more accessible. Also, happy Saturnalia if you celebrate it!</p>
<p>And…it's December 24. Merry Christmas! Happy holidays, if you celebrate! Santa's got a website update! Since Dec. 18 I've been hard at work on update 1.7 for my website! Fulltext search on all pages based on the sitemap, search is a revamp of an old project of mine, <a href="https://github.com/alextecplayz/proto-searchlight">project searchlight</a>, but now with filtering (sorting, snippets, excluding certain types of content) — <em>this feature has been on the back-burner a couple of times, I tried before (as seen on the Vanta Interactive website search), but that version is miserable to work with</em>, a more mobile-friendly UI, a new home page, some QoL where possible, and a few more minor additions, like visual effects such as vignette, rain and snow, custom emojis, some more tasteful features such as page navigation and sharing! There are categories and tags to select, too. Enjoy!</p>
<h2 id="2025" tabindex="-1">2025</h2>
<p>And in three days, it's 2025. This year, either I'm getting a job that pays well (<em>I'm currently unemployed</em>), or the more likely option, going to college for three years. Either way, I want to allocate a portion of my monthly salary to donate to a couple associations and groups. This would be separate from the 3.5% income tax that I can also re-allocate to a couple of associations, namely ONGs (you can find a handy list <a href="https://formular230.ro/organizatii/">here</a> — <em>note that the site is not official</em>).</p>
<p>I was thinking of the following places for my income tax to be divided up to: <a href="https://www.mozaiqlgbt.ro/">MozaiQ</a>, <a href="https://asociatiapride.ro/en/">Pride Association</a>, <a href="https://www.instagram.com/arkoradea/">Ark Oradea</a> and <a href="https://transcore.ro/">TransCore</a>. Additional donations (outside my income tax) will be divided up to: possibly the same four as mentioned before, plus <a href="https://stareanatiei.ro/">Starea Naţiei</a>, <a href="https://recorder.ro/">Recorder</a>, and perhaps a few more that I haven't yet decided on.</p>
<p>IF I go to college, and that's a big IF, post-graduation I'll get a job, and a few months down the line I'll start a business entity for Vanta Interactive. Which would also allow me to freelance (B2B or B2C), something that I'm not permitted without a business or an individual entity (See the conundrum? Can't freelance without a legal entity, and therefore, lots of money. Can't have money without a job. <em>How is one supposed to earn money without a job, and without being able to freelance, legally?</em>). This would mean that I would have to spend less time on doing the stuff I like, and more time on catching up on whatever subjects I'd need, in order to apply to the college I chose (<em>more details about this in 2025</em>).</p>
<h2 id="summary" tabindex="-1">Summary</h2>
<p>So, to summarize, in 2024 I started working on my own game engine, which is a big project in of itself, fully embraced ImGui instead of heavy, bloated Qt6 or GTK4. I kept updating my website because I really do love web design. Worked on a game but put it on hold due to me dropping Unreal altogether to embrace Sapphire's development. I finally made a proper search feature that isn't miserable. I'm well on my way to master Jekyll and Liquid, and continued to further my skills with HTML, CSS and had loads of fun with JS, and will keep on using these instead of switching to any web framework. Furthermore, I bought and set up a Raspberry Pi 5 to run a Cal, CardDAV, Vaultwarden and Vanta Social. Not only that, but I bettered my understanding of human psychological behaviours, self-introspection, and came out as trans to my best friends. I also continued to explore how hormones work and how they contribute to the physiological and psychological development of humans. Continued developing my nuanced political leanings. Got better at photography, I'm using the camera hardware on my Redmi Note 11 to the fullest. Applied to many jobs, had a couple of interviews, didn't get hired anywhere.</p>
<p>In 2025 I might have less free time as I will most likely go to college for three years, so there's that. But at least it's something that's interesting to me, so it won't be a complete waste of time, plus the curriculum doesn't seem to have any extra subjects that would make no sense to be there, which is fantastic.</p>
<p>Here's to (hopefully) an even better year for me, and for everyone. Enjoy every little win you can, because it helps if you have anxiety or were in depression and are feeling down.</p>
]]></content:encoded>
					<guid>PO-241230-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Call of Duty®: Black Ops 6 - Campaign Review]]></title>
					<link>/posts/2024-10-24-Call-of-Duty-Black-Ops-6-review.html</link>
					<description>Call of Duty takes us into the Gulf War, and uncovers a dark conspiracy brewing inside the CIA. Also, could BO6 be better than BOCW?</description>
					<pubDate>Thu, 24 Oct 2024 18:00:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><strong>SPOILERS AHEAD! THIS REVIEW CONTAINS SPOILERS!</strong></p>
<p><strong>NOTE: This is a campaign-only review!</strong></p>
<table>
<thead>
<tr>
<th><strong>Game</strong></th>
<th>Call of Duty®: Black Ops 6</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Developer/Publisher</strong></td>
<td>Treyarch, Raven Software, Beenox, High Moon Studios, Activision Shanghai, Sledgehammer Games, Infinity Ward, Demonware / Activision</td>
</tr>
<tr>
<td><strong>Release date</strong></td>
<td>25 October 2024</td>
</tr>
<tr>
<td><strong>Engine</strong></td>
<td>IW Engine 9.0</td>
</tr>
<tr>
<td><strong>Anti-cheat</strong></td>
<td>RICOCHET</td>
</tr>
<tr>
<td><strong>DRM</strong></td>
<td>Steamworks DRM, Battle.net DRM</td>
</tr>
<tr>
<td><strong>Review platform</strong></td>
<td>PC</td>
</tr>
<tr>
<td><strong>Also available on</strong></td>
<td>PlayStation 4, PlayStation 5, XBOX Series XS, XBOX One, PC (Steam), PC (Battle.net)</td>
</tr>
<tr>
<td><strong>Price</strong></td>
<td>$70 (Standard), $100 (Vault Edition)</td>
</tr>
<tr>
<td><strong>Warnings about company</strong> (does not count towards Review score)</td>
<td>Greedy, anti-consumer, anti-developer (union busting, crunch culture), cancerous microtransaction practices</td>
</tr>
<tr>
<td><strong>Review score</strong></td>
<td><strong>8/10</strong></td>
</tr>
</tbody>
</table>
<h2 id="tldr" tabindex="-1">TLDR</h2>
<p>A certain improvement over Modern Warfare Ⅲ (which received a <a href="https://alextecplayz.com/post/2023/11/04/Call-of-Duty-Modern-Warfare-III-Review.html">scathing 3/10 rating from me</a>, and many others), and a certainly good campaign, Call of Duty Black Ops 6 does manage to capture that conspiratorial atmosphere yet again. While it doesn't come quite close to Black Ops Cold War's campaign (9/10 rating from me), it's still a damn good, memorable campaign. Is Call of Duty back? Yes, yes it is.</p>
<p>If I had to rate only the campaign (as I do in this article), it's an 8/10. If I had to rate the whole game (Campaign + MP + Zombies), it's a 7/10. $70 is way too much for this. If I could only pay for the campaign, it would be much better (<em>especially if it would be playable on Linux through Proton, at the very least</em>), at a $25-30 price tag. The only modern campaign I'd be willing to spend more on than this would be BOCW, which could be sold for $45 and still be damn great.</p>
<h2 id="soundtrack" tabindex="-1">Soundtrack</h2>
<p>It may seem weird that I'd start off by going over the soundtrack, but I can't help but praise it. Composed by Jack Wall (which composed Black Ops Cold War's <em>truly excellent</em> soundtrack), I can pinpoint exactly the songs which use instruments, jingles, tunes or themes previously heard in BOCW. For example, <a href="https://open.spotify.com/track/7I2qYZhD8EyU5ZBkVVGH9z?si=72527b5535d6484b">39. The Pantheon</a> echoes the mysterious, conspiratorial undertones of <a href="https://open.spotify.com/track/4YuV8rRe9Wjix9Mm9rRhx8?si=34e0699c7e0247a3">5. New Beginnings</a>, <a href="https://open.spotify.com/track/0PHkMMuvP5BP1L0E8RQhen?si=c54cbeca473746c1">6. No Higher Duty</a>, and <a href="https://open.spotify.com/track/18tZdIq6kx4bsqWLJFkxjH?si=5297486770e6448f">46. Who Am I?</a>, among others, while adding its own twists as well. The Pantheon also has a sci-fi retro-futurist jingle that helps push the conspiratorial theme of an organization (Pantheon) effectively overtaking and sabotaging the CIA. Then, as it moves on, it picks up a more action-packed, Spider-Man-esque orchestral theme that blends in with the rest of the soundtrack, as it's mainly supposed to resemble an action blockbuster-kind of vibe, unlike Cold War which went all in on the mystery.</p>
<p><a href="https://open.spotify.com/track/2StVaG3cNfBOTANuLyjEKX?si=65d3cd962f2c49d7">40. Find Harrow</a> seems to have a more 'streamlined' atmosphere, in the sense of the modern installments of Call of Duty sharing some kind of soundtrack themes and notes between each other, such as Modern Warfare, Modern Warfare II and of course, Cold War. This isn't limited to Call of Duty, however. Games such as the HITMAN World of Assassination trilogy also manage to have a consistent theme that each game's soundtrack relies on to keep a similar experience when you'd, if ever, 'binge play' the games by following the whole main story of the trilogy. Still, it packs a punch and sounds superb. It manages to capture quite well the atmosphere of the game</p>
<p><a href="https://open.spotify.com/track/3xMAB6Mum1q7TkqXmR6iXV?si=5aec590e8d474ac9">42. Fractured Memories</a> heavily returns to Cold War themes, <a href="https://open.spotify.com/track/3CMTczAIXHWyNZa3XrISRt?si=0f6df76880ef4bde">47. Ruộng lúa ba</a> from BOCW immediately comes to mind. It shares the same theme, of exploring oneself, and figuring out their history, or reliving old memories.</p>
<p>I'm sorry, if you couldn't tell by now, I'm a massive fan of Jack Wall's work on BOCW and BO6. He manages to keep everything consistent, fluent and expressive throughout both soundtracks, no matter what. The BOCW &amp; BO6 soundtracks could be praised endlessly, but I need to talk about the other stuff too.</p>
<p><strong>Beyond this point, this section contains spoilers about both Call of Duty: Black Ops Cold War and Call of Duty: Black Ops 6. You have been warned!</strong></p>
<h2 id="story" tabindex="-1">Story</h2>
<p>Yeah, the story is great, actually! What's better than a high-stakes, action-packed story, AND a conspiracy about the CIA being infiltrated by an entity seeking to ruin it? BO6 takes a page out of BOCW's book, where &quot;Bell&quot; was revealed to have been brainwashed, and to have actually worked for Perseus. Well, in BO6 the main protagonist controlled by the player, William &quot;Case&quot; Calderon, has apparently experienced 'The Cradle' a decade before the events of the game, as is revealed when Case visits the Advanced Technologies and Applications' bunker and inhales the gas, which results in a hallucination of the ATAA Division with a wonderful lobby reminiscent of Soviet-era retro-futurist architecture.</p>
<p>But let's rewind back. In 1989 during the US invasion of Panama, Raul Menendez kills their handler, Jason Hudson, and tricks Frank Woods into killing Alex Mason. Russell Adler is soon framed as one of Menendez' moles in the CIA, which forces Adler to go rogue. In 1991, during the early beginnings of <em>Operation Desert Storm</em> and thus, the Gulf War, Troy Marshall, &quot;Case&quot; and Jane Harrow go on a mission to extract the Iraqi Secretary Sayeed Awali near the Iraq-Kuwait border, where they find the existence of, and fight troops belonging to, Pantheon. After fending off Pantheon troops, Russell Adler shows up instead of the supposed 'contact' that Troy had, executes Awali claiming that neither Pantheon or the CIA (Langley) should get their hands on Awali, and delivers a message to Woods before extracting the group. Back at the CIA, the group's supervisor, Livingstone, finds it very hard to believe the rumours about Pantheon, and suspends the group, being especially motivated by Awali's fate.</p>
<p>Woods recognises Adler's message which leads the group (Troy and &quot;Case&quot;) to go rogue and operate out of an abandoned KGB safehouse in Bulgaria. At the safehouse, they discover evidence pointing to a technical genius, Felix Neumann, and assassin Sevati &quot;Sev&quot; Dumas. Troy tracks down and recruits Felix, while &quot;Case&quot; travels to Avalon to recruit Sevati after sniping one target and helping Sevati kill two more crime bosses from the area, all three related in some way to Pantheon, being part of a criminal organisation named &quot;The Guild&quot;, which Sev worked for in the past. (<em>Side note: Avalon is not a real location, it's tied to a legend, however Avalon in the Call of Duty universe is a location in the Mediterranean area</em>).</p>
<p>Then, we return to Washington D.C., in the mission that was premiered on YouTube, &quot;Most Wanted&quot;, where Troy, Sev, &quot;Case&quot; and Felix bust out Adler from a CIA safehouse underneath the Capitol Station, which is hosting a political event for none other than Bill Clinton! After breaking out Adler, Pantheon attacks the crew again, and they get blamed for the attack on the station rather than Pantheon, which seeks to erase any and all traces of themselves from the news.</p>
<p>Adler reveals that Pantheon has had weapon deals with Saddam Hussein, and contacts his source in the MI6, Helen Park, previously seen in BOCW, which manages to delay the British SAS attacks on a palace in order for Troy, Adler and &quot;Case&quot; to investigate the palace's bunker. In the bunker, they discover &quot;the Cradle&quot; an American bioweapon manufactured in Kentucky, under the Advanced Technologies and Applications division, and the name of the head scientist working for Pantheon, Matvey Gusev.</p>
<p>&quot;Case&quot;, Marshall and Sev investigate the biolab, but &quot;Case&quot; gets separated and inhales &quot;the Cradle&quot;'s hallucinogenic gas which takes us on a trip throughout the abandoned lab, as &quot;Case&quot; fights off zombies, four zombie bosses in order to retrieve four keycards, and mannequins. And, I have to say, the entire mission is fantastic. The architecture is reminiscent of DEATHLOOP-esque retro-futurist with a blend of Soviet-era brutalism, which works really well. We find out, through a voice that &quot;Case&quot; hears, and through information we find around the lab sectors including phone calls with the supposed scientists praising Case and the outcome of the test, that &quot;Case&quot; isn't just a nickname for William, but also the name used when William was the one and only test subject to be exposed to &quot;the Cradle&quot;, &quot;Test Subject Case One&quot;, before the whole project was shut down by none other than Livingstone, due to concerns about the project, which in turn was also supposed to shut down Pantheon, the secret CIA division that oversaw the development of the performance-enhancing drug. After this 'seizure', as reported by Troy and Sev when &quot;Case&quot; regains his senses, the team discovers that Pantheon already stole most of the biolab stores regarding the Cradle, however they manage to find a recording which reveals that Harrow is working for the Pantheon, which leads them on a mission back in Avalon, infiltrating a casino where they manage to steal financial records that reveal Pantheon is wiring money to Gusev in Iraq. After a brief chase and gunfights at an Iraqi airport, they catch up to Gusev, where he informs the team about the Cradle being stored in Vorkuta.</p>
<p>The Vorkuta mission can be approached in multiple ways, as many of the other missions in BO6, but while the team can't stop &quot;the Cradle&quot; from being moved, they finally capture Harrow for questioning. Back at the safehouse, Adler injects her with a truth serum which is somehow connected to MK-Ultra, and Harrow slowly reveals that Adler may have murdered her parents for being double (or triple?)-agents - which could be just a hallucination, as she was very young when both parents were assassinated in their family home. Besides that, we find out that &quot;the Cradle&quot; was always planted inside the Capitol Building, and is waiting for her command to deploy, which could infect tens of thousands of people in the area. Pantheon's ultimate plan was a false-flag operation to discredit the CIA and install Harrow as the new Director of the agency. While all of this is happening, the team is also defending the safehouse from Pantheon forces in multiple waves.</p>
<p>Pantheon successfully manages to raid the house, where they free Harrow which stabs Woods in the stomach (presumably), before evacuating to a helicopter. &quot;Case&quot; manages to catch up and board the helicopter as it prepares for takeoff, and a close-combat fight ensues between Harrow and Case. Harrow pulls a gun, and accidentally shoots the Helicopter pilot while struggling to fend off &quot;Case&quot;, and the helicopter crashes. Harrow reveals (after privately taunting Case back in Vorkuta), that she knows about Case being part of the project, and that he &quot;owes everything to the Pantheon&quot;, while punching him in the face. &quot;Case&quot; grabs &quot;the Cradle&quot; and smashes it on Harrow's face, and thus releasing the gas, which leads Case to ultimately strangle Harrow, before presumably drowning, but this is left ambiguous. Troy tries to radio Case, informing him about how Livingstone managed to evacuate everyone in the Capitol building and recover the Cradle, before cutting to a &quot;Two weeks later&quot; cutscene.</p>
<p>In the final cutscene, Livingstone meets the crew (&quot;Case&quot; isn't mentioned or shown at all) in a forest near a river, and informs them about how they're living in the shadows, and how Livingstone needs the team, as he knows that Pantheon is not yet destroyed, and informs Troy that they must head to Avalon to continue pursuing the remnants of the division. The last few scenes show a person in a CIA office accessing the CIA infrastructure through the terminal, before smiling. Some assumed that it was Alex Mason somehow, but it's apparently Pantheon operative <em>Jackson Caine</em>, which leads a CIA task force in MP, as they hunt down and undermine the efforts of the rogue Black Ops team led by Woods.</p>
<p>So, Activision is continuing the BO6 storyline first through MP/Warzone, similar to what happened with BOCW and previous installments before they'd tease what comes next for the Black Ops series, I think that's fine.</p>
<p>Yeah, the story is a wild ride, but it's executed quite well and there's little to complain about. I just wish we'd know more about &quot;Case&quot;, because the crew never seems to wonder about his past, nor do they respond when Harrow directly tells Case in Vorkuta about knowing who he is, besides the &quot;Don't listen to her, Case!&quot; from Troy. The reveal that Harrow was the 'big bad' wasn't really that surprising to anyone, it seems. It's all quite formulaic, but at least it does have some twists to keep it fresh and engaging. The VO performance was splendid as well, I have no complaints there.</p>
<p>Overall, I'm quite pleased with how the BO6 campaign turned out, the marketing was mostly on point and didn't really over-hype what would happen in the game.</p>
]]></content:encoded>
					<guid>PO-241024-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Announcing Prisonia]]></title>
					<link>/posts/2024-06-01-Announcing-Prisonia.html</link>
					<description>Design, build and manage prisons, in a brand new game from Vanta Interactive.</description>
					<pubDate>Fri, 31 May 2024 22:00:00 GMT</pubDate>
					<content:encoded><![CDATA[<p>It's time for a game announcement, no? Introducing <strong>Prisonia</strong>, a top-down 2D prison management game that blends mechanics from games such as Prison Architect and The Escapists 2, and builds upon them with additional features, and much more in the future.</p>
<h2 id="the-why%3F" tabindex="-1">The Why?</h2>
<p>The game has been in on/off development since as early as January 2024, when it was merely an idea stemmed from a mod I was creating for Prison Architect, that wanted to expand upon the base game's features with much more content and features. However, Prison Architect is somewhat limited when it comes to modding. By December 2023, I knew that I wanted to transform it into a game, instead. And don't you love getting pick-pocketed every once in a while for new content that might as well have been part of the base game, but they're sold as DLC instead?</p>
<h2 id="early-access" tabindex="-1">Early Access</h2>
<p>Prisonia will launch in Early Access later in 2024. Bi-weekly or monthly updates during Early Access, where I deliver content related to one theme at a time. (Themes include locations, mechanics, seasons, events, etc.)</p>
<aside class="aside-content monospace lightgray rem1"><p class="monospace bold rem1 hidden-on-desktop">Aside for paragraph below:</p><p><strong>Please consult <a href="/posts/2026-02-24-Lessons-from-PRISONIA-part-1.html">Learnings from PRISONIA, part 1</a> for more up-to-date content. PRISONIA has been moved to Godot Engine, and is slated to release in Early Access on Steam, Itch and Google Play in 2026</strong></p>
</aside>
<p>What do I want to achieve? Better mod support in Unreal Engine using the <em>LuaMachine</em> plugin, that allows me to export Blueprint functions as Lua code which can then be accessed by modders, not just on PC, but later, on mobile. Because yes, Prisonia will also launch on Android, at a later date, however I'm excited to say that mods do work from my testing.</p>
<h2 id="how-much%3F" tabindex="-1">How much?</h2>
<p>$25.00, no DLC, no extra editions or additional paid content, DRM-free. Coming to Steam and Itch. Maybe other storefronts later on as well.</p>
<p><strong>For additional details, go to the <a href="https://vantainteractive.com/en/games/Prisonia">Vanta Interactive website</a> or on <a href="https://techhub.social/@VantaInteractive">Mastodon - VI</a> and <a href="https://techhub.social/@AlexTECPlayz">Mastodon - ATP</a></strong></p>
]]></content:encoded>
					<guid>PO-240601-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Vanta Interactive turns SIX!]]></title>
					<link>/posts/2024-04-11-Vanta-Interactive-turns-six.html</link>
					<description>Six years of (behind the scenes) indie game development, new website and the future.</description>
					<pubDate>Thu, 11 Apr 2024 09:11:11 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="studio-history" tabindex="-1">Studio history</h2>
<p>Yes, you've heard that right. Vanta Interactive turns six this month. Here's a short history: the studio initially started out as an idea in April 2018, as a future idea between two school colleagues, of a no-nonsense, no greed, game studio that would create cool games without falling prey to all the bad shit in the industry.</p>
<p>In the summer of 2019, I branded it as '2A Games' (2 friends with the initial 'A', making games), and released JumpGame, a quick prototype I made in 3 days to showcase what skills I have quickly learned over the past month or so, where you would jump around multiple maps, because why not. It was always intended as a joke, but even back then, I wanted to give comprehensive settings toggles to players, so they can tweak their performance to their liking.</p>
<p>Sometime later, I started publishing some silly devlogs of '<em>GRAV0RTAL</em>', a project that was supposed to create, in Unreal Engine 4, my fictional take on Half-Life 2: Episode Three and a sequel to Portal 3, as I was inspired after seeing videos from Project Borealis, that was also using Unreal to create a game based on 'Epistle Three', written by Mark Laidlaw, and Thinking With Time Machine, a small Portal 2 mod on Steam that continued directly from Portal 2's ending cutscene.</p>
<p>I rebranded at some point to Evo-Catalyst Softworks, because I thought '2A Games' sounded boring, and could be confused with '4A Games', the developer studio behind the highly successful Metro series. But, I finally decided to land on 'Vanta Interactive', stemmed from my love of the 'vantablack' color, and just the word 'Vanta' in general. <em>Fun fact: vanta(black) comes from <a href="https://en.wikipedia.org/wiki/Vertically_aligned_carbon_nanotube_arrays">Vertically aligned carbon nanotube arrays</a>, or vantas, a material on which <a href="https://en.wikipedia.org/wiki/Vantablack">vantablack</a>, the darkest black surface coating known, is based on.</em></p>
<p>And because I'm releasing a new game soon (<em>finally, a PROPER game! And no, it's not GRAV0RTAL unfortunately. That project has morphed into something else, and is on the future roadmap, but I cannot provide any details about it at this time</em>), I decided to finally give the Vanta Interactive website a proper <a href="https://vantainteractive.com/en/">redesign and coat of paint</a>, based on the Obsidian Design System I developed initially for this website. I also created <a href="https://docs.vantainteractive.com/en/">Docs</a>, <a href="https://legal.vantainteractive.com">Legal</a>, <a href="https://api.vantainteractive.com">API</a>, <a href="https://store.vantainteractive.com">Store</a> and <a href="https://status.vantainteractive.com">Status</a> subdomains for the studio. All but the Store and API subdomains use the Obsidian Design System as well. Store uses Gumroad, and API is not currently used, but there are plans to use it in the future for various projects and tests.</p>
<p>The rest of this post is the (in)formal variant of the page regarding the <a href="https://docs.vantainteractive.com/en/websites/main">history of the <em>main</em> website from the Docs website</a>:</p>
<h2 id="site-history" tabindex="-1">Site history</h2>
<p>Unfortunately, the website designs of the 2A Games (v1) and ECS (v2) websites are lost in time, we did manage to find some details about the third version, where we first started using the Vanta Interactive name.</p>
<h3 id="version-3" tabindex="-1">Version 3</h3>
<p>The blog was hosted using Google's Blogger platform, and we were using a free theme from the now-defunct ThemesWear website.</p>
<p>We had a secondary website for one of our projects at the time, GRAV0RTAL, also hosted by Blogger.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/VI-Site-Archive-GV2020.webp" alt="The home page of the GRAV0RTAL site, it has some of the posts from 2A Games and ECS." title="The home page of the GRAV0RTAL site, it has some of the posts from 2A Games and ECS.">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/VI-Site-Archive-GV2020.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/VI-Site-Archive-GV2020.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>The blog uses the free 'Basil' theme from SoraTemplates, loaded the FontAwesome and LinearIcons CSS, Testimonial CSS from Flickity, Animate CSS, jQuery min, WowJS, SlickNav Responsive Mobile Menu, jquery-match-height, Flickity, Waypoints, jquery-counterup, jQuery One Page Nav Plugin and SmoothScroll.</p>
<h3 id="version-4" tabindex="-1">Version 4</h3>
<p>In late 2020, I switched to using the 'Slides' theme from FreeHTML5 for the Vanta Interactive blogger website, pictured below:</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/VI-Site-Archive-2021.webp" alt="The home page of Vanta Interactive, carrying over the posts from 2A Games and ECS." title="The home page of Vanta Interactive, carrying over the posts from 2A Games and ECS.">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/VI-Site-Archive-2021.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/VI-Site-Archive-2021.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>As was the trend back then, most of the header buttons used to link to sections of the home page. 'About' would lead to the About Us section. We had pages for /games and /software, but they were blank, and the idea was to update them, but that never happened, for whatever reason. The page contained an ungodly amount of third-party CSS and JS code, such as Bootstrap CSS, some obfuscated JS that even to this day I have no idea what it was for, and at the end we had Waypoint JS, Easing JS, Stellar JS and Magnific Popup JS.</p>
<p>For some reason, at the time I also opened KX Design Lab, it was supposed to be a subdivision of VI that would handle website designs (Figma and HTML, CSS, JS) and app designs in Figma. It was supposed to be another freelance way for the studio to earn some money while teasing our game progress and whatnot. I also linked some of the music I made using FL Studio Mobile from BandCamp, and music used for our games. We also wanted to offer other services such as photography, another way to earn money. None of this went further than a conceptual stage.</p>
<h3 id="version-5" tabindex="-1">Version 5</h3>
<p>In <strong>February 2021</strong>, I started the Vanta-Interactive organization on GitHub, and created the first GitHub Pages-hosted version of the site, using a free bootstrap 4 theme from ColorLib, Mostudio. This, too, used Magnific Popup, FlatIcons, FontAwesome, jQuery min and new scripts: jQuery migrate, popper, bootstrap min, jquery easing, jquery waypoints, jquery stellar, scrollax min, owl carousel, jquery AnimateNumber and Google Maps' js API. No, this didn't cut it either. So I scrapped all that and made a very minimalist site with a white background, and used pictures as links. I had enough of Bootstrap and terrible free templates.</p>
<p>And while in <strong>October 2021</strong> I was working on <a href="https://web.archive.org/web/20211001172806/https://alexhowell2a.github.io/">my personal website</a>, the website was <a href="https://web.archive.org/web/20210317220123/https://vanta-interactive.github.io/">rotting away</a> with little to no updates. Finally, on December 20, 2022, I deleted the whole website and left it as it is, until this day, with no updates. The intention was to quickly finish up the personal website, polish Obsidian, then use it to quickly bring the VI site up to snuff, but that never happened, as I was busy finishing high school.</p>
<h3 id="version-6-(present)" tabindex="-1">Version 6 (Present)</h3>
<p>Funnily, or, surprisingly enough, <strong>as of April 2024, Vanta Interactive is six years old</strong>. It's crazy how time has passed, and how much the studio has evolved - even if we never released any game outside of a <a href="https://vantainteractive.com/en/games/JumpGame">silly little game I pieced together in three days</a>.</p>
<p><strong>Sixth time's the charm!</strong> I had experienced burnout in the summer of 2023, even the thought of opening an HTML file related to my project was seriously depressing. And now, it's March/April 2024. I've been working on a proper game that is scheduled to release at the end of April, I need the website up and running. I quickly gather everything, polish Obsidian and I pieced together what you see today, using Jekyll and Liquid. The idea, previously, was to write my own CMS - a bad idea, especially when I knew well Jekyll, tried Hugo and had used Blogger before, which was horrible. Do you want to know how long it took to put everything together, update and rebuild all of this? <em>Drum roll, please!</em></p>
<p><strong>All of the Vanta Interactive websites and the AlexTECPlayz website, were rebuilt using Jekyll in under a week.</strong> <em>&lt;facepalm&gt;</em> This includes me bringing over all the past posts from Blogger. Additional tweaks, adding 88x31 banners to the ATP website's homepage, writing a few more posts and whatnot took another few days of total work time, on top of the time previously mentioned.</p>
<p>What am I using today? Simple HTML, Obsidian CSS with some customizations specific to each website's use case, and very little JS. All fonts, css and js are loaded from the repository, because I have principles now. I care about privacy and security. I don't want to collect cookies, or to bombard the users with cookie pop-ups. How the times have changed.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/mainsite.webp" alt="Screenshot of the current Vanta Interactive website" title="Screenshot of the current Vanta Interactive website">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/mainsite.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/mainsite.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p><em>Note the goof in the top left corner, where the icon is used: The screenshot was taken during Ace Visibility Day, so the logo was using the Ace flag variant - because yes, the Vanta Interactive logo has variants for the 'main' queer flags ^w^</em></p>
<h2 id="future" tabindex="-1">Future</h2>
<p><strong>What are the plans for the future?</strong> More polish, and maybe some additions to the home page, as more projects get teased or released. And because of Obsidian and Jekyll, everything is so much easier and faster to develop and ship. Less time working on the website and procrastinating, and more time working on games! (<em>even though I like both web and software development, there needs to be a strong balance in order to keep my sanity and not fall back in the pit of depression and burnout</em>). Obsidian is thankfully extensible, and will get additional features in the future, to make everything cooler.</p>
<p>Additionally, I have already (re)written a sizeable chunk of the 0R8 Wiki using Obsidian, for the ATP website before 0R8 was cancelled / put on hold, but I still want to finish the wiki and publish it on the site. That might happen this summer, when I have the time to write new posts regarding game development (yes, posts, finally!) and capture videos and screenshots needed for the wiki. This would just further display the flexibility of Obsidian as well. Now, Obsidian isn't <em>quite</em> really ready to be used by others. The CSS is more or less done for Obsidian 1.0, but I want to use Web Components to quickly write some useful components that would make it even easier to use, then the VI Docs would gain a section for Obsidian, and docs on how to get started with it. ETA? Who knows.</p>
<p>There's a portfolio page in the works as well, because now that I am <em>sort of</em> freeing up time to make some more stuff, I want to create more website designs and showcase them on that page, besides game projects and software. No ETA, I would first need some designs and projects to showcase over there.</p>
]]></content:encoded>
					<guid>PO-240411-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[re: Why are you still rooting your android? [reddit/1b5dhio]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Sun, 03 Mar 2024 11:48:23 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="why-are-you-still-rooting-your-android%3F-%5Breddit%2F1b5dhio%5D" tabindex="-1">Why are you still rooting your android? [reddit/1b5dhio]</h3>
<p><a href="https://old.reddit.com/r/androidroot/comments/1b5dhio/why_are_you_still_rooting_your_android/kt5ajqt/?context=3">Link to Post, Comment and/or Context</a></p>
<hr>
<ul>
<li>extra volume steps (only achieved through a Magisk module that's modifying the build prop, or certain custom ROMs)</li>
<li>A-GPS SUPL replacer module</li>
<li>microG (system apps)</li>
<li>Rboard flag modifications for Gboard</li>
<li>LSPosed modules</li>
<li>Termux, programs run through Termux such as Btop (task manager with terminal UI, root is needed to read certain data)</li>
<li>VPN (OpenVPN for pDNSf) + personalDNSfilter in root mode (filterlist that allows me to block IP addresses and web addresses in a simple and customizable interface, with support for additional filterlists that can be imported from wherever you want) // Basically always-on VPN + adblocking, malware website blocking, privacy improvements in general because trackers are blocked outright</li>
<li>AFWall+ firewall to block or allow apps to use certain network features such as LAN, Mobile Data, Wi-Fi, VPN</li>
<li>the ability to access /data/data/ for apps that ONLY store their data there, instead of Android/data (e.g. Megapolis. GTA LCS - games that only keep their save files and preferences in /data/data/, so you can't transfer from a different device or use old saves without root)</li>
<li>Lucky Patcher can patch apps using root instead of having to create new modified apps that I need to then reinstall (which might involve backing up the apps' /data/data/ folder to avoid losing data)</li>
<li>unlimited Google Photos storage (can be done through root or through certain custom ROMs, like I do)</li>
<li>Franco Kernel Manager (FKM), can change SELinux policy, undervolt my CPU, GPU, adjust RAM stuff such as zRAM state and size, other Kernel settings, per-app performance profiles, general performance overview through a dashboard</li>
<li>general app/data backup and restore is much easier with root</li>
</ul>
]]></content:encoded>
					<guid>NO-240303-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[re: Facebook app on Android [reddit/1aw9lqi]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Wed, 21 Feb 2024 14:05:45 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="facebook-app-on-android-%5Breddit%2F1aw9lqi%5D" tabindex="-1">Facebook app on Android [reddit/1aw9lqi]</h3>
<p><a href="https://old.reddit.com/r/DeFacebook/comments/1aw9lqi/facebook_app_on_android/krgrie6/?context=3">Link to Post, Comment and/or Context</a></p>
<hr>
<p>Use the website instead of the app, restrict website permissions and tracking. Heck, use Firefox or a privacy-focused fork such as Mull, install some extensions and you'd get even more privacy, combined with ad blocking and some skins or theming.</p>
<p>If you need to use the app, create a Work Profile using Shelter, install the app in it to keep it separate from the rest. Don't allow permissions UNLESS absolutely necessary. Contacts, Call logs, Location, Camera, Microphone, Files access are all sensitive permissions that you should grant carefully. Remove them afterwards if you have to use a feature that requires such a permission once or every once in a while, otherwise it will access them frequently to snoop on you and deliver targeted ads and invade your privacy.</p>
<p>If you want to take it to the extreme, you can try modifying the app, patching it, whatever, so you can deny access to even more stuff. In total, the Facebook app has 88 permissions, Facebook Lite has 70. The majority of these are not directly exposed in the user interface of the system, they're referred to as 'appops'. These much more granular and precise permissions allow Facebook to, in addition to the access granted by the permissions I listed in the paragraph above, access the list of apps installed on the device, access your Google account, access your billing information, control Wi-Fi, NFC, audio settings, prevent your phone from going to sleep (keeping screen awake), etc. These can be disabled through patches with or without root, depending on the app used.</p>
<p>Lucky Patcher (not available on any storefront, has its own dedicated website) works with root and non-root (root = direct patch to installed app, non-root = patch app or APK file, you need to uninstall existing Facebook app before installing patched file). There is also App Ops (available on Google Play) that does this with Shizuku, so you don't need root, but it might be finicky and some features are limited to a purchasable license from Google Play.</p>
]]></content:encoded>
					<guid>NO-240221-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[re: Does anyone know what LGBT people were like back in the stone ages? [reddit/1asmc0g]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Fri, 16 Feb 2024 22:47:25 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="does-anyone-know-what-lgbt-people-were-like-back-in-the-stone-ages%3F-%5Breddit%2F1asmc0g%5D" tabindex="-1">Does anyone know what LGBT people were like back in the stone ages? [reddit/1asmc0g]</h3>
<p><a href="https://old.reddit.com/r/lgbt/comments/1asmc0g/does_anyone_know_what_lgbt_people_were_like_back/kqrqszg/?context=3">Link to Post, Comment and/or Context</a></p>
<hr>
<p>Interesting question. In my opinion, I suppose it would really depend on where they lived. Culture and society would be the major factors that would determine this. Tribes with less education would have more oppression, while the tribes trying to stay ahead of the curve, be progressive and accepting, would be a safer place.</p>
<p>Take hunter-gatherer societies (Paleolithic-Mesolithic): gender roles would be somewhat less rigidly defined, as both men and women performed roughly the same roles: hunting animals, gathering food and supplies, caring for children. Some lived a nomadic lifestyle, where regardless of who you were, you had to adapt, so obviously labor and responsibilities would be again distributed equally. I think in such societies, gender fluidity would be accepted more, as regardless of who you were, you still had the same level of contribution, did the same level of tasks and had to adapt depending on the situation. Men had to take care of children just as well as women, and women had to hunt as well as men.</p>
<p>But in other societies, such as the agricultural societies that appeared later on (Neolithic and later), things would change. Tasks became more specialized, with men engaging more in hard labor such as plowing and animal care, while the women engaged in household activities such as cooking, childcare and hand-crafted stuff such as clothes. I assume this is where gender roles were primarily 'formed', and why they stayed roughly the same until modern times?</p>
<p>Additionally, there was surplus production of goods, which led to wealth accumulation and the development of complex social hierarchies, and where patriarchal systems emerged, and men were the typical holders of power, wealth and authority? Not to mention the wealth accumulation led to the concept of private property - land, housing -, which led to inheritance and an even deeper entrenching of the gender roles, and the reinforcement of male lineage. In such societies, I would assume it wouldn't be a pleasant place to be as a person that would stray away from the gender roles.</p>
]]></content:encoded>
					<guid>NO-240217-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[re: How to delete a Gmail account - and take back your privacy! [reddit/1ams1hw]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Sat, 10 Feb 2024 13:05:55 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="how-to-delete-a-gmail-account---and-take-back-your-privacy!-%5Breddit%2F1ams1hw%5D" tabindex="-1">How to delete a Gmail account - and take back your privacy! [reddit/1ams1hw]</h3>
<p><a href="https://old.reddit.com/r/degoogle/comments/1ams1hw/how_to_delete_a_gmail_account_and_take_back_your/kpse58k/?context=3">Link to Post, Comment and/or Context</a></p>
<hr>
<p>I recommend these websites as well:</p>
<p><a href="https://justwhatsthedata.github.io/">JustWhatsTheData</a> - List of companies and what types of data they collect about you, with some useful color coding</p>
<p><a href="https://justgetmydata.com/">JustGetMyData</a> - Direct links to a good amount of popular websites to download or access the data they have on you</p>
<p><a href="https://justdeleteme.xyz/">JustDeleteMe</a> - Direct links to deleting accounts on popular websites, where possible. Some have black color coding that inform you that you can't delete your account, but this doesn't mean the account can't get banned, for example. Some forums can't delete your account, so you can ask to be banned instead.</p>
]]></content:encoded>
					<guid>NO-240210-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[re: GrapheneOS better than dumb phones? [reddit/1ah5tpt]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Fri, 02 Feb 2024 13:29:07 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="grapheneos-better-than-dumb-phones-%3F-%5Breddit%2F1ah5tpt%5D" tabindex="-1">GrapheneOS better than dumb phones ? [reddit/1ah5tpt]</h3>
<p><a href="https://old.reddit.com/r/degoogle/comments/1ah5tpt/graphene_os_better_than_dumb_phones/koljpjn/?context=3">Link to Post, Comment and/or Context</a></p>
<hr>
<p>Dumb phones have their own advantages - removable batteries, they're simple and the battery lasts longer because of this, they're cheap and disposable - while a new or used Google Pixel currently supported by GrapheneOS might set you back a few hundred bucks.</p>
<p>The only other better alternative to GrapheneOS that I can think of is a theoretical device where you have complete control over the source code used by the hardware, and running a heavily privacy-focused distribution of Linux or BSD. GrapheneOS can't really do more advanced stuff related to connectivity other than the ability to restrict access to cell towers, WiFi, etc, you're just toggling off some stuff, but there's no granular control over this stuff, especially not over the modem, which is separated from the OS anyway, as it should be.</p>
<p>If you can audit and modify the source code of any of the components, you could spot anything that may be tweaked to improve your privacy further. Most smartphone modems are closed source, so you can't know if there's some hardware or software backdoor, or if the modem could be accidentally leaking data. Additionally, you could implement selective network or cell tower access, protocol filtering, the ability to only connect to certain trusted networks. Heck, you could probably expose software to the system to run a VPN and a DNS filter directly on it, for lower CPU and RAM usage, making it the first physical line of defense when it comes to generally blocking website trackers, specific IP and web addresses (through filterlists, for example), and so much more.</p>
<p>Most smartphone modems are proprietary - usually developed by Samsung, Qualcomm, MediaTek - but there are some efforts to develop open-source modems, not specifically for smartphones, but I wouldn't exclude the possibility.</p>
<p>Take IMSI catchers for example, also known as StingRays. They can act as a cell tower and all devices will automatically choose it because of its signal strength over any actual phone towers. The vast majority, if not all, consumer smartphones and dumb phones don't allow you to manually choose a phone tower - heck, depending on the mobile provider, even doing that would be violating their ToS or something.</p>
]]></content:encoded>
					<guid>NO-240202-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[Sapphire Game Engine thread]]></title>
					<link>/posts/2024-01-14-Sapphire-thread.html</link>
					<description>A continuously-updated thread and Fedi comments regarding Sapphire.</description>
					<pubDate>Sat, 13 Jan 2024 22:00:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><strong>NOTE:</strong> This page is kept for historical reasons, but Sapphire Game Engine has been phased out for <a href="/posts/2026-02-24-Lessons-from-PRISONIA-part-1.html">Godot Engine + the Sapphire plugins toolkit</a></p>
<hr>
<h2 id="the-what" tabindex="-1">The What</h2>
<p>Sapphire is Vanta Interactive's internal game engine equivalent to Unreal Engine, in order to reduce our dependencies on critical projects that may change their licensing terms or EULAs at any time, and to better fit our studio's specific needs.</p>
<p>In the past, Sapphire was a custom (from the ground up) built game engine using C++, used ImGui for the user interface, and had a basic plugin system.</p>
<p>As of February 23, 2025, Sapphire is no longer a fully custom game engine. It's a hard fork of <a href="https://github.com/godotengine/godot">Godot Engine</a>, following the <code>master</code> branch, and merging some bigger PRs earlier than upstream.</p>
<p>On top of that, Sapphire expands the functionality using engine modules such as a module to support <code>Dear ImGui</code> (which was previously used in the custom-built Sapphire engine), has ongoing work on bringing closer support for workflows using programs such as <code>MagicaVoxel</code>, <code>Blender</code>, <code>Aseprite</code>, <code>RenderDoc</code> as well as integrations with importers from Source Engine / Source 2, and when time allows, will re-write and optimize the now-abandoned <a href="https://github.com/godotengine/godot-visual-script"><code>godot-visual-script</code></a> module that was removed with Godot 4.0, as I personally do not enjoy working much with GDScript, and would rather use C++, C# and a Blueprints-like visual scripting system.</p>
<p>Sapphire removes support for Apple devices such as macOS, iOS and visionOS, as we don't have plans to target Apple devices. Console support is also unplanned.</p>
<p>And this being a fork, Sapphire benefits from the same PRs and changes from upstream. Sapphire will remain closed-source at this time, however modules such as the visual script module and integrations with other programs may be open-sourced. Sapphire will also aim to improve documentation on existing Godot features as well as new features.</p>
<p>Features previously mentioned in this post such as vertical tabs, a 'license compliance'/dependency dashboard will also be implemented. Sapphire Spark is also in pre-development stages, using the Model Context Protol (MCP), which allows models such as LLMs to interface and interact with the editor.</p>
<h3 id="why-did-you-choose-the-name-sapphire%3F" tabindex="-1">Why did you choose the name Sapphire?</h3>
<p>Sapphire is a gem (<em>generally blue, but there is pink sapphire as well!</em>), and I like gems. Additionally, Sapphire is composed of other things, mainly Corundum, which is a codename for the renderer. And of course, I <em>love</em> codenames, so of course the modules for Sapphire also have names:</p>
<ul>
<li><strong>Apex</strong>: animation tools, keyframe editor, motion capture module</li>
<li><strong>Aster</strong>: (r)aster, ray &amp; path tracing</li>
<li><strong>Aura</strong>: lightning and volumetrics module of Corundum</li>
<li><strong>Basalt</strong>: audio processing, sound design, audio volumetrics module</li>
<li><strong>Boreas</strong>: sky, atmospheric effects</li>
<li><strong>Celest</strong>: celestial body simulation plugin</li>
<li><strong>Corundum</strong>: renderer (overall)</li>
<li><strong>Glacier</strong>: ice, snow, frost simulation</li>
<li><strong>Granite</strong>: data storage, asset management module</li>
<li><strong>Kaida</strong>: foliage, vegetation, flora ecosystem simulation</li>
<li><strong>Litha</strong>: landscape, terrain erosion, sculpting</li>
<li><strong>Mariana</strong>: advanced ocean, sea simulations, sea ecosystems</li>
<li><strong>Nexus</strong>: multiplayer, networking, online features module (overall)</li>
<li><strong>Nimble</strong>: engine’s performance management and optimization tools</li>
<li><strong>Poseidon</strong>: fluid simulation module</li>
<li><strong>Riven</strong>: physics-based destruction, fracture simulation module</li>
<li><strong>Slyph</strong>: advanced particle simulation</li>
<li><strong>Spark</strong>: engine and project-aware helper inspired by IntelliSense, that could expand to have an LLM integration that would be trained and run locally</li>
<li><strong>Terra</strong>: terrain generation, landscape editing, environmental tools module</li>
<li><strong>Volta</strong>: physics simulation (overall)</li>
<li><strong>Zephyr</strong>: wind, air, gas simulation module</li>
</ul>
<h2 id="the-why" tabindex="-1">The Why</h2>
<p>I founded Vanta Interactive with the idea that I could make a lot more software for myself, and of course, the world / the community under a 'business' brand, as opposed to my personal brand, AlexTECPlayz (<em>yes, ATP is not just a username, but it's also my personal brand</em>). It mainly started as a game studio, because I always wanted to make games (<em>I do have many great ideas for games, so why let those ideas go to waste?</em>), but it has now expanded to also being a software and web development studio.</p>
<p>Now, as a game developer, I have ~5 years of experience with Unreal Engine 4 and 5 (as of 2024), but I always had my gripes with Tim Sweeney and Epic Games as a company. The whole Unity thing where they abruptly changed the EULA definitely spurred me to drop everything I was doing in Unreal and go all-in on a custom game engine, simply because there's no telling what changes could happen to Unreal, plus it's just a heavy, monolithic engine that is very resource-intensive and runs like shit on 8GBs of RAM.</p>
<p>Then, there's also some annoying differences between UE4 and UE5 (well, mainly <em>issues</em>), such as <a href="https://techhub.social/@alextecplayz/112287504699406857">UE5 eating up pretty much every bit of RAM you have when you create arrays specifically in Blueprint Struct files</a>, which <a href="https://techhub.social/@alextecplayz/112287777281507338">I presume is either something the Unreal developers didn't notice, or didn't bother fixing</a>, due to all the heavy push for UE5 to come out of Early Access. In comparison, the same Jailbird (<em>PRISONIA</em>) <a href="https://techhub.social/@alextecplayz/112287712283058467">UE4 project hasn't had even a bit of bump in the 865 MBs of RAM memory it was using adding the same amounts, if not more, of arrays</a>. Minor gripe, sure, but add in all of the other reasons I mentioned, and you'd see why I'd want to move away from Unreal to do my own thing. I haven't even listed the reasons from the Docs page:</p>
<ul>
<li>Android support is lacking outside of a few basic configuration options.</li>
<li>If older versions of Unreal Engine are used, such as 4.27.2, they will, by default, use old or unsupported, out-of-date libraries and APIs that will prevent the built Android application from being published to Google Play Store, and other Android platforms that enforce specific versions of APIs.</li>
<li>Unreal’s support for OpenGL ES 3.1 features is disappointing and quite lacking. OpenGL ES 3.2 is available starting from Unreal 5, but this would limit the device support for published Android applications. If an Android game is not graphically intensive, or does not need to use GLES 3.2, there is no need to use Unreal 5.</li>
<li>Not just that, but Unreal feels quite bloated, and a performance hog. Unreal 5 is, by default, much more resource-intensive compared to Unreal 4.</li>
<li>The support for Paper2D is thoroughly disappointing and saddening. Paper2D was introduced in Unreal almost a decade ago, and it is still in Beta, with no significant ongoing development to fully release it into a stable feature. To date, there are no upcoming plans on the public Unreal Engine roadmap to complete Paper2D.</li>
</ul>
<p>I mean, how am I supposed to develop <em>PRISONIA</em> with a performance hog like Unreal that runs like shit on my mid-range Redmi Note 11 even on low settings and low resolution? How could I possibly even think of a mobile version when I'd have to try and somehow dismember the engine and remove some of the problematic performance hogs, as a wholly separate engine (as if Unreal isn't already massive at 30+ GBs per engine installation without counting the source code, and without counting the dozens of GBs of Derived Data Caches per engine, and even more on top of that, per project). How am I supposed to tear down Paper2D and make my own system instead that would work the way I envisioned? No, it's not worth fighting an engine just to make my game(s) work the way I want.</p>
<h2 id="the-when" tabindex="-1">The When</h2>
<p>I started developing Sapphire in December 2023 while toying around with GTK4. I quickly discovered GTK4 wasn't really meant for 'advanced' programs such as a literal game engine, plus it was massive and a pain in the ass to work with. I wouldn't want something as heavy as GTK to possibly become a performance hog on top of whatever performance hog a game engine can become.</p>
<p>In January, I restarted but with Qt6 instead, for which I <a href="https://techhub.social/@alextecplayz/111755914285831968">made a post on January 14, 2024</a> saying how easier it was to use Qt6 - despite it also being a pain in the ass at some points, the Qt6 docs were really helpful to point me in the right direction when implementing something. But Qt also felt limiting. It also felt bloated (I mean, Sapphire Qt6 had dozens of Qt6 dependencies), so I started looking again.</p>
<p>In a moment of sheer genius, I remembered a reddit comment mentioning ImGui a while back that I saved, and I looked at some examples of programs developed with ImGui. I didn't even look at the code, I just dropped ImGui as a submodule in my project's third party folder and got to work. On <a href="https://techhub.social/@alextecplayz/112889354792216487">August 1, 2024 I posted about moving to ImGui</a> with a small showcase of the custom titlebar and an empty window with a barebones vertical 'bar' that is still there today. Moving to ImGui only took a few days, and I breathed so much easier when I finally removed the Qt6 dependencies and toolchains from CMake and my project. Current CMake dependencies? SDL3, GLUT, OpenGL, Vulkan -dev packages to be installed on you system.</p>
<p>In February 2025, I decided that perhaps the best move, considering that I just started a full-time job at the time (<em>which in time, made me more tired and generally less 'in the mood' to code something as complex as an engine from the ground-up)</em> was to migrate to Godot and make Sapphire a hard fork of it.</p>
<h2 id="the-future" tabindex="-1">The Future</h2>
<p>It's June 2025. I'm thinking of quitting my current job because it's made me very tired (especially as I've been transferred to a different department after a small restructuring) and taking a part-time remote job instead. This will allow me to work more on Sapphire (which is already gamedev-ready, considering it's basically Godot with my additions on top), and perhaps even squeeze some time in for projects such as PRISONIA.</p>
<p><em>As a final note, the comments displayed below are from under <a href="https://techhub.social/@alextecplayz/111755914285831968">this post</a> which is used as the 'parent' of Sapphire conversations on my profile.</em></p>
]]></content:encoded>
					<guid>PO-240114-01</guid>
					<category>post</category><category>roadmap</category>
			</item><item>
					<title><![CDATA[re: What is the best way to clean a project to package it [reddit/18wz6kn]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Tue, 02 Jan 2024 20:52:00 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="what-is-the-best-way-to-clean-a-project-to-package-it-%5Breddit%2F18wz6kn%5D" tabindex="-1">What is the best way to clean a project to package it [reddit/18wz6kn]</h3>
<p><a href="https://old.reddit.com/r/UnrealEngine5/comments/18wz6kn/what_is_the_best_way_to_clean_a_project_to/kg1m882/?context=3">Link to Post, Comment and/or Context</a></p>
<hr>
<p>Look into PakBlacklist (<em>deprecated, but still works</em>) and DefaultPakFileRules.ini, where you can exclude files using regex, and you can exclude editor content as well. PakBlacklist would be placed in your project's Build/(platform)/ folder, and DefaultPakFileRules in the project's Config folder.</p>
<p>I use PakBlacklist for Android packaging, and it would look something like this:</p>
<pre><code>../../../Content/GAME_DEV/
../../../Engine/Content/ArtTools
../../../Engine/Content/Maps
../../../Engine/Plugins/Runtime/WebBrowserWidget
../../../Engine/Plugins/Runtime/MeshModellingToolset
../../../Engine/Plugins/Experimental/CommonUI
../../../Engine/Plugins/Media/MediaPlate
../../../Engine/Plugins/Blendables/
../../../Engine/Plugins/Enterprise/
../../../Engine/Plugins/Editor/
../../../Engine/Content/SlateDebug/
../../../Engine/Content/Tutorial/
../../../Engine/Content/Slate/Fonts/
../../../Engine/Content/Slate/Testing/
../../../Engine/Content/Slate/Tutorials/
../../../Engine/Content/Slate/Icons/
../../../Engine/Content/Slate/CrashTracker/
../../../Engine/Content/Slate/Old/
../../../Engine/Content/Slate/Docking/
../../../Engine/Content/Slate/Common/
../../../Engine/Plugins/Runtime/LeapMotionController/
../../../Engine/Plugins/Editor/SpeedTreeImporter/Content/SpeedTree9/game_wind_noise.ubulk
</code></pre>
<p>so I can just remove this content from being packaged in Android builds to save storage space, and to avoid including useless or in-dev content.</p>
<p>The DefaultPakFileRules.ini example is found in (ue4/5 install directory)/Engine/Config/BasePakFileRules.ini and would be placed in your project's Config folder, it would look something like this:</p>
<pre class="language-ini"><code class="language-ini"><span class="token comment">; is used as comment in the file, will be ignored by editor</span>
<span class="token comment">; the rules are applied in order</span>
<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">SectionName</span><span class="token punctuation">]</span></span> ; e.g. ExcludeContentForLinux
<span class="token comment">; Sections might need to follow certain names for it to work properly, so check the source code</span>
<span class="token comment">; or additional documentation where possible. I don't think you can just add a random name to the</span>
<span class="token comment">; section stuff.</span>
<span class="token key attr-name">Platforms</span><span class="token punctuation">=</span><span class="token value attr-value">"<span class="token inner-value">Linux</span>"</span>
<span class="token key attr-name">bExcludeFromPaks</span><span class="token punctuation">=</span><span class="token value attr-value">true</span>
<span class="token comment">; files listed below will be excluded from Pak files entirely</span>
<span class="token key attr-name">+Files</span><span class="token punctuation">=</span><span class="token value attr-value">"<span class="token inner-value">.../Engine/Content/Slate/Tutorials/</span>"</span>
<span class="token key attr-name">+Files</span><span class="token punctuation">=</span><span class="token value attr-value">"<span class="token inner-value">.../Content/GAME_DEV/Materials/dev_*</span>"</span>
<span class="token comment">; regex can be used with * to exclude any files that</span>
<span class="token comment">; have dev_ before the rest of the filename</span>
<span class="token key attr-name">+Files</span><span class="token punctuation">=</span><span class="token value attr-value">"<span class="token inner-value">.../Engine/Plugins/Enterprise/</span>"</span>

<span class="token section"><span class="token punctuation">[</span><span class="token section-name selector">ExcludeContentFromMobile</span><span class="token punctuation">]</span></span>
<span class="token key attr-name">Platforms</span><span class="token punctuation">=</span><span class="token value attr-value">"<span class="token inner-value">Android,iOS</span>"</span>
<span class="token key attr-name">bExcludeFrompaks</span><span class="token punctuation">=</span><span class="token value attr-value">true</span>
<span class="token key attr-name">+Files</span><span class="token punctuation">=</span><span class="token value attr-value">"<span class="token inner-value">.../Content/MobileStarterContent</span>"</span></code></pre>
<p>Now, this will require the manual work of you having to look into what files are USED by the project, from files or folders you wouldn't think they would be used. Do NOT exclude the editor fonts folder if you don't have your own font files, for example, as you will get a warning the files are missing when you start the game on platforms such as Android, which would be unprofessional and a glaring issue if it's a Shipping version. Heck, some content if excluded might just crash the game, so look and test carefully.</p>
<p>Also, you might want to set some file and folder naming conventions. For any additional content you don't use, either delete it altogether or move it to a specific folder and/or subfolder. For development stuff, have a separate folder. Post-launch or DLC content? Their own folder. I use this, for example, and it works well for my use case:</p>
<pre><code>Legend:
GAME_ ; folder, (number) - chunk number
GAME_BASE (100) ; Content that is used by other content, or considered part of the 'base' game, such 
                ; as the non-DLC content
GAME_DEV (990)  ; Content that is used in development and testing, NEVER included or cooked in Shipping
                ; builds
GAME_DLC1 (200) ; Content that is used by DLC1 of the game, that usually isn't used by any follow-up
                ; DLCs or additional content
GAME_DLC2 (300) ; Content that is used by DLC2 of the game
GAME_MODULENAME, EP1, CODENAME, MP, SP (200-890)    ; If you have modules, e.g. a large part of the game,
                                                    ; such as a game mode, episodic content, etc, you may
                                                    ; prefer to have separate GAME_MODULENAME folders for
                                                    ; each, so players could potentially exclude certain
                                                    ; content from being used or installed.
GAME_BONUSCONTENT (995) ; bonus content, such as in-dev showcases in a game museum, soundtrack player,
                        ; other media etc
GAME_SDK, MODDING (950-980) ; If you want to expose additional stuff or have a full-blown SDK, mod kit,
                            ; tools, separate it and ensure players can exclude such content from being
                            ; installed to save space
</code></pre>
<p>alongside PrimaryAssetLabels in each, such as PAL_GAME_BASE that is put in the GAME_BASE folder, helps to tell the editor that the content in this folder (incl. subfolders) is packaged in some way, and put in a certain chunk (e.g. 100) if you use chunking. I recommend to use numbers such as 100, 200, 990, etc. to allow for some leeway in between for patched content or additional content that you might just have to include in a chunk closer to the initial chunk. I consider 0-95 to be the chunks where 'overflow' content such as improperly packaged localization, additional assets I might have missed to exclude might end up in.</p>
]]></content:encoded>
					<guid>NO-240102-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[re: Is it too hard for some to respect my decisions? [reddit/18pgjhp]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Sun, 24 Dec 2023 11:33:39 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="is-it-too-hard-for-some-to-respect-my-decisions%3F-%5Breddit%2F18pgjhp%5D" tabindex="-1">Is it too hard for some to respect my decisions? [reddit/18pgjhp]</h3>
<p><a href="https://old.reddit.com/r/CasualRO/comments/18pgjhp/chiar_le_e_greu_unora_sa_%C3%AEmi_accepte_deciziile/keql1v8/?context=3">Link to Post, Comment and/or Context</a></p>
<p><strong>NOTE:</strong> <em>The original text is in Romanian, but an English version is also provided, as this website is primarily using the English language, not Romanian. Original Romanian post title is 'Chiar le e greu unora sa îmi accepte deciziile ?'</em></p>
<hr>
<p><strong>[Romanian] / [Română]</strong></p>
<p>Aromanticismul și Asexualitatea sunt cât se poate de reale. Vezi:</p>
<ul>
<li>Hammack, P.L., Frost, D.M., &amp; Hughes, S.D. (2018/19). Queer Intimacies: A New Paradigm for the Study of Relationship Diversity. The Journal of Sex Research, 56(4-5), 556-592. - <a href="https://escholarship.org/uc/item/285899t4">eScholarship - UC Santa Cruz</a></li>
<li>Bulmer, M., &amp; Izuma, K. (2018). Implicit and explicit attitudes toward sex and romance in asexuals. The Journal of Sex Research, 55(8), 962-974. - <a href="https://eprints.whiterose.ac.uk/114509/1/Final_manuscript.pdf">White Rose ePrints (PDF)</a></li>
</ul>
<p><strong>[English] / [Engleză]</strong></p>
<p>Aromanticism and Asexuality are as real as they get. See:</p>
<ul>
<li>Hammack, P.L., Frost, D.M., &amp; Hughes, S.D. (2018/19). Queer Intimacies: A New Paradigm for the Study of Relationship Diversity. The Journal of Sex Research, 56(4-5), 556-592. - <a href="https://escholarship.org/uc/item/285899t4">eScholarship - UC Santa Cruz</a></li>
<li>Bulmer, M., &amp; Izuma, K. (2018). Implicit and explicit attitudes toward sex and romance in asexuals. The Journal of Sex Research, 55(8), 962-974. - <a href="https://eprints.whiterose.ac.uk/114509/1/Final_manuscript.pdf">White Rose ePrints (PDF)</a></li>
</ul>
]]></content:encoded>
					<guid>NO-231224-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[re: Am I the only one who started to hate the subject 'Romanian language and literature'? [reddit/18glzip]]]></title>
					<link></link>
					<description><![CDATA[My comment on this reddit post, archived here]]></description>
					<pubDate>Tue, 12 Dec 2023 23:52:08 GMT</pubDate>
					<content:encoded><![CDATA[<h3 id="am-i-the-only-one-who-started-to-hate-the-subject-%22romanian-language-and-literature%22%3F-%5Breddit%2F18glzip%5D" tabindex="-1">Am I the only one who started to hate the subject &quot;Romanian language and literature&quot;? [reddit/18glzip]</h3>
<p><a href="https://old.reddit.com/r/CasualRO/comments/18glzip/doar_eu_am_%C3%AEnceput_s%C4%83_detest_materia_limba_si/kd4f24j/?context=3">Link to Post, Comment and/or Context</a></p>
<p><strong>NOTE:</strong> <em>The original text is in Romanian, but an English version is also provided, as this website is primarily using the English language, not Romanian. Original Romanian post title is 'Doar eu am început să detest materia &quot;limba si literatura română&quot;?'</em></p>
<hr>
<p><strong>[Romanian] / [Română]</strong></p>
<p>Scopul materiei, într-un sistem de educație ca lumea și profesori buni, ar fi de a încuraja și/sau dezvolta gândirea critică, analitică, nu de a memora eseuri lungi de câteva pagini pentru un examen la finalul clasei a XII-a. Majoritatea textelor din programa actuală au un rost dacă le răsfoiești, ce te pot ajuta și astăzi.</p>
<p>Spre exemplu: '<em>Ion</em>' și '<em>Moara cu noroc</em>' te învață despre moralitate, alegeri, consecințe, așteptările din partea societății, '<em>Luceafărul</em>' are teme adânci despre filozofie și romanță, '<em>Plumb</em>' despre simbolism și exprimarea emoțiilor interioare, '<em>Enigma Otiliei</em>' oferă o privire în natura umană, '<em>Moromeții</em>' examinează schimbările culturale în România intre '30 și după cel de-al Doilea Război Mondial, '<em>Iona</em>' despre condiția umană și existența, etc.</p>
<p>Combină asta cu orele de Etică, Psihologie, Filozofie, Logică, cel puțin eu asta am avut pe profilul uman - dar nu ar strica puțin din fiecare și la real, și ajungi o persoană formată care poate să gândească critic, să interpreteze, analizeze și să își exprime ideile coerent. Limbajul poate fi pompos, desigur, dar e pur și simplu cum s-au exprimat autorii operelor respective în acele timpuri, deoarece se punea accentul pe astfel de limbaj. Tu, după ce citești operele și scrii eseurile necesare (apartenența operei X la genul Y, caracterizarea personajului Z, etc), se presupune că ai putut să determini, de unul singur, argumente logice care te ajută să îți susții punctul de vedere în eseul respectiv.</p>
<p>Vrei să dovedești de ce opera '<em>Ion</em>' aparține genului epic? Trebuie să găsești argumentele potrivite care susțin asta. Vrei să dovedești despre personajul Ghiță că este corupt de Lică, ajunge însetat după avere, devine violent, etc - trebuie să determini asta, nu să îți reamintești eseul scris de profa și să îl torni în pagină ca și o copie xerox.</p>
<p>Gramatica este importantă, dar la fel e și gândirea critică. Cum au scris deja și alții, se aplică același lucru și la matematică. Memorezi unele formule de bază, și pe restul ajungi să le deduci tu, după caz. Dacă vrem o 'țară ca afară', oamenii trebuie să poată analiza ce se întâmplă, și să ajungă la concluzia potrivită.</p>
<p>Contează 'norocul' pe care îl ai să ajungi la un profesor, sau o profesoară bună de limba română, care vor ca elevii să se implice cu adevărat, nu să tocească și să reproducă la infinit, și apoi să vomite eseurile predate la clasă în sala de examen. Îți înțeleg frustrarea - nu o să te învețe cum să faci bani, sau alte lucruri care pot fi mai folositoare în viața de zi cu zi, dar ai nevoie și de asta.</p>
<p><em>Scuze dacă am scris prea mult, am nevoie de somn</em> 😅</p>
<p><strong>[English] / [Engleză]</strong></p>
<p>The purpose of the subject, in a proper education system and good teachers, would be to encourage and/or develop critical, analytical thinking, not to memorize essays several pages long for an exam at the end of the twelfth grade. Most of the texts in the current syllabus make sense if you skim through them, which can still help you today.</p>
<p>For example: '<em>Ion</em>' and '<em>Moara cu noroc</em>' teach you about morality, choices, consequences, expectations from society, '<em>Luceafărul</em>' has deep themes about philosophy and romance, '<em>Plumb</em>' about symbolism and the expression of inner emotions, '<em>Enigma Otiliei</em>' ' offers a glimpse into human nature, '<em>Moromeții</em>' examines the cultural changes in Romania between the 1930s and after the Second World War, '<em>Iona</em>' about the human condition and existence, etc.</p>
<p>Combine that with Ethics, Psychology, Philosophy, Logic classes, at least that's what I had on my humanities profile - but it wouldn't hurt to have a little of each in the sciences profile, and you end up a trained person who can think critically, interpret, analyze and to express their ideas coherently. The language can be pompous, of course, but it is simply how the authors of the respective works expressed themselves in those times, because such language was emphasized. You, after reading the works and writing the necessary essays (the belonging of the work X to the genre Y, the characterization of the character Z, etc.), it is assumed that you were able to determine, on your own, logical arguments that help you support your point of view in the essay respectively.</p>
<p>Do you want to prove why the opera '<em>Ion</em>' belongs to the epic genre? You have to find the right arguments to support it. You want to prove about the character Ghiță that he becomes corrupted by Lică, thirsty for wealth, violent, etc. - you have to determine that, not recall the essay written by the professor and pour it on the page like a xerox copy.</p>
<p>Grammar is important, but so is critical thinking. As others have already written, the same applies to math. You memorize some basic formulas, and you end up deducing the rest yourself, as needed. If we want a 'country like outside', people must be able to analyze what is happening, and reach the right conclusion.</p>
<p>It matters the 'luck' you have to reach a good Romanian teacher, or a good Romanian teacher, who want the students to really get involved, not to rote and reproduce endlessly, and then vomit the essays taught in class in exam room. I understand your frustration - it's not going to teach you how to make money, or other things that may be more useful on a day-to-day basis, but you need that too.</p>
<p><em>Sorry if I wrote too much, I need sleep</em> 😅</p>
]]></content:encoded>
					<guid>NO-231213-01</guid>
					<category>note</category>
			</item><item>
					<title><![CDATA[Far Cry 6 - Review [6/10]]]></title>
					<link>/posts/2023-11-17-Far-Cry-6-Review.html</link>
					<description>Far Cry 6 is the perfect slop to play for dozens of hours, with no emotion or depth. It's sadly the most marketable Far Cry game content-wise to date.</description>
					<pubDate>Fri, 17 Nov 2023 20:34:00 GMT</pubDate>
					<content:encoded><![CDATA[<table>
<thead>
<tr>
<th><strong>Game</strong></th>
<th>Far Cry 6</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Developer/Publisher</strong></td>
<td>Ubisoft Toronto / Ubisoft</td>
</tr>
<tr>
<td><strong>Release date</strong></td>
<td>October 7, 2021</td>
</tr>
<tr>
<td><strong>Engine</strong></td>
<td>Dunia</td>
</tr>
<tr>
<td><strong>Anti-cheat</strong></td>
<td>-</td>
</tr>
<tr>
<td><strong>DRM</strong></td>
<td>Ubisoft, Denuvo</td>
</tr>
<tr>
<td><strong>Review platform</strong></td>
<td>PC (Steam, Uplay)</td>
</tr>
<tr>
<td><strong>Also available on</strong></td>
<td>PlayStation 4, PlayStation 5, Google Stadia, Xbox One, Xbox Series XS</td>
</tr>
<tr>
<td><strong>Price</strong></td>
<td>$50-$100</td>
</tr>
<tr>
<td><strong>Warnings about company</strong> (does not count towards Review score)</td>
<td>Toxic workplace, shitty CEO, many games get cut or rushed out the door. Let's not forget the classic Ubisoft formula.</td>
</tr>
<tr>
<td><strong>Additional warnings</strong></td>
<td>END OF LIFE - The game will NOT receive any more updates following Title Update 6, released on November 24, 2022. Online play won't be shut down, probably for a really long time.</td>
</tr>
<tr>
<td><strong>Review score</strong></td>
<td><strong>6/10</strong></td>
</tr>
</tbody>
</table>
<h2 id="tldr" tabindex="-1">TLDR</h2>
<p><em><strong>Far Cry 6 is the perfect slop to play for dozens of hours, with no emotion or depth. It's sadly the most marketable Far Cry game content-wise to date.</strong></em></p>
<p>With almost 200 hours under my belt, I can still play the game endlessly, but I will never feel anything worthwhile. It's just another mediocre game with the same overused Ubisoft formula, now with some additional useless, half-baked features, story, motifs, characters and poor game design. It can be FUN, but only because everything is so silly and stupid.</p>
<p>The series as a whole was never very good, and none of the games would get a score higher than 7/10 from me, but Far Cry 6 is a new low, a 'far cry' from what the series was supposed to be. I was actually hyped for this game, because I like the game's themes and ideas about fascism, the soundtrack, some of the cinematics and trailers, Giancarlo Esposito's performance and typefaces used. This is a disappointment.</p>
<p>Advice: If you want to play the game, ALWAYS buy it on sale, and ALWAYS buy the standard or deluxe edition. The DLCs are not worth any amount of money.</p>
<h2 id="the-good" tabindex="-1">The Good</h2>
<ul>
<li>The Dunia engine is good from a technical standpoint. It has modern features, good performance, the detail is surprisingly good even on the lowest settings (without the HD pack installed)</li>
<li>The weapons look very good, the textures are crisp and sharp even on the lowest settings.</li>
<li>The volumetric clouds are acceptable, but sometimes look questionable. Regardless, the volumetric cloud technology in Dunia cannot hold a candle to the RAGE engine used in Red Dead Redemption II, or Unreal Engine.</li>
<li>The performance of the actors for the 'big characters' - Dani Rojas, Anton Castillo, Juan Cortez, and many others - is very good, especially for Anton Castillo, despite the unfortunately low screen time</li>
<li>Most characters actually have some kind of personality, they can be likable and have some charm</li>
<li>The soundtrack is quite good, but unfortunately I feel like it could have been better. Most songs use a common tone, but that tone isn't serious enough, and even in its current state, the soundtrack's tone does not match the tone of the game, or the characters</li>
<li>The Stranger Things x Far Cry 6 mission (The Vanishing) is actually fantastic, just like the soundtrack. It perfectly combines tones from both the show and the game, and I have listened to it so many times. I'm glad at least one of the crossover missions is good</li>
<li>The only good thing I can say about Ubisoft's launcher and approach to achievements, is that some achievements give the player additional in-game rewards such as money (Moneda or Pesos) or cosmetic unlocks for weapons, weapon charms or vehicles</li>
<li>Surprisingly good vehicle mechanics, with the exception of helicopter control. Try turning a helicopter in this game, it's going to take ages, unless you have a mouse with a button to adjust its sensitivity/DPI</li>
<li>The game runs great on Linux. ALWAYS use Proton Experimental, do not stick to a stable release if you want to play Far Cry 6, as frequent updates to the Ubisoft launcher will render the launcher invisible, and somehow, will prevent the game from ever launching.</li>
</ul>
<h2 id="the-bad" tabindex="-1">The Bad</h2>
<ul>
<li>Game is EOL when it comes to updates. The game will never receive AMD FSR2, FSR3, Intel XeSS, or NVIDIA DLSS 3.5, that could massively improve performance on all systems.</li>
<li>The other two crossover missions, centered around Rambo and Danny Trejo are subpar and mediocre. There's nothing memorable about them.</li>
<li>The 'Lost Worlds' DLC is convoluted, dumb and is not worth any amount of money. Do not buy any of them.</li>
<li>The Season Pass, or the DLC episodes - Vaas: Insanity, Pagan: Control, Joseph: Collapse - are equally dumb and not worth any amount of money.</li>
<li>Unfortunately, this 'character personality' goes out the door when it comes to killing. Imagine, if you will, the same happy-go-lucky people that would dance, sing and drink all day and night would, in a moment's notice, become mercenaries capable of killing hundreds of soldiers. It just doesn't 'click' at all. The characters are also occasionally cringy and seem too happy and cheerful for the supposedly serious tone of the game.</li>
<li>The 'fascist' Yara seems to be so weak. Excluding one mission story, the full military force of the FND is never shown. Even in that mission, it's not really anything impressive, it's just dozens of soldiers and a PG-240 missile.</li>
<li>Anton is a cookie-cutter villain with short-sighted greed and plans, a grandiose ego that continuously needs stroking, and it's not really very ruthless for a supposedly 'fascist' dictator. There was so much potential regarding his role in the game, but it all ends in such a stupid way, that it doesn't even manage to be memorable.</li>
<li>Denuvo will always be a negative. I still strongly believe a game's performance is worse with Denuvo, for the simple objective reason that Denuvo encrypts and decrypts game data ON THE FLY, which is obviously bound to have performance drawbacks. Fuck Denuvo.</li>
<li>The game takes a MONOLITHIC 171GB of storage with all content installed (136GB download) (base game ~ 60GB, optional HD textures - 59GB, the rest is DLC and other language localization files). This size will still be an issue, even after disabling the HD texture download. It's because there is no configuration in the game's Steam depots for the additional DLCs, so you will end up with 111GBs, and you will have to manually slim it down by removing the additional content and languages if you don't need them. Games should NEVER download additional content you do not own, especially if the additional content is gigabytes and gigabytes of precious storage.</li>
<li>Even if the game looks good asset-wise, the experience is rather dull and boring. I don't know why, but it's a similar issue I have with Mafia 3. The game somehow looks washed out at certain times of day, such as noon.</li>
<li>The Dunia engine's good performance still leaves a lot to be desired. The game just doesn't HAVE as much detail as other games, so it should perform much better than it currently does. For example, on my GTX 1650 (running on Linux!), on the lowest settings, 1080P + FSR1 Ultra Quality, I get somewhere between 30-70FPS, most of the time it's a smooth 50-60. In contrast, Red Dead Redemption II would run somewhere around 30-70FPS as well, but mostly somewhere between 30-40FPS, and the game has a lot more detail on the lowest setting.</li>
<li>Mediocre game story with some peaks, but mostly mids and a few lows. The motifs and themes regarding propaganda, truth/lies are massively under-utilized, and it all gets ruined by the un-serious tone of the characters. Everything feels rushed, overlooked and quickly abandoned.</li>
<li>The game feels empty. NPCs don't feel lively, or do anything remotely interesting. They all walk from place to place, although it might not be as obvious as the atrocious NPCs from Cyberpunk 2077. In my old review, I compared the liveliness' to GTA San Andreas, where the NPCs feel much more alive, more fluid and more immersive.</li>
<li>Following a video comparison, Far Cry 6 seems to be a Destiny-like game, with some RPG elements that were first added to Far Cry: New Dawn. I have never noticed this, seeing as how I'm not a fan of RPG games, nor have I played the Far Cry titles that aren't part of the main lineup (e.g. Primal, New Dawn)</li>
<li>The various ammo types are useless. I have used the blast rounds twice in the game, but otherwise I have always used the armor piercing rounds, as I have frequently used stealth, high ground and headshots or melee kills in combat. They wouldn't be useful anyways, even if I were to use a different tactic. The incendiary rounds are so weak, and their implementation is so incredibly stupid. The enemy is on fire, but they keep shooting you, and the fire will put itself out in a matter of seconds. This isn't how incendiary rounds work, Ubisoft, and you probably know that already</li>
<li>Like any other modern Ubisoft game, Far Cry 6 is designed around microtransactions, and the illusion of 'play time' that would make the player believe that it was worth spending so much money on the game and/or additional content (DLC) or microtransactions</li>
<li>TOO MUCH USELESS SIDE CONTENT! It's so delusionally tedious and frustrating to get everything if you're a completionist. Some of the treasure hunts are genuinely alright, they seem to have some care put in, but at the end it's just some dumb cosmetic reward such as a gun pendant or some dumb, underpowered exclusive version of a weapon that I will never use. While you won't completely bore yourself, or have a burnout while trying to collect everything, you won't feel good either, save for very few moments when you have to complete quite decent puzzles to get some of the collectibles.</li>
<li>The addition of PG-240 / PG-240X feels rather forced. Coupled with the claims that Yara keeps the secret formula to themselves, but then they reveal the ingredients and the manufacturing process of the chemical to a private press release shows that Anton's decision to keep PG-240 exclusive to Yara is just a dumb, and useless measure, as the press, and the three-letter agencies from the USA, China or Russia would get their hands on the secrets sooner or later, and would manufacture it for themselves</li>
<li>The Ubisoft launcher is functionally useless, and serves no purpose other than to gatekeep your access behind an additional step. Even if you buy the game on Steam, you WILL have to use their launcher before launching the game. This can take minutes on a hard drive, and Ubisoft launcher updates can actually PREVENT you from playing the game on Linux, as the launcher window will be invisible outside of a slim black frame and shadow. Unless you always use Proton Experimental (in the experimental branch) to ensure the latest support and fixes for Uplay, you will not be able to play the game. Do NOT use regular Proton or Proton-GE, it's not worth the hassle to continuously update to a newer version manually. The ONLY acceptable game launcher is a launcher similar to the one used for the HITMAN World of Assassination trilogy. No account, no useless features, instant launch, the launcher only acts as a way for you to benchmark and edit your game settings without launching the actual game, because you don't always want to launch a game to change one setting</li>
<li>In similar fashion to the embarrassing enemy AI used in the 2020 Watch_Dogs: Legion, Far Cry 6's enemies are essentially BLIND. As long as you have no line of sight, you can hide behind a literal pole and avoid detection. You can shoot enemies in front of other enemies, and you will not get detected. It's extremely easy to run away from any car chases, similar to the embarrassing police chases from Cyberpunk 2077 and its DLC</li>
<li>Anything more than $15-20 is unacceptable for Far Cry 6. The absurd $100 'Game of the Year' edition is an absolute cash grab. The game didn't even get nominated for GOTY, to warrant such an edition in the first place</li>
</ul>
]]></content:encoded>
					<guid>PO-231117-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Call of Duty: Modern Warfare III - Review [3/10]]]></title>
					<link>/posts/2023-11-04-Call-of-Duty-Modern-Warfare-III-Review.html</link>
					<description>Sloppy, lazy and uninspired, Modern Warfare Ⅲ's story is filled with shallow characters, predictable cliches, and the very few good moments cannot hold a candle to previous games in the series. Their attempt to innovate the campaign by introducing 'Open Combat Missions' fails miserably, as it's painfully obvious it's the DMZ mode in singleplayer, and they go as far as to literally lift maps from Warzone and bring them in.</description>
					<pubDate>Sat, 04 Nov 2023 08:59:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><strong>SPOILERS AHEAD! THIS REVIEW CONTAINS SPOILERS!</strong></p>
<table>
<thead>
<tr>
<th><strong>Game</strong></th>
<th>Call of Duty: Modern Warfare Ⅲ</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Developer/Publisher</strong></td>
<td>Sledgehammer Games, Treyarch, Infinity Ward, Beenox, Raven Software, High Moon Studios, Demonware / Activision</td>
</tr>
<tr>
<td><strong>Release date</strong></td>
<td>10 November 2023</td>
</tr>
<tr>
<td><strong>Engine</strong></td>
<td>IW Engine 9.0</td>
</tr>
<tr>
<td><strong>Anti-cheat</strong></td>
<td>RICOCHET</td>
</tr>
<tr>
<td><strong>DRM</strong></td>
<td>Steamworks DRM, Battle.net DRM</td>
</tr>
<tr>
<td><strong>Review platform</strong></td>
<td>PC</td>
</tr>
<tr>
<td><strong>Also available on</strong></td>
<td>PlayStation 4, PlayStation 5, XBOX Series XS, XBOX One, PC (Steam), PC (Battle.net)</td>
</tr>
<tr>
<td><strong>Price</strong></td>
<td>$70 (Standard), $100 (Vault Edition)</td>
</tr>
<tr>
<td><strong>Warnings about company</strong> (does not count towards Review score)</td>
<td>Greedy, anti-consumer, anti-developer (union busting, crunch culture), cancerous microtransaction practices</td>
</tr>
<tr>
<td><strong>Review score</strong></td>
<td><strong>3/10</strong></td>
</tr>
</tbody>
</table>
<h2 id="tldr" tabindex="-1">TLDR</h2>
<p>Sloppy, lazy and uninspired, Modern Warfare Ⅲ's story is filled with shallow characters, predictable cliches, and the very few good moments cannot hold a candle to previous games in the series. Their attempt to innovate the campaign by introducing 'Open Combat Missions' fails miserably, as it's painfully obvious it's the DMZ mode in singleplayer, and they go as far as to literally lift maps from Warzone and bring them in.</p>
<h2 id="the-good" tabindex="-1">The Good</h2>
<ul>
<li>The cinematic cutscenes look good. Heck, the in-engine cutscenes look pretty good too. Some of the setpieces are also detailed and have detailed VFX</li>
<li>The soundtrack sounds nice, some of the songs are really good</li>
<li>Weapon models and sounds are as always, detailed, crisp, and generally you will have a great time using them, in both SP and MP</li>
</ul>
<h2 id="the-bad" tabindex="-1">The Bad</h2>
<ul>
<li>The game was initially a DLC for Modern Warfare Ⅱ, and even rebranded as a third game in the Modern Warfare Universe, it still feels like a DLC because of the campaign</li>
<li>Massive game size on PC (149GB unless Call of Duty HQ and Warzone are installed, 213GB with HQ textures) and console</li>
<li>Could be a bug, but even on the highest settings, the textures look pixelated and blurry</li>
<li>Unfortunately despite some places where the game looks good, the engine shows its age in some places concerning dynamic lightning and shadows. It's also very unfortunate that there aren't that many object physics either</li>
<li>Shallow characters that bring no emotion to the player. Soap's death brings the campaign to an abrupt end, and I felt nothing when he was killed by Makarov. I also felt nothing when in the post-credits cutscene, Shepard dies at the hands of captain Price</li>
<li>Graves is the same character from MWⅡ's campaign, the same shallow 'patriot' that milsimps drool over. His handsome appearance cannot save the fact that he's ultimately not a very interesting character outside a few cutscenes</li>
<li>Makarov seems very toned down, his face can be compared to an infant, his cutscenes are cringeworthy and sleep-inducing</li>
<li>The game plays it safe yet again. While I didn't expect the developers to re-make infamous missions such as 'No Russian', the very few missions and cutscenes concerning civilian casualties or terrorist attacks are short, have no weight or emotional depth</li>
<li>The campaign as a whole is convoluted, seemingly coming to an abrupt end for whatever reason, and is generally very short. If you have played Call of Duty games before, and are quite good at the game, or trying to speedrun it, you could finish it in less than 3 hours. Regular players will finish the campaign in less than 6 hours</li>
<li>The campaign also feels rushed, and I assume it is one of the reasons it comes to such an abrupt end. It's that there was not enough time to continue developing it</li>
<li>When I thought Modern Warfare Ⅱ's campaign was weak, I did not expect Ⅲ's campaign to be even weaker, possibly one of the weakest and worst campaigns in the entire series</li>
</ul>
]]></content:encoded>
					<guid>PO-231104-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[HITMAN World of Assassination - Review]]></title>
					<link>/posts/2023-05-18-HITMAN-World-of-Assassination-Review.html</link>
					<description>The game is now the 'definitive' place to play all 3 HITMAN games from the trilogy, which is great, although I do not agree at all with their decision to unlist HITMAN and HITMAN 2.</description>
					<pubDate>Thu, 18 May 2023 17:32:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="hitman-world-of-assassination%2C-delisting-of-old-games" tabindex="-1">HITMAN World of Assassination, delisting of old games</h2>
<p>The game is now the 'definitive' place to play all 3 HITMAN games from the World of Assassination trilogy, which is great, although I do not agree at all with their decision to unlist HITMAN and HITMAN 2. It's important to preserve those games, since they're awesome and have their own unique things.</p>
<h2 id="freelancer" tabindex="-1">Freelancer</h2>
<p>Now, Freelancer was added, alongside a few bug fixes and small quality of life improvements, but I'm still generally not excited about Freelancer. I don't like rogue-lite games or modes in general, but HITMAN Freelancer feels harder - although that might just be attributed to my lack of interest in rogue-lites. I love the new safehouse and the unlockable content, the trophy case system is great (You get trophies when you complete certain challenges like kill X amount of targets, kill X amount of Syndicate leaders, etc.)</p>
<h2 id="freelancer-improvements" tabindex="-1">Freelancer improvements</h2>
<p>Freelancer has so much more potential though, and after 40 hours of just playing Freelancer, I'm horribly burnt out, not just on Freelancer, but HITMAN as a whole. I haven't gotten most of the trophies, and I'm fine with that. I might be a completionist, but I'm not that stupid to keep playing the same boring stuff over and over, hoping I wouldn't fall asleep or get fatigued with it. The maps aren't really changed compared to the normal 'main' missions. There's so many ideas to improve this though: random times of days for ALL Freelancer maps, which could introduce some more variety to the map 'roster', alongside random scenarios from all the map's missions &amp; escalations available. Say you must visit Hokkaido to take out a Syndicate leader, but if you're 'lucky' to get the Patient Zero scenario, you now have to avoid getting sick with the deadly virus, and the new map changes. It would make for a much more fun and exciting experience, because currently it's pretty much predictable.</p>
<h2 id="hitman-iii" tabindex="-1">HITMAN III</h2>
<p>HITMAN 3/HITMAN World of Assassination, outside of the Freelancer mode is just...fine. I LOVE Dartmoor, especially in Freelancer, but overall it's amazing. I feel like stealth is much better on Dartmoor compared to maps like Chongqing or Ambrose Island. The H3 campaign's final level, Romania, feels like a lost chance to make 47 return to the Institute of Human Betterment to take out the map's main target. I don't know, I don't dislike that we have a train level and that it's highly linear, but I feel like it could have been MUCH better.</p>
<h2 id="main-maps" tabindex="-1">Main maps</h2>
<p>The main maps that I like from H3 are Dartmoor, Berlin and Mendoza. I love the Mastery 20 suit from Dartmoor, I'd buy one in real life, the British countryside atmosphere is very good, Berlin's much darker soundtrack and overall atmosphere makes for a great stealth experience, and Mendoza is just so nice. I love the tango music, I love the setting of the map, the characters are pretty good and have multiple proper scenarios to die, I think I might have spent about 50 hours of non-Steam playtime just on this map alone, with another 20-30 on Steam. Dubai is meh, it's a great tutorial map, Romania is meh, and Chongqing isn't up to my taste, although I can't say it's bad, because the lightning and the rain are great. I just wish now that rain exists as a feature, they might have backported it to Haven Island's stormy weather.</p>
<h2 id="ambrose-island" tabindex="-1">Ambrose Island</h2>
<p>The new Ambrose Island is alright I suppose, it's supposed to be somewhere between Whittleton Creek or Mumbai and Isle of Sgail lore-wise. It's a nice setting, but I'm pretty terrible at trying to stealth through it, and most of the times just end up going in loud.</p>
<h2 id="vr-mode" tabindex="-1">VR mode</h2>
<p>The VR mode is still terrible. Not much has been done about it, PSVR2 support is missing, and because they still broke their promise from the reveal trailer about reloading your weapons. In the trailer, reloading weapons was done by hand, but it's done at the press of a button in-game. Considering many first-person VR games with guns exist - Half-Life: Alyx, Boneworks, Pavlov VR - and they allow players to reload weapons by hand, there's no excuse for this. HITMAN is supposed to be immersive and realistic.</p>
<p>I still hold my position that HITMAN 3 is pretty weak and disappointing, but it does have some great moments. The lore is good, I love a certain cutscene in Chongqing's ICA facility and a certain cutscene in Mendoza, there's plenty of content now that it's a whole trilogy (even if it's still divided into two editions), it's just underwhelming.</p>
<h2 id="past-issues-that-might-still-be-issues-in-the-next-hitman%2Fioi-game" tabindex="-1">Past issues that might still be issues in the next Hitman/IOI game</h2>
<p>I didn't forget about the server issues the game had at launch, for both the Demo and the full game. The game was literally unplayable at launch because of the stupid always-online connectivity requirement, and their lazy excuse was 'to prevent hacking'. The leaderboards' top positions are literally filled with hackers, your always-online crap doesn't work. I use Cheat Engine to modify my weapons' ammo amount and the game doesn't check against the 'server' or anything to see if it's alright for the weapon to have 999999523 bullets in a single magazine. IO Interactive also brokered a one year exclusivity deal with Epig Games Store. PC exclusives are cancer, and should not exist. I get the existence of some console exclusives (e.g. Halo, Horizon, God of War, Forza Horizon, Spider-Man) but there's no reasoning for PC exclusives outside of using a much crappier launcher and store with subpar features that pretends to compete with Steam.</p>
<h2 id="offline-mode" tabindex="-1">Offline mode</h2>
<p>I truly hope that at the end of Year Three, with a winter update, HITMAN World of Assassination will have most of its features - challenges, past Elusive Targets and other content that requires Internet connectivity - to be ported or made available offline. There's not a chance the servers won't be shut down for HITMAN WoA in like 5 years at most, while HITMAN and HITMAN 2's servers in probably 1-3 years.</p>
<h2 id="overall-review" tabindex="-1">Overall review</h2>
<p>Overall, HITMAN World of Assassination and HITMAN 3 are somewhere between fine and great in my opinion. It's not deserving of any GOTY awards or nominations, as it's not groundbreaking or as dark lore-wise as I might have expected, but it's not a forgettable experience either. The game is still the best place to play all 3 games, ESPECIALLY because of the small 80GB size compared to HITMAN 2 Gold + GOTY Legacy Pack being 150GB and HITMAN GOTY being 60GB on PC.</p>
<h2 id="any-potential-big-updates" tabindex="-1">Any potential big updates</h2>
<p>I would love for IOI to create one last big update before the end of Year Three, as I think it's the last year of 'proper' support for HITMAN World of Assassination. I'd love a new campaign similar to Patient Zero, as that campaign was oh so good, in my opinion. Heck, I'd love to have the Sarajevo Six on PC and XBOX, but that's probably not happening, ever, due to a pretty restrictive contract between IOI/Square Enix and SONY that would keep The Sarajevo Six on HITMAN (2016) an exclusive for PlayStation 4. So, if a new campaign or TSS aren't viable, then fixing my gripes with Freelancer, and adding things like random ToD and as many scenarios to the maps as possible would be satisfactory.</p>
<h2 id="pricing" tabindex="-1">Pricing</h2>
<p>If possible, buy the game on sale instead of full price.</p>
<p>Buy it at a lower cost, don't pay more than $60 on this thing. IOI clearly moved most resources to Project 007 and Project Dragon, and with the May update, there's not much content on the horizon in Year Three for HITMAN World of Assassination. I eagerly await the next Hitman game, even if it would be a remake.</p>
<h2 id="still-a-negative-review" tabindex="-1">Still a negative review</h2>
<p>I still maintain my review as a negative review, mostly because this is supposed to be a review for HITMAN 3, not WoA. It's still an underwhelming product that might have been a little overhyped, VR isn't a great experience at all, and the newly introduced Freelancer and Ambrose Island content aren't much better either.</p>
]]></content:encoded>
					<guid>PO-230518-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Visual Overhaul]]></title>
					<link>/posts/2022-12-16-Visual-Overhaul.html</link>
					<description>The website has finally received a fresh visual overhaul! See what is new, here.</description>
					<pubDate>Fri, 16 Dec 2022 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><em>After delays and multiple design prototypes &amp; phases, it's finally here. The new redesign of my website, alongside a domain change from alexhowell2a to alextecplayz.</em></p>
<h2 id="why-would-you-redesign-the-website%3F" tabindex="-1">Why would you redesign the website?</h2>
<p>I always had the idea to create my own design system, and apply it to stuff like websites, and seeing how I wasn't really pleased with the Minimal Mistakes template, I decided that it was the perfect opportunity to finally achieve this idea.</p>
<p>I juggled with lots of ideas, from modern to retro, Linux terminal-like designs, brutalism and minimalism, but I always felt that it wasn't really what I wanted. That's how I (sorta) came up with this design system, that I call Obsidian.</p>
<p>Do keep in mind, that even if the website 'design' is complete, that doesn't mean I won't stop improving upon this design, polishing up stuff like font pairings, colors, and also change it up using accent colours, depending on the season, or event.</p>
<p>This is the current accent colour.</p>
<p>The website will always be in development in my mind, and I will try to be more active, when I have time. Currently, I'm busy with Project Mountain, and some other things, but rest assured I will continue to keep you peeps posted if anything interesting happens.</p>
<h2 id="what-are-your-future-plans%3F" tabindex="-1">What are your future plans?</h2>
<p>Moving forward, I will use the GitHub repo Issues and Projects categories to set up To-Do lists and roadmaps for the website, for example 'Article about the use of matrices in games and Unreal 5, estimated to release December 16', which, at the time of writing this, is already up on the site, ready to read.</p>
<p>The old website has been archived, as I will still use it to link old media from, like thumbnails or CSS.</p>
<p>I'm also working on a media player that goes well with the new website, along other things. Stay tuned for more, soon!</p>
<h2 id="any-updates-on-project-x-or-y%3F-anything-new%3F" tabindex="-1">Any updates on project X or Y? Anything new?</h2>
<p>Project Hangar isn't cancelled, but it's on hold. I expect to work on it again after I wrap up with Project Mountain.</p>
<p>Speaking of, Project Mountain is still going well, still at the primary features development phase, with some concept art and lore being made as well.</p>
<p>Project 'Eiffel' is still viable. Project Odyssey is in early concept phase, with lots of concept art made already, but I don't expect to start development any time soon.</p>
<p>Vanta Interactive's website will get a visual overhaul this year.</p>
<p>Projects BARBET and MOREL are still underway, no new updates yet.</p>
]]></content:encoded>
					<guid>PO-221216-02</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Scrap Mechanic - Review]]></title>
					<link>/posts/2022-12-03-Scrap-Mechanic-Review.html</link>
					<description>I say this with a heavy heart, but Scrap Mechanic's development is really painfully slow even though it's been 6 years in Early Access.</description>
					<pubDate>Sat, 03 Dec 2022 19:18:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="review-tldr" tabindex="-1">Review TLDR</h2>
<p>I say this with a heavy heart, but Scrap Mechanic's development is really painfully slow even though it's been 6 years in Early Access. The game engine they use isn't optimized properly, or can't simply process everything without some lag. The multiplayer experience is down bad, unless you're playing over LAN or you have fast Internet speed, you will experience stutters, net lag, and other similar issues, which can degrade your experience.</p>
<h2 id="modding" tabindex="-1">Modding</h2>
<p>Scrap Mechanic isn't that modder-friendly. Apart from your own custom creations on the Steam Workshop, a few code changes and tweaks here and there, and some texture swaps, you can't really mod the game further. Stuff like adding extra hotbars, settings and much more are in the dev-accessible source code, which the public cannot access, yet. It remains to be seen if Axolot will give us this possibility in the future.</p>
<h2 id="updates" tabindex="-1">Updates</h2>
<p>With a big Challenge Mode overhaul coming in May 2022, and in Q3/Q4 2022 Chapter Two for Survival, the game's updates are... lacking, and it takes months before you can get a small sneak peek at what's coming in the future. It took a long time for the game to get the Survival Mode, which isn't even complete. Some things shown in the trailer are scripted or missing from the current game. Floating boats in Survival? Missing, unless you use &quot;Dev Mode&quot; to get access to the Creative-like parts menu, from where you can build using Creative-only assets that do float. Even without the &quot;Dev Mode&quot; trick, your boat will sink pretty fast, as there's no water physics. Aerodynamics? Missing, but the developers say it's on their list. That remains to be seen.</p>
<p>Do not buy this game if you expect fast, monthly or almost monthly updates. You won't get those.</p>
<h2 id="the-game-engine" tabindex="-1">The Game Engine</h2>
<p>Instead of using a reliable, current-gen game engine like Unreal, or Unity, which support most or all of the things they try to add (aerodynamics - partial support, water physics, advanced physics etc.), among access to technology like Lumen (UE5 only), that could improve the graphics and the performance, they choose to go with what they claim is their own, custom-built game engine. That is not feasible for a 12-developer team that has to work BOTH on the game, and the engine. Custom engines are mostly made by big, AAA studios that have years of programming experience, well-accustomed programmers and a big budget, because making a game engine is a costly, lengthy and intricate process.</p>
<p>It will always be a horrible idea to develop your own game engine if you're a solo dev or you have a small developer team that can help you, and if your budget is basically peanuts. Do NOT do it, there's already better engines out there.</p>
<p>The engine's performance is questionable most of the time, with crashes and performance issues being pretty common if you like using massive creations. This engine cannot even run properly on NVIDIA RTX 3000 series cards without some frame drops, it's that unoptimized and bad. It cannot withstand huge creations or creations that aren't welded to the ground.</p>
<h2 id="platform-support" tabindex="-1">Platform Support</h2>
<p>Currently, Scrap Mechanic has native support for PCs running Windows. Linux players will have to run this game through Steam Play, using Proton or Proton GE, and should expect decreased performance compared to native Windows. I have made a comparison from my PC using a GTX 1650, 8 GBs of RAM and an I7, on both Windows and Ubuntu. Windows had a difference of +40 to even +80 FPS above the Ubuntu version, that with Proton GE and FSR could not manage above 60 FPS, and had constant stutters, on Medium settings.</p>
<p>The Steam Deck runs Scrap Mechanic through Steam Play as well, and you may need a keyboard if the Deck can't mimic a keyboard with the controller. According to ProtonDB, the game has a Silver rating, but you have to tinker with the controls.</p>
<p>There is no console support for Scrap Mechanic yet, and I don't expect them being able to support this. There is also no native controller support. You can emulate the controller through Steam or Steam Big Picture, but the game doesn't support them natively.</p>
<h2 id="creative-mode" tabindex="-1">Creative Mode</h2>
<p>Creative Mode is, for the most part, fun. I have significantly enjoyed Creative Mode more than Survival Mode, due to the Workshop and the big number of items accessible.</p>
<p>It can get boring, though. In my 224 hours of playing SM, I have gotten bored with Creative Mode occasionally.</p>
<h2 id="survival-mode" tabindex="-1">Survival Mode</h2>
<p>Survival Mode is pretty bland. The player constantly needs to fill its Thirst and Hunger bars, otherwise it will start moaning due to thirst and hunger, every few seconds until you either start losing health and finally you die, or until you refill those needs, at least until ~40% of the bar is full.</p>
<p>The enemies are somewhat challenging if you're maybe half-asleep. There's some big balancing issues that have not been resolved yet: the Tapebots. They can kill the player with 2 shots of tape, which is way too overpowered. They have a pretty big range, and they're somewhat similar to aggressive snipers.</p>
<h2 id="challenge-mode" tabindex="-1">Challenge Mode</h2>
<p>Challenge Mode is pretty good, although I never had enough time or creativity to create any Challenge Packs. You can download and play Challenges from the Steam Workshop, some of them are wonderful, and fun.</p>
<h2 id="character-customization" tabindex="-1">Character customization</h2>
<p>You can unlock cosmetics during gameplay, when you find Garment packs of different rarities, which need to be then placed in a Dressbot alongside cotton, to create the garments.</p>
<p>There are no microtransactions, thankfully.</p>
<p>Notice The clothing unlocks you get aren't synced to the Steam Cloud, so if you want to transfer your progress, you will have to copy the files from one device to another. This should be easily fixable by the devs.</p>
<h2 id="anticheat%2Fdrm" tabindex="-1">Anticheat/DRM</h2>
<p>The game uses a custom DRM that prohibits you from playing the game if you're offline.</p>
<p>This is extremely annoying if your Internet provider, or you have no Internet connection. I do not understand why they added this DRM in the first place, it's not like it has anything to protect. It's a simple indie game that's been 6 years in Early Access, with barely anything, not a AAA-level game with a boatload of content. Steamworks DRM should be more than enough for this game.</p>
<p>Notice You MUST start the game while connected to the Internet. Afterwards, you can disconnect and still be able to play, but you'll have to do this every time you start the game.</p>
<h2 id="dedicated-servers" tabindex="-1">Dedicated Servers</h2>
<p>There are no dedicated servers, the multiplayer is Peer-To-Peer, AKA the worst kind of multiplayer you can have. There are no plans to open any dedicated servers, and there are no tools to create a dedicated server. It's pretty simple to make a dedicated machine that runs a SM world: Download the game, launch, open the world you want to be open all the time and simply invite some friends, or from a different machine right click on the Steam username that is running SM and click Join Game.</p>
<h2 id="early-access-for-6-years-and-still-going..." tabindex="-1">Early Access for 6 years and still going...</h2>
<p>I'm baffled that this is even possible, with barely any development. Chapter Two in particular, has been in development for almost 2 years.</p>
<h2 id="conclusion%3A" tabindex="-1">Conclusion:</h2>
<p>If you play this with an Internet connection, KB&amp;M, single-player, on either Creative Mode or Survival Mode, you could get a decent time with the game.</p>
<p>If you are looking for an excellent multiplayer experience, controller support, good performance, no stupid DRM, this is not the game for you. Purchase Brick Rigs instead.</p>
<p>My review will be still Not recommended. I do not recommend you buy this game. I haven't really been pleased with it, from both a gamer and a game developer perspective.</p>
]]></content:encoded>
					<guid>PO-221203-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[An update.]]></title>
					<link>/posts/2022-05-15-An-update.html</link>
					<description>A quick update on what's been going on behind the scenes.</description>
					<pubDate>Sun, 15 May 2022 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="tldr" tabindex="-1">TLDR</h2>
<p>Project Hangar's in development limbo, maybe getting postponed | Project Mountain is going very well, may release earlier than the 2030 estimate | Project 'Eiffel' is in concept stage with early development starting very soon | Website updates alexhowell2a and Vanta Interactive are coming this summer, along with a new brand identity and a few updates on Vanta Interactive | Projects BARBET and MOREL, with MOREL's subprojects are still going pretty strong, although may get delayed a little bit | Kalliope for reddit is getting cancelled | I'm barely using Discord, and I'm recommending Revolt, Signal and Element as alternatives</p>
<h2 id="project-hangar-development-update" tabindex="-1">Project Hangar Development Update</h2>
<p>Project Hangar is in a bit of a limbo right now, with no in-engine or asset development. However, the lore and the story is almost finished, so after that's finalized, I'm getting back to concept stage and I'm hoping that by June i'll be back in full development on it. If something comes up, the project may get postponed a bit, although hopefully nothing'll disrupt its development.</p>
<h2 id="project-mountain-development-update" tabindex="-1">Project Mountain Development Update</h2>
<p>The lore and the story have been started all the way back in 2018 with a few simple ideas, and by now the lore is pretty big, and so is the story. We're already in concept stage and development has started on the game abilities, functions and mechanics.</p>
<p>If everything goes as planned, Project Mountain may release earlier than 2030.</p>
<h2 id="project-'eiffel'-development-update" tabindex="-1">Project 'Eiffel' Development Update</h2>
<p>Last year I have also secretly started another project (I'm sorry, I'm sorry, there's so many good ideas I have that I need to note somewhere and give codenames to, and it's a really good idea)</p>
<p>Lore and story will be developed this autumn or maybe parts of it in summer as well, and development won't start for a while. There's no estimated release date, although if I prioritize Hangar and Mountain, then I'd say 2035 should be fine.</p>
<h2 id="website-refresh" tabindex="-1">Website refresh</h2>
<p>This summer (likely July), I will update both alexhowell2a and Vanta Interactive with a refreshed look. I'm already testing the new refresh on my local server and I'm updating it weekly to meet my arguably high standards. I'm pretty picky, I'm sorry.</p>
<p>Along with these website updates, I will refresh the brand identity for Vanta Interactive, as we'll prepare for new announcements and news on the website. Stay tuned in 2023!</p>
<h2 id="projects-barbet-and-morel%2C-and-morel's-subprojects-development-update" tabindex="-1">Projects BARBET and MOREL, and MOREL's subprojects Development Update</h2>
<p>Things are going very well for all of these, despite GitHub being dead silent. Assuming all goes well, this summer or late autumn I will announce some things related to these.</p>
<h2 id="kalliope-for-reddit-is-getting-cancelled" tabindex="-1">Kalliope for reddit is getting cancelled</h2>
<p>Yes, you've heard it right. Unfortunately, I have done no progress on Kalliope, and there's already a good alternative: Sync for reddit. Now with the new Material You update, the app looks very good and it's way better than the official reddit app.</p>
<h2 id="i'm-barely-using-discord" tabindex="-1">I'm barely using Discord</h2>
<p>I don't really trust Discord, considering its pretty poor security, where a token stealer could compromise your account, Nitro and phishing scams are rampant, and so on. I'm recommending you switch to other, privacy-oriented alternatives.</p>
<p>If you want a very similar-to-Discord experience, Element and Revolt are your best alternatives. I've been using both for a long while and they're good.</p>
<p>If you want a privacy-oriented chat app, Signal's the way.</p>
<h2 id="conclusion" tabindex="-1">Conclusion</h2>
<p>This year, look out for the new website redesigns in July, and stay tuned for BARBET and MOREL-related announcements this summer or in late autumn. 2023 is shaping up to be a good year for announcements from me, so, stay tuned.</p>
<p>More posts on this website are coming soon, as I already have a few planned in the queue. I apologize for the inactivity.</p>
]]></content:encoded>
					<guid>PO-220515-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Apple's 'Unleashed' Event 18 October - Everything revealed]]></title>
					<link>/posts/2021-10-18-Apple-Unleashed-Event.html</link>
					<description>Everything revealed at Apple's event.</description>
					<pubDate>Mon, 18 Oct 2021 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="apple-music" tabindex="-1">Apple Music</h2>
<p>Siri can now play one of the many more new playlists curated by Apple Music's specialists, for a lot of moods or moments in your day. This function is now available to all Apple Music subscribers.</p>
<p>New Apple Music Voice plan that lets you access everything for just $4.99/month using Siri, starts in 17 regions.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/am-voicepl.webp" alt="Apple Music Voice plan banner" title="Apple Music Voice plan banner">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/am-voicepl.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/am-voicepl.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<h2 id="homepod-mini" tabindex="-1">HomePod Mini</h2>
<p>New colours: Yellow, Orange, Blue, available November.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/homepodmini-newcols.webp" alt="All the new colours for the HomePod Mini" title="All the new colours for the HomePod Mini">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/homepodmini-newcols.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/homepodmini-newcols.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<h2 id="airpods-3rd-gen" tabindex="-1">AirPods 3rd Gen</h2>
<p>AirPods 3rd generation look</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/3rdgen-airpods.webp" alt="AirPods 3rd generation" title="AirPods 3rd generation">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/3rdgen-airpods.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/3rdgen-airpods.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/ap-3rdgen.webp" alt="The new design for the AirPods 3rd generation" title="The new design for the AirPods 3rd generation">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/ap-3rdgen.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/ap-3rdgen.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>AirPods 3rd generation case</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/ap-case.webp" alt="The new design for the AirPods 3rd generation case" title="The new design for the AirPods 3rd generation case">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/ap-case.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/ap-case.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>AirPods 3rd generation pricing</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/3rdpods-price.webp" alt="The price of the AirPods 3rd generation" title="The price of the AirPods 3rd generation">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/3rdpods-price.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/3rdpods-price.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<h2 id="mac" tabindex="-1">Mac</h2>
<p>Macbook Pro TLDR banner</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-banner.webp" alt="TLDR; banner for the Macbook Pro" title="TLDR; banner for the Macbook Pro">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-banner.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-banner.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Thickness and weight comparison between the two variants.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-thickness.webp" alt="Photo showing the comparison of the thickness and weight between the two Mac book variants" title="Photo showing the comparison of the thickness and weight between the two Mac book variants">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-thickness.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-thickness.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Keyboard</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-kb.webp" alt="The keyboard" title="The keyboard">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-kb.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-kb.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Left side (ports)</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-leftports.webp" alt="The left ports" title="The left ports">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-leftports.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-leftports.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Right side (ports)</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-rightports.webp" alt="The right ports" title="The right ports">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-rightports.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-rightports.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>TLDR banner with everything new on the Macbook Pro</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-banner.webp" alt="Banner of Macbook Pro" title="Banner of Macbook Pro">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-banner.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-banner.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>TLDR banner with everything new on the M1 PRO</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/m1pro-table.webp" alt="TLDR banner with everything new on the M1 PRO" title="TLDR banner with everything new on the M1 PRO">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/m1pro-table.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/m1pro-table.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>TLDR banner with everything new on the M1 MAX</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/m1max-table.webp" alt="TLDR banner with everything new on the M1 MAX" title="TLDR banner with everything new on the M1 MAX">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/m1max-table.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/m1max-table.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>M1 PRO logo</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-m1pro-logo.webp" alt="M1 Pro logo" title="M1 Pro logo">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-m1pro-logo.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-m1pro-logo.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Big chunky boi</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-m1pro.webp" alt="The M1 Pro chip" title="The M1 Pro chip">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-m1pro.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-m1pro.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>M1 MAX logo</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-m1max-logo.webp" alt="M1 Max logo" title="M1 Max logo">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-m1max-logo.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-m1max-logo.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Huge chonker</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-m1max.webp" alt="The M1 Max chip" title="The M1 Max chip">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-m1max.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-m1max.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>14.2&quot; variant</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-142i.webp" alt="The 14.2 inch Macbook Pro" title="The 14.2 inch Macbook Pro">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-142i.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-142i.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>16.2&quot; variant</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-162i.webp" alt="The 16.2 inch Macbook Pro" title="The 16.2 inch Macbook Pro">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-162i.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-162i.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>The notch's introduction.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-notch.webp" alt="The notch" title="The notch">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-notch.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-notch.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Notch, again.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/MacbookPro-Notch.webp" alt="The notch on the macOS desktop screen" title="The notch on the macOS desktop screen">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/MacbookPro-Notch.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/MacbookPro-Notch.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Some apps will be able to hide the notch.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-editor.webp" alt="A screenshot of a renderer viewport, that displays the title bar under the notch" title="A screenshot of a renderer viewport, that displays the title bar under the notch">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-editor.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-editor.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>10 hours battery life</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-10hrs.webp" alt="10 hours Additional video playback" title="10 hours Additional video playback">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-10hrs.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-10hrs.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p><em>Muffled laughter:</em> Haven't they heard of AMOLED displays!?</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-bestdisplay.webp" alt="World's best notebook display" title="World's best notebook display">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-bestdisplay.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-bestdisplay.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p>Pricing: 14.2 inch MacBook Pro: $1999 | 16.2 inch MacBook Pro: $2499</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/apple-unleashed-2021/mbp-vars.webp" alt="Both laptops" title="Both laptops">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/apple-unleashed-2021/mbp-vars.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alexhowell2a.github.io/master/assets/images/apple/aapl-18-oct-21/mbp-vars.png" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
]]></content:encoded>
					<guid>PO-2110108-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Samsung Galaxy A22 5G Review: Good, on paper]]></title>
					<link>/posts/2021-10-10-Samsung-Galaxy-A22-5G-Review.html</link>
					<description>Learn why the Galaxy A22 5G is not as good as you thought.</description>
					<pubDate>Sun, 10 Oct 2021 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><em>This June's A22 5G is looking impressive on paper, but the software just isn't there. I bought this phone a week ago, it's better in some cases, but sometimes worse than my A10.</em></p>
<h2 id="pros-and-cons" tabindex="-1">Pros and Cons</h2>
<table>
<thead>
<tr>
<th><strong>Pros</strong></th>
<th><strong>Cons</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Better performance, runs most of the latest titles at a good framerate</td>
<td>Impressive on-paper camera specs, in practice it can fail, a lot.</td>
</tr>
<tr>
<td>Impressive 5,000 mAh battery</td>
<td>NFC is region-dependent</td>
</tr>
<tr>
<td>90Hz 6.6&quot; 1080p FHD+ display</td>
<td>A22 4G (LTE) is superior in some ways, and at least $50 cheaper</td>
</tr>
<tr>
<td>Android 11, One UI Core 3.1</td>
<td>One UI Core instead of One UI, even if the phone is more than capable</td>
</tr>
<tr>
<td>5G at an affordable price</td>
<td>-</td>
</tr>
</tbody>
</table>
<h2 id="cameras" tabindex="-1">Cameras</h2>
<p>Cameras are likely a big talking point of most Samsung phones, and while this phone's cameras are acceptable, they fall very short compared to most phones at the same price range.</p>
<p>The Galaxy A22 5G features three rear and one front camera, only one of those can take photos comparable to the Galaxy A10 which I have been using for around a year and a half.</p>
<p>The only camera that can hold a candle to the Galaxy A10 in most cases is the 48MP wide camera. I'm not kidding when I say that the other cameras are a joke. While using the 48MP camera I could not zoom in/out from the Camera app, so that could be an issue for some.</p>
<p>There is no Optical Image Stabilization (OIS) on any cameras on the 5G variant unfortunately, which is quite disappointing. I know Samsung wants to cut corners and make good phones as cheap as they can, but i feel like they could have kept OIS among other features.</p>
<p>The wide camera's photos immediately show that it is weak, and perhaps should have been improved instead of getting downgraded from 8MP to 5MP. Same goes for the nonexistent 2MP macro camera from the 4G variant.</p>
<p>The video resolution is pretty uncommon, 1152P@30Fps, something I've rarely, if ever, encountered before.</p>
<p>It has a Night Mode which is more like Night Vision to me sometimes, a basic Pro mode, Panorama and a Snapchat ripoff mode with animated and static cat and dog ears.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/20211009-210308.webp" alt="Casi, my cockatoo, looking at a photo I took of it" title="Casi, my cockatoo, looking at a photo I took of it">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/20211009-210308.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/20211009-210308.jpg" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p><em>While Casi may like the photo showing how handsome it is, I'm not very pleased with the cameras.</em></p>
<p>Front camera? Same story here, A22 4G is better here as well, even though both look pretty similar and pretty low-res but good enough for video calls.</p>
<h2 id="design" tabindex="-1">Design</h2>
<p>It is one of the more unique designs from the Galaxy A series, along with its 4G counterpart, and the Galaxy A72, A32, A32s, A52 phones, and the newly released A12. It is more common in the Galaxy M series, most notably the Galaxy M22 and the M32.</p>
<figure class="image-frame">
  <img class="post-image-size" src="/images/post-media/20211009-135710.webp" alt="The back of the device, with a matte gradient finish. The phone is set on a wooden table." title="The back of the device, with a matte gradient finish. The phone is set on a wooden table.">
  <div class="image-frame-buttons">
    <a class="image-frame-button rem1 bold grotesk" href="/images/post-media/20211009-135710.webp" title="Maximize the image"><i data-lucide="maximize"></i></a>
    <a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/20211009-135710.jpg" title="Full resolution image"><i data-lucide="image-upscale"></i></a>
  </div>
</figure>
<p><em>The back of the phone, the matte plastic looks very nice, although will slip on a wood surface without a case.</em></p>
<h2 id="battery" tabindex="-1">Battery</h2>
<p>5,000mAh is very respectable in this price range, and well reasoned, considering it has a 90Hz capable display. In my testing, watching YouTube videos at 60Hz, playing Call of Duty Mobile at Medium, 90Hz and a few more games at 90Hz and 60Hz respectively, using Twitter, Instagram and reddit at 90Hz and the casual note taking, it lasted me about a day on a single charge to 100%.</p>
<p>Battery overheating: The battery will heat up to a bit over my comfortable temperature and may get hot, this is likely to happen when using the 15W Fast Charge, which can be disabled from Battery and device care &gt; Battery &gt; More battery settings</p>
<h2 id="performance" tabindex="-1">Performance</h2>
<p>Respectable performance, has decent AR, smooth 90Hz display and very rarely hiccups or lag, heats up during a longer session, but no more than a conformable temperature.</p>
<h2 id="variant-comparison" tabindex="-1">Variant comparison</h2>
<p>See the differences between the variants below.</p>
<table>
<thead>
<tr>
<th><strong>Device / Spec</strong></th>
<th><strong>Galaxy A22 4G</strong></th>
<th><strong>Galaxy A22 5G</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Price</strong></td>
<td>EUR 200</td>
<td>EUR 250</td>
</tr>
<tr>
<td><strong>RAM Memory</strong></td>
<td>4/6GB</td>
<td>4/6/8GB</td>
</tr>
<tr>
<td><strong>Storage</strong></td>
<td>64/128GB</td>
<td>64/128GB</td>
</tr>
<tr>
<td><strong>Rear cameras</strong></td>
<td>Quad camera setup: 48MP OIS Main / 8MP Ultrawide / 2MP Macro / 2MP Depth sensing camera</td>
<td>Triple camera setup: 48MP Main / 5MP Ultrawide / 2MP Depth sensing camera</td>
</tr>
<tr>
<td><strong>Front camera</strong></td>
<td>13MP</td>
<td>8MP</td>
</tr>
<tr>
<td><strong>Display</strong></td>
<td>6.4&quot; Super AMOLED, 90Hz, 720x1600px</td>
<td>6.6&quot; TFT, 90Hz, 1080x2400px</td>
</tr>
<tr>
<td><strong>HDR</strong></td>
<td>Available</td>
<td>No</td>
</tr>
<tr>
<td><strong>NFC</strong></td>
<td>No</td>
<td>Yes (region-dependent)</td>
</tr>
<tr>
<td><strong>Chipset (System-on-Chip)</strong></td>
<td>Mediatek Helio G80, 12nm</td>
<td>Mediatek MT6833 Dimensity 700 5G, 5nm</td>
</tr>
<tr>
<td><strong>Weight</strong></td>
<td>168g</td>
<td>203g</td>
</tr>
<tr>
<td><strong>Main camera max video resolution</strong></td>
<td>1080P@30FPS</td>
<td>1152P@30FPS</td>
</tr>
<tr>
<td><strong>System</strong></td>
<td>Android 11 (OneUI Core 3.1)</td>
<td>Android 11 (OneUI Core 3.1)</td>
</tr>
</tbody>
</table>
<h2 id="conclusion" tabindex="-1">Conclusion</h2>
<p>In my opinion, the phone looks nice, the photos are decent but sometimes worse than my cheaper A10 phone, the performance and battery are good, but I wish Samsung kept the better components from the 4G counterpart.</p>
]]></content:encoded>
					<guid>PO-211010-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Galaxy Unpacked August 2021 - All reveals]]></title>
					<link>/posts/2021-08-11-Galaxy-Unpacked-August-2021.html</link>
					<description>Find out everything Samsung has revealed during the August Unpacked event.</description>
					<pubDate>Wed, 11 Aug 2021 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><em>Galaxy Fold 3 5G, Flip 3 5G, Galaxy Buds 2 &amp; Galaxy Watch 4 series were unveiled today at Samsung's Galaxy Unpacked August 2021 event.</em></p>
<table>
<thead>
<tr>
<th><strong>Device / Spec</strong></th>
<th><strong>Galaxy Z Fold3 5G</strong></th>
<th><strong>Galaxy Flip 3 5G</strong></th>
<th><strong>Galaxy Watch 4</strong></th>
<th><strong>Galaxy Watch 4 Classic</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Operating System</strong></td>
<td>Android 12 (OneUI 3.1.1)</td>
<td>Android 12 (OneUI 3.1.1)</td>
<td>WearOS + OneUI Watch</td>
<td>WearOS + OneUI Watch</td>
</tr>
<tr>
<td><strong>Display</strong></td>
<td>7.8&quot; Dynamic Super AMOLED, 120Hz (inner display) / 6.28&quot; Dynamic Super AMOLED, 120Hz(outer display)</td>
<td>6.7&quot; Dynamic Super AMOLED, 120Hz (inner display) / 1.9&quot; Super AMOLED, 60Hz</td>
<td>1.36&quot; Super AMOLED (44mm) / 1.19&quot; Super AMOLED (40mm)</td>
<td>1.36&quot; Super AMOLED (44mm) / 1.19&quot; Super AMOLED (42mm)</td>
</tr>
<tr>
<td><strong>Processor</strong> (System-on-Chip)</td>
<td>Qualcomm Snapdragon 888, 5nm</td>
<td>Qualcomm Snapdragon 888, 5nm</td>
<td>Samsung Exynos W920, 5nm</td>
<td>Samsung Exynos W920, 5nm</td>
</tr>
<tr>
<td><strong>RAM Memory</strong></td>
<td>8GB LPDDR5</td>
<td>8GB LPDDR5</td>
<td>1.5GB</td>
<td>1.5GB</td>
</tr>
<tr>
<td><strong>Storage</strong></td>
<td>128/256GB</td>
<td>128/256GB</td>
<td>16GB</td>
<td>16GB</td>
</tr>
<tr>
<td><strong>Battery</strong></td>
<td>3300mAh</td>
<td>3300mAh</td>
<td>361mAh (44mm) / 247mAh (40mm)</td>
<td>361mAh (44mm) / 247mAh (42mm)</td>
</tr>
<tr>
<td><strong>Rear cameras</strong></td>
<td>12MP Wide + 12MP Ultrawide + 12MP Telephoto</td>
<td>12MP Wide + 12MP Ultrawide + 12MP Telephoto</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td><strong>Front camera</strong></td>
<td>10MP (Cover) + 4MP (Under-display)</td>
<td>10MP (Under-display)</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td><strong>New features</strong></td>
<td>5G, IPx8 water resistance, Aluminum frame, Gorilla Glass Victus front and back, 120Hz, Stereo Speakers, Night mode camera, Quick Shot 2.0, Exclusive Accessories, S Pen Fold support</td>
<td>5G, IPx8 water resistance, Aluminum frame, Gorilla Glass Victus front and back, 120Hz, Stereo Speakers, Night mode camera, Quick Shot 2.0, Exclusive Accessories</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td><strong>Missing features</strong></td>
<td>3.5mm audio jack, microSD slot</td>
<td>3.5mm audio jack, microSD slot</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td><strong>Colours</strong></td>
<td>Phantom Black, Phantom Green, Phantom Silver</td>
<td>Black, Yellow, Pink, Green</td>
<td>Black, Pink Gold, Silver</td>
<td>Black, Silver</td>
</tr>
<tr>
<td><strong>Pricing</strong></td>
<td>256GB - 1800 EUR</td>
<td>128GB - 1050 EUR</td>
<td>Bluetooth only - 250 EUR / LTE - 300 EUR</td>
<td>Bluetooth only - 270 EUR / LTE - 400 EUR</td>
</tr>
<tr>
<td><strong>Release date</strong></td>
<td>11 August</td>
<td>11 August</td>
<td>27 August, pre-orders 11 August</td>
<td>27 August, pre-orders 11 August</td>
</tr>
</tbody>
</table>
]]></content:encoded>
					<guid>PO-210811-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Terralith is the culmination of Minecraft world generation, and it's a datapack!]]></title>
					<link>/posts/2021-08-08-Terralith-review.html</link>
					<description>Take a look at the amazing world generation Terralith brings to Minecraft - Java Edition!</description>
					<pubDate>Sun, 08 Aug 2021 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><em>I stumbled upon one of AsianHalfSquat's videos, where he showcased a new datapack that is, in my opinion, the holy grail of Minecraft world generation. Combine this with something like Complementary Shaders, and you've got yourself an amazing time in Minecraft.</em></p>
<h2 id="what-does-terralith-add%3F" tabindex="-1">What does Terralith add?</h2>
<p>Terralith adds over 50 new biomes, and modifies most of Minecraft's own biomes and caves, and completely transforms the way the map looks. And get this: it doesn't add any new blocks, it just works!</p>
<h2 id="review" tabindex="-1">Review</h2>
<p>I have tested Terralith on Minecraft 1.17.1 with OptiFabric (Fabric with a mod that supports OptiFine, sort of a Minecraft Forge, but with better performance) and I have to say, from the beginning, this datapack is a game changer.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-15-52-45.webp" alt="A subtle sunset can be seen towards the middle right of the image. In the distance, through the fog, a Plains and Savanna swamp island can be seen. The player is sitting on the shore of a Plains biome peninsula." title="A subtle sunset can be seen towards the middle right of the image. In the distance, through the fog, a Plains and Savanna swamp island can be seen. The player is sitting on the shore of a Plains biome peninsula." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-15-52-45.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-15-52-45.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A subtle sunset can be seen towards the middle right of the image. In the distance, through the fog, a Plains and Savanna swamp island can be seen. The player is sitting on the shore of a Plains biome peninsula.</p>
					</div>
				</figure>
			</div></div>
<p><em>A beautiful sunset</em></p>
<p>I spawned in a spruce forest, in a different place than the actual world spawn, Terralith says it's to 'diversify' the world generation, and to spawn you in a unique place.</p>
<p>Sadly I do not have a screenshot of the forest itself, it wasn't really different from anything in normal Minecraft, apart from a few small oak fence trees (like you'd see in some Minecraft builds, sort of like little palms), and about 6 very, very tall spruce trees, probably 50-60 blocks tall. After a while, I have stumbled upon the place from the image below, and I have continued forward, only to find a very nice swamp island, and I have to say, I'm already impressed.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-15-53-19.webp" alt="The player is sitting on the shore of a Plains biome peninsula, looking ahead towards a Plains and Savanna swamp island." title="The player is sitting on the shore of a Plains biome peninsula, looking ahead towards a Plains and Savanna swamp island." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-15-53-19.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-15-53-19.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The player is sitting on the shore of a Plains biome peninsula, looking ahead towards a Plains and Savanna swamp island.</p>
					</div>
				</figure>
			</div></div>
<p><em>Seeing the swamp island</em></p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-15-54-55.webp" alt="A Plains biome swamp island, seen at night. Ahead there are many swamp oak trees, providing a lot of shadow, making the image very dark." title="A Plains biome swamp island, seen at night. Ahead there are many swamp oak trees, providing a lot of shadow, making the image very dark." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-15-54-55.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-15-54-55.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A Plains biome swamp island, seen at night. Ahead there are many swamp oak trees, providing a lot of shadow, making the image very dark.</p>
					</div>
				</figure>
			</div></div>
<p><em>On the island</em></p>
<p>I swear, this looks fantastic. Combined with the nice SSR (screenspace reflections) and the amazing shadows and light the Complementary Shaders provide, it's a sight to behold. Moving forward, I found a pond on the island, with small logs and lily pads floating on it.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-15-55-11.webp" alt="A Plains biome swamp lagoon seen at night, overlooking the water and some swamp trees. Some mushrooms, floating oak logs and lily pads are seen." title="A Plains biome swamp lagoon seen at night, overlooking the water and some swamp trees. Some mushrooms, floating oak logs and lily pads are seen." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-15-55-11.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-15-55-11.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A Plains biome swamp lagoon seen at night, overlooking the water and some swamp trees. Some mushrooms, floating oak logs and lily pads are seen.</p>
					</div>
				</figure>
			</div></div>
<p><em>Swamp lagoon</em></p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-15-55-32.webp" alt="Floating logs in a Savanna lagoon, with tall acacia trees and vine leaves, seen at night." title="Floating logs in a Savanna lagoon, with tall acacia trees and vine leaves, seen at night." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-15-55-32.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-15-55-32.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;Floating logs in a Savanna lagoon, with tall acacia trees and vine leaves, seen at night.</p>
					</div>
				</figure>
			</div></div>
<p><em>Floating logs</em></p>
<p>After looking around this island, I swam to the shore, and moved up a hill, only to find a very grassy plains field and a village.</p>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-15-55-59.webp" alt="A village in the Plains biome, which is extremely grassy, seen at night from the sky. The village is lit up." title="A village in the Plains biome, which is extremely grassy, seen at night from the sky. The village is lit up." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-15-55-59.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-15-55-59.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A village in the Plains biome, which is extremely grassy, seen at night from the sky. The village is lit up.</p>
					</div>
				</figure>
			</div></div>
<p><em>Plains village, and a LOT of grass!</em></p>
<p>OK, enough chit-chat and weird silly story, here are more images, and then my final words on this datapack.</p>
<h2 id="gallery" tabindex="-1">Gallery</h2>
<div class="flex row overflow-scroll" vocab="https://schema.org/" typeof="ImageObject" itemscope itemtype="https://schema.org/ImageObject"><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-15-59-20.webp" alt="Player looking towards the starry sky at night. The light of a torch can be seen ahead as the player wields a torch that isn't visible in the screenshot. They are in a Taiga biome, overlooking a tall diorite, dirt and stone hill ahead, with tall spruce trees." title="Player looking towards the starry sky at night. The light of a torch can be seen ahead as the player wields a torch that isn't visible in the screenshot. They are in a Taiga biome, overlooking a tall diorite, dirt and stone hill ahead, with tall spruce trees." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-15-59-20.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-15-59-20.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;Player looking towards the starry sky at night. The light of a torch can be seen ahead as the player wields a torch that isn't visible in the screenshot. They are in a Taiga biome, overlooking a tall diorite, dirt and stone hill ahead, with tall spruce trees.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-01-02.webp" alt="Two, smaller water ponds in a Taiga biome. They are separated by a thin diorite and dirt shore. The water ponds are surrounded by yellow and orange terracotta, dirt and diorite. The second pond, located in the right half of the image, has some glowing magma blocks in the center visible through the water." title="Two, smaller water ponds in a Taiga biome. They are separated by a thin diorite and dirt shore. The water ponds are surrounded by yellow and orange terracotta, dirt and diorite. The second pond, located in the right half of the image, has some glowing magma blocks in the center visible through the water." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-01-02.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-01-02.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;Two, smaller water ponds in a Taiga biome. They are separated by a thin diorite and dirt shore. The water ponds are surrounded by yellow and orange terracotta, dirt and diorite. The second pond, located in the right half of the image, has some glowing magma blocks in the center visible through the water.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-01-26.webp" alt="A large, star-shaped water pond separating the Taiga biome, seen in the bottom half of the image, of the Savanna biome, seen in the top half of the image. To the bottom right of the screen, a flat diorite area can be seen. To the bottom left of the image, a small diorite and grass cliff can be seen, above the water pond. A spruce tree is seen on the cliff edge. To the bottom middle of the image, another diorite and grass cliff can be seen, with multiple, taller spruce trees. In the center, and in the top left corner of the water pond, some glowing magma blocks can be seen in the water. The pond is surrounded on all sides by yellow and orange terracotta, with some dirt." title="A large, star-shaped water pond separating the Taiga biome, seen in the bottom half of the image, of the Savanna biome, seen in the top half of the image. To the bottom right of the screen, a flat diorite area can be seen. To the bottom left of the image, a small diorite and grass cliff can be seen, above the water pond. A spruce tree is seen on the cliff edge. To the bottom middle of the image, another diorite and grass cliff can be seen, with multiple, taller spruce trees. In the center, and in the top left corner of the water pond, some glowing magma blocks can be seen in the water. The pond is surrounded on all sides by yellow and orange terracotta, with some dirt." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-01-26.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-01-26.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A large, star-shaped water pond separating the Taiga biome, seen in the bottom half of the image, of the Savanna biome, seen in the top half of the image. To the bottom right of the screen, a flat diorite area can be seen. To the bottom left of the image, a small diorite and grass cliff can be seen, above the water pond. A spruce tree is seen on the cliff edge. To the bottom middle of the image, another diorite and grass cliff can be seen, with multiple, taller spruce trees. In the center, and in the top left corner of the water pond, some glowing magma blocks can be seen in the water. The pond is surrounded on all sides by yellow and orange terracotta, with some dirt.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-01-56.webp" alt="A small, 10-block wide Savannah island filled with grass. The island is in the middle of a very large, round water pond. In the middle there is an acacia tree with some trees, as the rest are placed at the bottom, as if the leaves fell off. A sunset can be seen to the right. To the right of the image a hill with spruce trees and diorite can be seen, presumably a Taiga biome. To the left, and ahead, the Savanna biome can be seen, with more acacia trees with vines hanging off their leaves." title="A small, 10-block wide Savannah island filled with grass. The island is in the middle of a very large, round water pond. In the middle there is an acacia tree with some trees, as the rest are placed at the bottom, as if the leaves fell off. A sunset can be seen to the right. To the right of the image a hill with spruce trees and diorite can be seen, presumably a Taiga biome. To the left, and ahead, the Savanna biome can be seen, with more acacia trees with vines hanging off their leaves." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-01-56.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-01-56.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A small, 10-block wide Savannah island filled with grass. The island is in the middle of a very large, round water pond. In the middle there is an acacia tree with some trees, as the rest are placed at the bottom, as if the leaves fell off. A sunset can be seen to the right. To the right of the image a hill with spruce trees and diorite can be seen, presumably a Taiga biome. To the left, and ahead, the Savanna biome can be seen, with more acacia trees with vines hanging off their leaves.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-02-13.webp" alt="The player is staring directly at the sunset, with godrays protruding through acacia trees with vines, in a desert biome next to a large river. To the right of the image a hill with spruce trees and diorite can be seen, presumably a Taiga biome. A very tall and steep sand tower can be seen." title="The player is staring directly at the sunset, with godrays protruding through acacia trees with vines, in a desert biome next to a large river. To the right of the image a hill with spruce trees and diorite can be seen, presumably a Taiga biome. A very tall and steep sand tower can be seen." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-02-13.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-02-13.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The player is staring directly at the sunset, with godrays protruding through acacia trees with vines, in a desert biome next to a large river. To the right of the image a hill with spruce trees and diorite can be seen, presumably a Taiga biome. A very tall and steep sand tower can be seen.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-03-06.webp" alt="A desert water pond after noon, with very tall and steep sandstone cliffs." title="A desert water pond after noon, with very tall and steep sandstone cliffs." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-03-06.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-03-06.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A desert water pond after noon, with very tall and steep sandstone cliffs.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-03-45.webp" alt="A desert water pond after noon, with very tall and steep sandstone cliffs. There are some tall acacia trees with vines. Two desert village houses made from sandstone are seen next to the pond." title="A desert water pond after noon, with very tall and steep sandstone cliffs. There are some tall acacia trees with vines. Two desert village houses made from sandstone are seen next to the pond." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-03-45.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-03-45.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A desert water pond after noon, with very tall and steep sandstone cliffs. There are some tall acacia trees with vines. Two desert village houses made from sandstone are seen next to the pond.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-03-56.webp" alt="A desert water pond after noon, with very tall and steep sandstone cliffs. There are some tall acacia trees with vines." title="A desert water pond after noon, with very tall and steep sandstone cliffs. There are some tall acacia trees with vines." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-03-56.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-03-56.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A desert water pond after noon, with very tall and steep sandstone cliffs. There are some tall acacia trees with vines.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-04-42.webp" alt="A red desert peninsula at noon, with some acacia trees that have vines, similar to the oak trees with vines seen in the Swamp biome." title="A red desert peninsula at noon, with some acacia trees that have vines, similar to the oak trees with vines seen in the Swamp biome." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-04-42.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-04-42.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A red desert peninsula at noon, with some acacia trees that have vines, similar to the oak trees with vines seen in the Swamp biome.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-05-50.webp" alt="A vast grass field in the Plains biome. To the left, some spruce and birch trees can be seen, both on a small hill and on a tall, steep mountain. A small floating island is between the hill and the steep mountain." title="A vast grass field in the Plains biome. To the left, some spruce and birch trees can be seen, both on a small hill and on a tall, steep mountain. A small floating island is between the hill and the steep mountain." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-05-50.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-05-50.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A vast grass field in the Plains biome. To the left, some spruce and birch trees can be seen, both on a small hill and on a tall, steep mountain. A small floating island is between the hill and the steep mountain.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-06-15.webp" alt="A cramped cave at noon, seen from the inside. Glowing berries, cave vines and dripleaves can be seen inside." title="A cramped cave at noon, seen from the inside. Glowing berries, cave vines and dripleaves can be seen inside." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-06-15.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-06-15.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A cramped cave at noon, seen from the inside. Glowing berries, cave vines and dripleaves can be seen inside.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-12-10.webp" alt="A sunrise to the left of the image, godrays protruding the small Savanna biome island. In the water there are some floating oak and stripped oak wood, and some lilypads." title="A sunrise to the left of the image, godrays protruding the small Savanna biome island. In the water there are some floating oak and stripped oak wood, and some lilypads." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-12-10.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-12-10.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A sunrise to the left of the image, godrays protruding the small Savanna biome island. In the water there are some floating oak and stripped oak wood, and some lilypads.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-15-04.webp" alt="A river at night, looking towards the starry sky. The river separates the Plains biome from the left of the image, and the Savanna biome from the right of the image." title="A river at night, looking towards the starry sky. The river separates the Plains biome from the left of the image, and the Savanna biome from the right of the image." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-15-04.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-15-04.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A river at night, looking towards the starry sky. The river separates the Plains biome from the left of the image, and the Savanna biome from the right of the image.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-17-56.webp" alt="The savanna at night. There are some shallow ravines to the left and to the right of the image." title="The savanna at night. There are some shallow ravines to the left and to the right of the image." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-17-56.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-17-56.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;The savanna at night. There are some shallow ravines to the left and to the right of the image.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/14707386-xl.webp" alt="Looking at the sunset in a very tall, and steep badlands biome." title="Looking at the sunset in a very tall, and steep badlands biome." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/14707386-xl.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;Looking at the sunset in a very tall, and steep badlands biome.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-05-20.webp" alt="A rocky, yet flat area covered in diorite and cobblestone." title="A rocky, yet flat area covered in diorite and cobblestone." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-05-20.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-05-20.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A rocky, yet flat area covered in diorite and cobblestone.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-06-26.webp" alt="A cave with glowing berries, cave vines and dripleaves." title="A cave with glowing berries, cave vines and dripleaves." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-06-26.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-06-26.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A cave with glowing berries, cave vines and dripleaves.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-07-36.webp" alt="Very tall spruce and birch trees on a small peninsula surrounded by water." title="Very tall spruce and birch trees on a small peninsula surrounded by water." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-07-36.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-07-36.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;Very tall spruce and birch trees on a small peninsula surrounded by water.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-09-48.webp" alt="A river surrounded to the left and right by Plains hills." title="A river surrounded to the left and right by Plains hills." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-09-48.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-09-48.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;A river surrounded to the left and right by Plains hills.</p>
					</div>
				</figure>
			</div><div class="flex column">
				<figure class="image-frame">
					<img property="contentUrl" itemprop="contentUrl" class="post-image-size" src="/images/post-media/terralith/2021-08-08-16-13-28.webp" alt="Sunflowers facing away from the sun, and a large oak tree on a steep hillside in the Plains biome. The player is facing away from the sunset." title="Sunflowers facing away from the sun, and a large oak tree on a steep hillside in the Plains biome. The player is facing away from the sunset." loading="lazy">
					<span class="hidden" property="license" itemprop="license">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="acquireLicensePage" itemprop="acquireLicensePage">https://alextecplayz.com/licensing.html</span>
					<span class="hidden" property="copyrightNotice" itemprop="copyrightNotice">Unknown</span>
					<span class="hidden" property="creditText" itemprop="creditText">Unknown</span>
					<span class="hidden" rel="schema:creator">
						<span typeof="schema:Person" itemprop="creator" itemtype="https://schema.org/Person" itemscope>
							<span property="schema:name" itemprop="name" content="Unknown person(s)"></span>
						</span>
					</span>
					<div class="image-frame-buttons"><a class="image-frame-button rem1 bold grotesk" href="/images/post-media/terralith/2021-08-08-16-13-28.webp" title="Maximize the image"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize"><path d="M8 3H5a2 2 0 0 0-2 2v3"></path><path d="M21 8V5a2 2 0 0 0-2-2h-3"></path><path d="M3 16v3a2 2 0 0 0 2 2h3"></path><path d="M16 21h3a2 2 0 0 0 2-2v-3"></path></svg></a><a class="image-frame-button rem1 bold grotesk" href="https://raw.githubusercontent.com/alextecplayz/alextecplayz.github.io-media/refs/heads/main/images/terralith-review/2021-08-08-16-13-28.png" title="Full resolution"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-image-upscale"><path d="M16 3h5v5"></path><path d="M17 21h2a2 2 0 0 0 2-2"></path><path d="M21 12v3"></path><path d="m21 3-5 5"></path><path d="M3 7V5a2 2 0 0 1 2-2"></path><path d="m5 21 4.144-4.144a1.21 1.21 0 0 1 1.712 0L13 19"></path><path d="M9 3h3"></path><rect x="3" y="11" width="10" height="10" rx="1"></rect></svg></a><p class="image-frame-alt rem0-75 lightgray monospace medium"><strong>ALT:</strong>&nbsp;Sunflowers facing away from the sun, and a large oak tree on a steep hillside in the Plains biome. The player is facing away from the sunset.</p>
					</div>
				</figure>
			</div></div>
<h2 id="final-words-on-the-datapack" tabindex="-1">Final words on the datapack</h2>
<p>Terralith is a game changer, it feels natural but also new, there's a lot of biomes to see and admire, there's more things to do if you ever get bored of normal Minecraft gameplay, or the normal world generation, and it's a worthy competitor to the upcoming Minecraft 1.18 world generation update (Caves &amp; Cliffs Part II), coming this holiday. <a href="https://www.curseforge.com/minecraft/mc-mods/terralith">Go check out Terralith for yourself</a>, and enjoy possibly THE best world generation change in Minecraft.</p>
]]></content:encoded>
					<guid>PO-210808-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[New YouTube gesture feature, now in testing]]></title>
					<link>/posts/2021-08-07-New-YouTube-gesture-feature.html</link>
					<description>YouTube is getting a new feature probably no one asked for. Here is my opinion.</description>
					<pubDate>Sat, 07 Aug 2021 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<h2 id="what-is-it" tabindex="-1">What is it</h2>
<p>The new feature is called Seek, and it's a gesture on the video screen. Slide your finger either right or left to scrub to a certain point in the video. When the gesture is activated, a pop message appears on the screen that reads, “Slide left or right to seek.”</p>
<h2 id="flaws" tabindex="-1">Flaws</h2>
<p>Accidents. Sliding your finger by mistake, possibly to clean your screen from dust and dirt will make the video almost always send you to the beginning or the end of the video, requiring you to either slide again, more accurately back to where you were previously, or to scrub on the seek bar, because YouTube felt it was unnecessary to have a basic feature of just tapping where you want to go on the video.</p>
]]></content:encoded>
					<guid>PO-210807-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[Pixel 6 Series announced]]></title>
					<link>/posts/2021-08-03-Pixel-6-announced.html</link>
					<description>Pixel 6 and Pixel 6 Pro are official!</description>
					<pubDate>Tue, 03 Aug 2021 14:06:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><em>After months of waiting for official news from Google on the Pixel 6 lineup, Google broke the silence with some pretty promising words, like the phone's capabilities and specifications, along with a release date: this fall. Both the Google Pixel 6 and the 6 Pro will be powered by Google's new SOC (System-on-Chip), Tensor, which Google claims to be a competitor to the latest chips from Qualcomm, Huawei, Apple and Samsung.</em></p>
<h2 id="specifications" tabindex="-1">Specifications</h2>
<table>
<thead>
<tr>
<th><strong>Device/Spec</strong></th>
<th><strong>Pixel 6</strong></th>
<th><strong>Pixel 6 Pro</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Operating System</strong></td>
<td>Android 12</td>
<td>Android 12</td>
</tr>
<tr>
<td><strong>Display</strong></td>
<td>6.4&quot; Full HD AMOLED, 90Hz</td>
<td>6.71&quot; Quad HD AMOLED, 120Hz</td>
</tr>
<tr>
<td><strong>Chip</strong> (System-on-Chip)</td>
<td>Google Tensor, 5nm, Octa-Core</td>
<td>Google Tensor, 5nm, Octa-Core</td>
</tr>
<tr>
<td><strong>RAM Memory</strong></td>
<td>8GB RAM</td>
<td>16GB RAM</td>
</tr>
<tr>
<td><strong>Storage</strong></td>
<td>128/256GB</td>
<td>128/256/512GB</td>
</tr>
<tr>
<td><strong>Battery</strong></td>
<td>4614mAh</td>
<td>5000mAh</td>
</tr>
<tr>
<td><strong>Rear cameras</strong></td>
<td>50MP Wide + 12MP Ultrawide up to 4K@60FPS</td>
<td>50MP Wide + 12MP Ultrawide + 48MP Telephoto up to 4K@60FPS</td>
</tr>
<tr>
<td><strong>Front camera</strong></td>
<td>8MP up to 1080P@30FPS</td>
<td>8MP up to 1080P@30FPS</td>
</tr>
<tr>
<td><strong>New features</strong></td>
<td>Better AI photo processing, better AI speech recognition, better AI captioning, 5G, water and dust resistant, Auto-HDR, Panorama, Video Stabilization, unblur photos using AI, under-display fingerprint sensor, fast charging, wireless charging, reverse charging, power delivery 3.0, new camera sensor</td>
<td>Better AI photo processing, better AI speech recognition, better AI captioning, 5G, water and dust resistant, Auto-HDR, Panorama, Video Stabilization, unblur photos using AI, under-display fingerprint sensor, fast charging, wireless charging, reverse charging, power delivery 3.0, new camera sensor</td>
</tr>
<tr>
<td><strong>Missing features</strong></td>
<td>3.5mm audio jack, microSD card slot, 48MP Telephoto (Pixel 6 Pro only)</td>
<td>3.5mm audio jack, microSD card slot</td>
</tr>
<tr>
<td><strong>Colours</strong></td>
<td>Black, White w/Lime above camera bar, Pale red w/Red above camera bar</td>
<td>Black, White, Yellow</td>
</tr>
</tbody>
</table>
<h2 id="cameras" tabindex="-1">Cameras</h2>
<p>After such a long time, Google has finally changed their camera sensors. Up until this lineup, Google has used Google Pixel 2’s camera sensor on all of their phones - which isn’t bad, especially because it also has AI by its side, but it’s certainly a welcome change.</p>
<p>Google has shown a few different features they promise to integrate with this new lineup, most notably a new face unblurring feature.</p>
<p>They’ve shown a video with a moving toddler, whose face was pretty blurry. Using their new AI from the TPU module, the phone managed to sharpen the face by taking multiple photos. Keep in mind, this was a Google-provided video showing the phone’s very best capabilities, therefore the phone may not take such good videos when the consumers get their hands on the phones.</p>
<h2 id="the-new-tensor-chip" tabindex="-1">The new Tensor chip</h2>
<p>Google's new SoC is focused mostly on AI, and they claim it was 4 years into production. As I mentioned in the Camera section, their new TPU (Tensor Processing Unit) module is capable of unblurring faces on videos with a lot of motion, but that's just one of the new AI features. In addition, this new SoC can apply AI and computational photography to video, such as automatically adjusting HDR and the white balance of a video.</p>
<p>It can also use the TPU module to provide better, instantaneous captioning to media being played on the phone, it can let you edit text while using text-to-speech and much, much more.</p>
<p>It is unclear yet how the actual performance of the chip is, so this remains unknown at the time of writing.</p>
<h2 id="battery" tabindex="-1">Battery</h2>
<p>The Pixel phones’ battery life has never been good, especially when you compare them to Samsung or Apple’s flagships, which can last a lot more. With the Pixel 6 lineup, Google promises “all day” endurance, which is a bit disappointing for some people who aren’t accustomed to the battery life of Google phones.</p>
<p>The Pro variant comes with 5000 mAh while the base variant comes with 4614 mAh, both will feature faster wireless charging because Google is reportedly developing a better Pixel Stand which will decrease the time needed for the phones to charge wirelessly, and the new phones will feature a new change in the Battery menu, a new setting which helps optimize the battery charging, for example the battery will slowly charge overnight to something like 90%, and close to when the alarm rings, it will charge the phone to 100%, to not overcharge and decrease the battery life. Other phones from manufacturers like Sony and Samsung had this option for years, so it’s good to see Google adding this feature.</p>
<h2 id="my-opinion" tabindex="-1">My Opinion</h2>
<p>The new Google Pixel 6 and the Pixel 6 Pro look strikingly similar to Samsung's Galaxy Note lineup, perhaps Google wanted to release the Note 21 we never received this year, due to chip shortages and other issues on Samsung's side. The slightly curved screen on the phone's edges are similar to the older Galaxy S8 and S9 phones, while the glossy aluminum rails on the sides are certainly similar to the Samsung Galaxy Note phones. The selfie camera hole also looks like it's inspired by the Note 10/20's look. The back of the phone is made out of glass, and if I'd get this phone, I would certainly put a case on it, mostly to avoid scratches and to have my phone at a normal angle instead of a slightly raised top.</p>
]]></content:encoded>
					<guid>PO-210803-01</guid>
					<category>post</category>
			</item><item>
					<title><![CDATA[HITMAN 2 Review]]></title>
					<link>/posts/2021-06-03-HITMAN-2-Review.html</link>
					<description>Per-map review for al three games in the World of Assassination trilogy</description>
					<pubDate>Thu, 03 Jun 2021 17:21:00 GMT</pubDate>
					<content:encoded><![CDATA[<p><strong>I will review the game on a MAP-BY-MAP basis, for all three games in the World of Assassination trilogy in this review.</strong></p>
<h2 id="hitman-(2016)-maps" tabindex="-1">HITMAN (2016) maps</h2>
<ul>
<li>RECOMMENDED (generally)</li>
</ul>
<h3 id="ica-facility%2C-greenland---recommended" tabindex="-1">ICA Facility, Greenland - RECOMMENDED</h3>
<p>Before i begin on this, yes, the facility is located in Greenland. Quote from the HITMAN Wiki:&quot;Greenland is the location of the ICA Facility, where 47 was recruited back in 1999.&quot;</p>
<p>The location is excellent as a training mission. You get to play a map twice, where you can attempt the assassination of the target in multiple ways, to get you accommodated with the features of HITMAN (2016), and a final test map, where you can also find multiple ways to eliminate the target, and an escalation, not really that great, but it's good.</p>
<h3 id="paris%2C-france---recommended" tabindex="-1">Paris, France - RECOMMENDED</h3>
<p>Another mission that feels like a tutorial, and a James Bond movie. Everything is placed how it should, nothing looks out of place and everything has been almost meticulously checked before the map was released, therefore barely any bugs.</p>
<h3 id="sapienza%2C-italy---recommended" tabindex="-1">Sapienza, Italy - RECOMMENDED</h3>
<p>Meticulously crafted, a true masterpiece of a map. It's gorgeous, it looks pretty accurate to the real-life counterpart.</p>
<h3 id="marrakesh%2C-morocco---not-recommended" tabindex="-1">Marrakesh, Morocco - NOT RECOMMENDED</h3>
<p>It's a good map, yes, but the crowds and the targets aren't really that good.</p>
<h3 id="bangkok%2C-thailand---not-recommended" tabindex="-1">Bangkok, Thailand - NOT RECOMMENDED</h3>
<p>It's very boring, the head turning is a bigger issue here.</p>
<h3 id="colorado%2C-usa---not-recommended" tabindex="-1">Colorado, USA - NOT RECOMMENDED</h3>
<p>It's a map with 99% of its NPCs guards. 30 guards in a zone, another 30 somewhere else, another 30 in the house area and another 10 guards in ANOTHER zone. The map is literally filled with the bastards, everything you do can start a full-blown fight and you will easily die, no matter the difficulty. If you don't have good or even near-perfect aim (like me and other good HITMAN players), then you cannot reach 100% completion. At the time of writing, i can't finish 4 challenges because they're bugged, so I'm stuck at 96% completion on this crap.</p>
<h3 id="hokkaido%2C-japan---recommended" tabindex="-1">Hokkaido, Japan - RECOMMENDED</h3>
<p>This is a truly zen map, after the atrocity of Colorado. You can literally relax here, I would visit this IRL if it would exist like this tbh. There are guards, but they're not littered about every corner, you can't use crowbars or lockpicks on the doors, although there are locked cases and safes.</p>
<h2 id="hitman-(2016)-goty-missions---patient-zero" tabindex="-1">HITMAN (2016) GOTY Missions - Patient Zero</h2>
<ul>
<li>RECOMMENDED (generally)</li>
</ul>
<h3 id="pz-bangkok%2C-thailand---not-recommended" tabindex="-1">PZ Bangkok, Thailand - NOT RECOMMENDED</h3>
<p>It's Bangkok, but at night time, and the 2 targets are in the same place with dozens of guards by them, plus the hotel's security team.</p>
<h3 id="pz-sapienza%2C-italy---recommended" tabindex="-1">PZ Sapienza, Italy - RECOMMENDED</h3>
<p>Sapienza at night time, a sick soundtrack and 2 targets that meet at midnight (8 minutes since the start of the mission), not a crap ton of guards, a zen map as well.</p>
<h3 id="pz-colorado%2C-usa---recommended" tabindex="-1">PZ Colorado, USA - RECOMMENDED</h3>
<p>This version of Colorado is good. It's midday, and you snipe the targets from a tower, while the guards cannot shoot you. You have to use the information provided by your Handler to find and eliminate four of the targets, the fifth target is preferred to be eliminated last.</p>
<h3 id="pz-hokkaido%2C-japan---recommended" tabindex="-1">PZ Hokkaido, Japan - RECOMMENDED</h3>
<p>Zen, sadly there's more guards and NPCs in the hospital section of the map, higher security, sick soundtrack and the finale of the Patient Zero campaign.</p>
<h2 id="hitman-2-standard-edition" tabindex="-1">HITMAN 2 Standard Edition</h2>
<ul>
<li>RECOMMENDED (generally)</li>
</ul>
<h3 id="hawke's-bay%2C-new-zealand---recommended" tabindex="-1">Hawke's Bay, New Zealand - RECOMMENDED</h3>
<p>I would literally buy that house if it would exist, it's very modern and it's looking amazing. Target is good, but not great, and there's an easter egg elimination if you kill all of the guards on the map (not that many anyways).</p>
<h3 id="miami%2C-usa---recommended" tabindex="-1">Miami, USA - RECOMMENDED</h3>
<p>Excellent, zen, it has a lot of guards, yes, it's understandable though. You're eliminating two targets, one prefers to stay in the Kronstadt building, and the other is racing, after which will be walking around the bars next to the event area/stadium?</p>
<h3 id="santa-fortuna%2C-colombia---not-recommended" tabindex="-1">Santa Fortuna, Colombia - NOT RECOMMENDED</h3>
<p>Head turning is an issue, the targets are too spread out, the map is too big, the soundtrack is good.</p>
<h3 id="mumbai%2C-india---recommended" tabindex="-1">Mumbai, India - RECOMMENDED</h3>
<p>Literally speechless. It's an amazing map, with everything done right. Yes, there's three targets spread out again, but it's a much more calculated approach, with 3 types of guards for each target and the city security, tons of NPCs and crowds, it will NOT run on a weak CPU and a weak GPU.</p>
<h3 id="whittleton-creek%2C-usa---recommended" tabindex="-1">Whittleton Creek, USA - RECOMMENDED</h3>
<p>Zen, calming, the soundtrack is good, the targets aren't really that great, but overall a good map.</p>
<h3 id="isle-of-sgail%2C-united-kingdom---recommended" tabindex="-1">Isle of Sgail, United Kingdom - RECOMMENDED</h3>
<p>Before I begin on this, yes, the Isle of Sgail is located in Scotland, United Kingdom, but the game does not disclose this.<br>
Amazing map. It looks stunning, check my Screenshots and the Artwork pages on my profile, the targets are good, not great.</p>
<h2 id="hitman-2-gold-edition" tabindex="-1">HITMAN 2 Gold Edition</h2>
<ul>
<li>RECOMMENDED (generally)</li>
</ul>
<h3 id="new-york%2C-usa---recommended" tabindex="-1">New York, USA - RECOMMENDED</h3>
<p>Smaller map, one target, different tiers of security.</p>
<h3 id="haven-island%2C-the-maldives---recommended" tabindex="-1">Haven Island, The Maldives - RECOMMENDED</h3>
<p>Excellent, a very relaxing map. Something of a good and worthy sequel to Hokkaido.</p>
<h3 id="special-assignments---recommended-(2-out-of-3)" tabindex="-1">SPECIAL ASSIGNMENTS - RECOMMENDED (2 out of 3)</h3>
<h4 id="sas-miami%2C-usa---recommended" tabindex="-1">SAS Miami, USA - RECOMMENDED</h4>
<p>Moderate difficulty, feels like a second Patient Zero campaign</p>
<h4 id="sas-santa-fortuna%2C-colombia---not-recommended" tabindex="-1">SAS Santa Fortuna, Colombia - NOT RECOMMENDED</h4>
<p>Santa Fortuna itself is terrible in HITMAN 2, this makes it worse, with more guards and a stupid target.</p>
<h4 id="sas-whittleton-creek%2C-usa--recommended" tabindex="-1">SAS Whittleton Creek, USA- RECOMMENDED</h4>
<p>Zen mission, moderate difficulty.</p>
<h2 id="hitman-iii" tabindex="-1">HITMAN III</h2>
<ul>
<li>NOT RECOMMENDED (generally)</li>
</ul>
<h3 id="dubai%2C-united-arab-emirates---recommended" tabindex="-1">Dubai, United Arab Emirates - RECOMMENDED</h3>
<p>Tutorial-like map, amazing soundtrack.</p>
<h3 id="dartmoor%2C-united-kingdom---recommended" tabindex="-1">Dartmoor, United Kingdom - RECOMMENDED</h3>
<p>Bloody good, a very nice looking map.</p>
<h3 id="berlin%2C-germany---recommended" tabindex="-1">Berlin, Germany - RECOMMENDED</h3>
<p>Zen, 10 targets, 5 targets must be killed, other 5 can be killed too.</p>
<h3 id="chongqing%2C-china---not-recommended" tabindex="-1">Chongqing, China - NOT RECOMMENDED</h3>
<p>Large map, different tiers of security, sick soundtrack though.</p>
<h3 id="mendoza%2C-argentina---recommended" tabindex="-1">Mendoza, Argentina - RECOMMENDED</h3>
<p>Excellent, the best map in this third installment.</p>
<h3 id="carpathian-mountains%2C-romania---not-recommended" tabindex="-1">Carpathian Mountains, Romania - NOT RECOMMENDED</h3>
<p>I like the map, it's a moving train, but it's extremely linear, unlike virtually every map in the WOA trilogy.</p>
<h3 id="hitman-iii-dlcs%3F" tabindex="-1">HITMAN III DLCs?</h3>
<p>Do NOT get the Seven Sins DLC, it's not worth even $10</p>
]]></content:encoded>
					<guid>PO-210603-01</guid>
					<category>post</category>
			</item>
	</channel>
</rss>