<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[TalkativeTurtles - Project Showcase]]></title>
		<link>https://talkativeturtles.club/</link>
		<description><![CDATA[TalkativeTurtles - https://talkativeturtles.club]]></description>
		<pubDate>Wed, 05 Aug 2026 13:53:24 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Built a self-hosted bookmark manager with full-text search]]></title>
			<link>https://talkativeturtles.club/showthread.php?tid=119</link>
			<pubDate>Wed, 01 Jul 2026 20:35:25 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://talkativeturtles.club/member.php?action=profile&uid=1">Zero Two</a>]]></dc:creator>
			<guid isPermaLink="false">https://talkativeturtles.club/showthread.php?tid=119</guid>
			<description><![CDATA[Started this as a weekend project and it ballooned into something I actually use daily now.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">What it does:</span><ul class="mycode_list"><li>Save bookmarks via browser extension or API<br />
</li>
<li>Full-text search across title, description, and page content (fetches and indexes at save time)<br />
</li>
<li>Auto-tagging using a small local model that classifies into ~30 categories<br />
</li>
<li>RSS feed of saved links so you can subscribe from any reader<br />
</li>
<li>Duplicate detection<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Stack:</span> Go backend, SQLite with FTS5 for search, HTMX frontend, Docker Compose for deployment.<br />
<br />
The FTS5 full-text search in SQLite is genuinely impressive for something with zero configuration. I was ready to reach for Meilisearch but did not need to.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">What I learned:</span> Fetching and parsing arbitrary web pages is a nightmare. About 30% of pages block headless requests, return paywalled content, or just have unreadable HTML. Added a fallback to just index the title and meta description.<br />
<br />
Happy to share the repo if there is interest.]]></description>
			<content:encoded><![CDATA[Started this as a weekend project and it ballooned into something I actually use daily now.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">What it does:</span><ul class="mycode_list"><li>Save bookmarks via browser extension or API<br />
</li>
<li>Full-text search across title, description, and page content (fetches and indexes at save time)<br />
</li>
<li>Auto-tagging using a small local model that classifies into ~30 categories<br />
</li>
<li>RSS feed of saved links so you can subscribe from any reader<br />
</li>
<li>Duplicate detection<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Stack:</span> Go backend, SQLite with FTS5 for search, HTMX frontend, Docker Compose for deployment.<br />
<br />
The FTS5 full-text search in SQLite is genuinely impressive for something with zero configuration. I was ready to reach for Meilisearch but did not need to.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">What I learned:</span> Fetching and parsing arbitrary web pages is a nightmare. About 30% of pages block headless requests, return paywalled content, or just have unreadable HTML. Added a fallback to just index the title and meta description.<br />
<br />
Happy to share the repo if there is interest.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Project] Building a mechanical numpad with a custom PCB - from scratch]]></title>
			<link>https://talkativeturtles.club/showthread.php?tid=86</link>
			<pubDate>Mon, 22 Jun 2026 13:20:36 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://talkativeturtles.club/member.php?action=profile&uid=1">Zero Two</a>]]></dc:creator>
			<guid isPermaLink="false">https://talkativeturtles.club/showthread.php?tid=86</guid>
			<description><![CDATA[Decided to design my own PCB for a numpad as an excuse to learn KiCad. Here's the rundown.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Why a numpad?</span><br />
I switched to a TKL keyboard and immediately missed the numpad for data entry. Off-the-shelf ones are fine but this was a learning exercise - I wanted to understand the full hardware design pipeline.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tools used:</span><ul class="mycode_list"><li>KiCad 8 for schematic and PCB layout<br />
</li>
<li>JLCPCB for fabrication (5 PCBs for &#36;12 including shipping)<br />
</li>
<li>Hotswap Kailh sockets so I can swap switches without soldering<br />
</li>
<li>Pro Micro (ATmega32U4) as the controller - cheap, well-supported by QMK<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Design decisions:</span><br />
Standard numpad layout with an extra rotary encoder in the top corner (volume control, media skip). Added per-key RGB underneath the hotswap sockets using SK6812 mini-E LEDs. USB-C connector instead of Micro-USB because it's 2026.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mistakes made:</span><ul class="mycode_list"><li>First PCB revision had the rotary encoder footprint mirrored - had to bodge-wire it<br />
</li>
<li>Forgot to add 100nF decoupling caps on the LED power lines - this caused flickering at high brightness, fixed in rev 2<br />
</li>
<li>Ordered switches before confirming the legend matched - ended up with blanks which I actually prefer<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">QMK firmware:</span> Straightforward once you understand the config structure. The hardest part was the rotary encoder mapping - QMK handles it but the documentation is scattered.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Result:</span> Works perfectly. Total cost about £40 including switches, keycaps, and PCBs. More importantly, I now understand PCB design well enough to attempt something more ambitious.<br />
<br />
KiCad is free, JLCPCB is cheap, and the QMK ecosystem means firmware is handled - the barrier to custom keyboard hardware is lower than ever.]]></description>
			<content:encoded><![CDATA[Decided to design my own PCB for a numpad as an excuse to learn KiCad. Here's the rundown.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Why a numpad?</span><br />
I switched to a TKL keyboard and immediately missed the numpad for data entry. Off-the-shelf ones are fine but this was a learning exercise - I wanted to understand the full hardware design pipeline.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Tools used:</span><ul class="mycode_list"><li>KiCad 8 for schematic and PCB layout<br />
</li>
<li>JLCPCB for fabrication (5 PCBs for &#36;12 including shipping)<br />
</li>
<li>Hotswap Kailh sockets so I can swap switches without soldering<br />
</li>
<li>Pro Micro (ATmega32U4) as the controller - cheap, well-supported by QMK<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Design decisions:</span><br />
Standard numpad layout with an extra rotary encoder in the top corner (volume control, media skip). Added per-key RGB underneath the hotswap sockets using SK6812 mini-E LEDs. USB-C connector instead of Micro-USB because it's 2026.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Mistakes made:</span><ul class="mycode_list"><li>First PCB revision had the rotary encoder footprint mirrored - had to bodge-wire it<br />
</li>
<li>Forgot to add 100nF decoupling caps on the LED power lines - this caused flickering at high brightness, fixed in rev 2<br />
</li>
<li>Ordered switches before confirming the legend matched - ended up with blanks which I actually prefer<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">QMK firmware:</span> Straightforward once you understand the config structure. The hardest part was the rotary encoder mapping - QMK handles it but the documentation is scattered.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Result:</span> Works perfectly. Total cost about £40 including switches, keycaps, and PCBs. More importantly, I now understand PCB design well enough to attempt something more ambitious.<br />
<br />
KiCad is free, JLCPCB is cheap, and the QMK ecosystem means firmware is handled - the barrier to custom keyboard hardware is lower than ever.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Project] My solar-powered remote weather station - build log]]></title>
			<link>https://talkativeturtles.club/showthread.php?tid=85</link>
			<pubDate>Mon, 22 Jun 2026 13:12:59 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://talkativeturtles.club/member.php?action=profile&uid=1">Zero Two</a>]]></dc:creator>
			<guid isPermaLink="false">https://talkativeturtles.club/showthread.php?tid=85</guid>
			<description><![CDATA[Been working on this one for a few months and it's finally stable enough to write up.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">The goal:</span> A weather station at the bottom of my garden, solar powered, transmitting data wirelessly to a Pi indoors, displayed on a simple web dashboard.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hardware:</span><ul class="mycode_list"><li>ESP32-S3 as the main controller<br />
</li>
<li>BME280 (temperature, humidity, pressure)<br />
</li>
<li>Anemometer and wind vane (cheap Amazon ones, turned out to be accurate enough)<br />
</li>
<li>Rain gauge (tipping bucket type)<br />
</li>
<li>6V 2W solar panel<br />
</li>
<li>TP4056 lithium battery charger<br />
</li>
<li>18650 cell as the buffer battery<br />
</li>
<li>Waterproof project box from Aliexpress<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Power management:</span> This was the hardest part. The ESP32 deep sleeps between readings (every 5 minutes). Wake, take readings, transmit via MQTT, sleep. Current draw in deep sleep: ~150uA. Awake and transmitting: ~200mA for about 2 seconds. Net daily consumption is very low - the 3000mAh 18650 easily survives cloudy winter days.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Enclosure issues:</span> First version was not properly sealed - condensation got inside and killed the BME280. Second version added silica gel sachets and proper cable gland fittings. Has been running for 3 months now without issues.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Software:</span><ul class="mycode_list"><li>ESP32 firmware in Arduino/PlatformIO<br />
</li>
<li>MQTT broker (Mosquitto) on the Pi<br />
</li>
<li>InfluxDB for time-series storage<br />
</li>
<li>Grafana for dashboards - the auto-generated weather graphs are genuinely nice<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">What I'd change:</span> Use a proper RS485 anemometer instead of the cheap pulse-count one. The cheap one needs calibration and the cable run over 10m introduced noise.<br />
<br />
Happy to share code or answer questions on any part of this.]]></description>
			<content:encoded><![CDATA[Been working on this one for a few months and it's finally stable enough to write up.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">The goal:</span> A weather station at the bottom of my garden, solar powered, transmitting data wirelessly to a Pi indoors, displayed on a simple web dashboard.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hardware:</span><ul class="mycode_list"><li>ESP32-S3 as the main controller<br />
</li>
<li>BME280 (temperature, humidity, pressure)<br />
</li>
<li>Anemometer and wind vane (cheap Amazon ones, turned out to be accurate enough)<br />
</li>
<li>Rain gauge (tipping bucket type)<br />
</li>
<li>6V 2W solar panel<br />
</li>
<li>TP4056 lithium battery charger<br />
</li>
<li>18650 cell as the buffer battery<br />
</li>
<li>Waterproof project box from Aliexpress<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">Power management:</span> This was the hardest part. The ESP32 deep sleeps between readings (every 5 minutes). Wake, take readings, transmit via MQTT, sleep. Current draw in deep sleep: ~150uA. Awake and transmitting: ~200mA for about 2 seconds. Net daily consumption is very low - the 3000mAh 18650 easily survives cloudy winter days.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Enclosure issues:</span> First version was not properly sealed - condensation got inside and killed the BME280. Second version added silica gel sachets and proper cable gland fittings. Has been running for 3 months now without issues.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Software:</span><ul class="mycode_list"><li>ESP32 firmware in Arduino/PlatformIO<br />
</li>
<li>MQTT broker (Mosquitto) on the Pi<br />
</li>
<li>InfluxDB for time-series storage<br />
</li>
<li>Grafana for dashboards - the auto-generated weather graphs are genuinely nice<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b">What I'd change:</span> Use a proper RS485 anemometer instead of the cheap pulse-count one. The cheap one needs calibration and the cable run over 10m introduced noise.<br />
<br />
Happy to share code or answer questions on any part of this.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Template] How to Write a Good Project Post]]></title>
			<link>https://talkativeturtles.club/showthread.php?tid=40</link>
			<pubDate>Sun, 21 Jun 2026 09:42:20 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://talkativeturtles.club/member.php?action=profile&uid=1">Zero Two</a>]]></dc:creator>
			<guid isPermaLink="false">https://talkativeturtles.club/showthread.php?tid=40</guid>
			<description><![CDATA[Use this template as a starting point. You don't have to use every section but the more context you give, the better feedback you get.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Project name:<br />
What it does (one sentence):<br />
Why I built it:<br />
<br />
Tech stack / tools used:<br />
Status: [ ] Idea&nbsp;&nbsp;[ ] WIP&nbsp;&nbsp;[ ] Working prototype&nbsp;&nbsp;[ ] Finished&nbsp;&nbsp;[ ] Abandoned<br />
<br />
Links:<br />
- Source code:<br />
- Live demo / download:<br />
- Screenshots / video:<br />
<br />
What was the hardest part:<br />
What I would do differently:<br />
What kind of feedback I want:</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Tips for a good showcase post:</span><ul class="mycode_list"><li>Lead with what the project <span style="font-style: italic;" class="mycode_i">does</span>, not what it <span style="font-style: italic;" class="mycode_i">is</span>. "A CLI that watches your filesystem and auto-compresses old logs" is more interesting than "a Rust project I made".<br />
</li>
<li>Include at least one visual - screenshot, GIF, or demo link. Posts without visuals get far less engagement.<br />
</li>
<li>Mention one thing that went wrong or surprised you. This makes posts infinitely more interesting to read.<br />
</li>
<li>Tell us what feedback you actually want. "Any thoughts?" gets you nothing useful. "Is the API design clean?" gets you a real conversation.<br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[Use this template as a starting point. You don't have to use every section but the more context you give, the better feedback you get.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>Project name:<br />
What it does (one sentence):<br />
Why I built it:<br />
<br />
Tech stack / tools used:<br />
Status: [ ] Idea&nbsp;&nbsp;[ ] WIP&nbsp;&nbsp;[ ] Working prototype&nbsp;&nbsp;[ ] Finished&nbsp;&nbsp;[ ] Abandoned<br />
<br />
Links:<br />
- Source code:<br />
- Live demo / download:<br />
- Screenshots / video:<br />
<br />
What was the hardest part:<br />
What I would do differently:<br />
What kind of feedback I want:</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Tips for a good showcase post:</span><ul class="mycode_list"><li>Lead with what the project <span style="font-style: italic;" class="mycode_i">does</span>, not what it <span style="font-style: italic;" class="mycode_i">is</span>. "A CLI that watches your filesystem and auto-compresses old logs" is more interesting than "a Rust project I made".<br />
</li>
<li>Include at least one visual - screenshot, GIF, or demo link. Posts without visuals get far less engagement.<br />
</li>
<li>Mention one thing that went wrong or surprised you. This makes posts infinitely more interesting to read.<br />
</li>
<li>Tell us what feedback you actually want. "Any thoughts?" gets you nothing useful. "Is the API design clean?" gets you a real conversation.<br />
</li>
</ul>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Rules] Project Showcase — Forum Rules]]></title>
			<link>https://talkativeturtles.club/showthread.php?tid=10</link>
			<pubDate>Sun, 21 Jun 2026 09:34:07 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://talkativeturtles.club/member.php?action=profile&uid=1">Zero Two</a>]]></dc:creator>
			<guid isPermaLink="false">https://talkativeturtles.club/showthread.php?tid=10</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Project Showcase</span> is for sharing things you have built - software, hardware, art, or anything in between.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Posting Rules:</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">It must be your own work</span> (or a collaboration where you are an active contributor).<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Write a meaningful description.</span> Tell us what it does, why you built it, what stack or tools you used, and what was challenging.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Include a link, demo, screenshot, or video</span> where possible. Posts with no visuals or link get far less engagement.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Feedback is a gift.</span> When commenting, be constructive. Critique the work, not the person.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Commercial projects are allowed</span> but must be disclosed as such. Hard sales pitches belong in <span style="font-weight: bold;" class="mycode_b">Deals &amp; Marketplace</span>.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">One showcase thread per project.</span> Update your original post with new versions rather than creating duplicate threads.<br />
</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Project Showcase</span> is for sharing things you have built - software, hardware, art, or anything in between.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Posting Rules:</span><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">It must be your own work</span> (or a collaboration where you are an active contributor).<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Write a meaningful description.</span> Tell us what it does, why you built it, what stack or tools you used, and what was challenging.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Include a link, demo, screenshot, or video</span> where possible. Posts with no visuals or link get far less engagement.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Feedback is a gift.</span> When commenting, be constructive. Critique the work, not the person.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Commercial projects are allowed</span> but must be disclosed as such. Hard sales pitches belong in <span style="font-weight: bold;" class="mycode_b">Deals &amp; Marketplace</span>.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">One showcase thread per project.</span> Update your original post with new versions rather than creating duplicate threads.<br />
</li>
</ul>
]]></content:encoded>
		</item>
	</channel>
</rss>