<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on Ricardo Dantas</title><link>https://ricardodantas.me/posts/</link><description>Recent content in Posts on Ricardo Dantas</description><generator>Hugo -- 0.157.0</generator><language>en-us</language><lastBuildDate>Mon, 16 Mar 2026 06:00:00 +0100</lastBuildDate><atom:link href="https://ricardodantas.me/posts/feed.xml" rel="self" type="application/rss+xml"/><item><title>Building BragLog: Turning Daily Wins Into Brag Documents</title><link>https://ricardodantas.me/posts/building-braglog/</link><pubDate>Mon, 16 Mar 2026 06:00:00 +0100</pubDate><guid>https://ricardodantas.me/posts/building-braglog/</guid><description>&lt;p&gt;Performance review season is universally dreaded. Not because people don&amp;rsquo;t do great work, but because nobody remembers what they did six months ago. You sit down with a blank document, try to recall that critical bug you fixed in July, that feature you shipped under pressure in September, and end up writing something generic that undersells everything.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been there too many times.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;The advice is always the same: &amp;ldquo;keep a brag document.&amp;rdquo; Write down your wins as they happen. Julia Evans wrote a great post about it years ago, and the concept stuck with me. But every time I tried, I&amp;rsquo;d keep it up for a week, forget about it, and find myself back at square one come review time.&lt;/p&gt;
&lt;p&gt;The friction was the problem. Opening a text file, context-switching from whatever I was working on, writing something coherent. It&amp;rsquo;s just enough resistance that you skip it on busy days, which are exactly the days worth documenting.&lt;/p&gt;
&lt;h2 id="what-i-built"&gt;What I Built&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://braglog.app"&gt;BragLog&lt;/a&gt; is a native app for iPhone, iPad, and Mac. The core loop is simple: log a quick win (takes seconds), and when review time comes, tap a button and get an AI-generated brag document ready to paste into whatever form your company uses.&lt;/p&gt;
&lt;p&gt;Six categories keep things organized: Shipped, Led, Fixed, Learned, Mentored, Improved. They map roughly to the things managers care about in reviews. The app suggests a category as you type using on-device AI, so you don&amp;rsquo;t even have to think about it.&lt;/p&gt;
&lt;h2 id="on-device-ai-with-tool-calling"&gt;On-Device AI With Tool Calling&lt;/h2&gt;
&lt;p&gt;The brag document generation is the feature I&amp;rsquo;m most proud of, and also the one that caused the most headaches.&lt;/p&gt;
&lt;p&gt;I used Apple&amp;rsquo;s FoundationModels framework, which runs entirely on-device. No API keys, no cloud calls, no data leaving the phone. The model generates structured brag documents using Tool Calling: it can fetch entries for a specific period, get category breakdowns, and pull streak information, then weave it all into a coherent narrative.&lt;/p&gt;
&lt;p&gt;You can choose a tone (professional, confident, or modest) and the AI adapts accordingly. The output comes as structured sections that you can export as Markdown, plain text, or HTML compatible with Word, Pages, and Google Docs.&lt;/p&gt;
&lt;p&gt;The catch? FoundationModels requires Apple Silicon. On older devices, the AI features gracefully degrade. You can still log, organize, and export everything manually. The AI is a convenience layer, not a hard dependency.&lt;/p&gt;
&lt;p&gt;One lesson I learned the hard way: the &lt;code&gt;@Generable&lt;/code&gt; macro and Tool Calling have quirks. You can&amp;rsquo;t capture SwiftData &lt;code&gt;@Model&lt;/code&gt; objects in tool closures because they&amp;rsquo;re not &lt;code&gt;Sendable&lt;/code&gt;. I had to create a &lt;code&gt;SendableEntry&lt;/code&gt; pattern where I extract plain data from model objects before passing them to the AI pipeline. Not complicated once you know, but it cost me a few hours of confusing compiler errors.&lt;/p&gt;
&lt;h2 id="intelligent-search"&gt;Intelligent Search&lt;/h2&gt;
&lt;p&gt;Standard text search feels limiting once you have hundreds of entries. &amp;ldquo;I know I fixed something related to database performance, but I didn&amp;rsquo;t use the word &amp;lsquo;database&amp;rsquo; in the entry.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;BragLog&amp;rsquo;s search uses FoundationModels for semantic matching. Search &amp;ldquo;database&amp;rdquo; and it&amp;rsquo;ll surface entries about SQL migrations, query optimization, and PostgreSQL tuning even if those exact words aren&amp;rsquo;t in the query. There&amp;rsquo;s a debounce (0.8 seconds) and a cap at 200 entries to keep it responsive.&lt;/p&gt;
&lt;h2 id="the-streak-game"&gt;The Streak Game&lt;/h2&gt;
&lt;p&gt;I added streak tracking because I know myself. A GitHub-style contribution heatmap, daily progress, and milestone celebrations at 7, 30, and 100 days. It&amp;rsquo;s a small psychological trick, but it works. There&amp;rsquo;s a grace period built into the streak calculator so missing a weekend doesn&amp;rsquo;t break a work-week streak.&lt;/p&gt;
&lt;p&gt;The streak also shows as a Live Activity on the Lock Screen and Dynamic Island on iOS. It&amp;rsquo;s a subtle reminder throughout the day. &amp;ldquo;You&amp;rsquo;ve logged for 23 days straight. Don&amp;rsquo;t break the chain.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="17-tips-and-an-animated-onboarding"&gt;17 Tips and an Animated Onboarding&lt;/h2&gt;
&lt;p&gt;I went deep on TipKit. Seventeen contextual tips that appear progressively as you use the app. First-time composing? You get a tip about AI category suggestions. Hit 10 entries? A tip about generating your first brag doc. Reach the insights screen? Tips about the heatmap and streak tracking.&lt;/p&gt;
&lt;p&gt;The onboarding is a 4-page animated flow with MeshGradient backgrounds, floating particles, and spring animations. I probably spent more time on this than I should have, but first impressions matter, and I wanted the app to feel polished from the moment you open it.&lt;/p&gt;
&lt;h2 id="making-it-feel-native-everywhere"&gt;Making It Feel Native Everywhere&lt;/h2&gt;
&lt;p&gt;The iOS version uses an adaptive tab bar with Liquid Glass styling on iOS 26. On iPad, it switches to a sidebar. On Mac, it&amp;rsquo;s a full NavigationSplitView with a menu bar extra for quick capture. You can log a win from the menu bar without switching away from your code editor.&lt;/p&gt;
&lt;p&gt;Widgets cover Home Screen, Lock Screen, StandBy, and Control Center. Seven Siri Shortcuts let you log wins, check your streak, or generate summaries by voice. Handoff lets you start composing on your iPhone and continue on your Mac. Spotlight indexes all entries so you can find them from system search.&lt;/p&gt;
&lt;p&gt;None of these integrations are individually complex, but together they make the app feel like it belongs on the platform rather than just running on it. That&amp;rsquo;s the goal.&lt;/p&gt;
&lt;h2 id="zero-dependencies"&gt;Zero Dependencies&lt;/h2&gt;
&lt;p&gt;BragLog is built entirely with Apple frameworks. No SPM packages, no CocoaPods, nothing. Swift 6 with strict concurrency, SwiftUI, SwiftData, CloudKit, FoundationModels, TipKit, WidgetKit, AppIntents, CoreSpotlight, ActivityKit. About 7,700 lines across 48 Swift files.&lt;/p&gt;
&lt;p&gt;I chose this constraint deliberately. Every third-party dependency is a maintenance burden and a potential privacy concern. For an app that handles people&amp;rsquo;s work accomplishments, I wanted to be able to say with certainty: nothing in this app talks to anyone except Apple&amp;rsquo;s iCloud, and only if you have it enabled.&lt;/p&gt;
&lt;h2 id="what-id-do-differently"&gt;What I&amp;rsquo;d Do Differently&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;@Generable&lt;/code&gt; struct wrappers for FoundationModels output were clunky at first. I&amp;rsquo;d design the model layer around the AI output format from the start instead of retrofitting it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d also invest in screenshot automation earlier. I built a &lt;code&gt;DebugDataSeeder&lt;/code&gt; that generates realistic sample data for App Store screenshots, but I added it late in the process. Having it from day one would have made design iteration faster.&lt;/p&gt;
&lt;p&gt;And the 17 TipKit tips? I&amp;rsquo;d still do all of them, but I&amp;rsquo;d define the milestone triggers in a configuration file rather than scattering them across views. They work great, but they&amp;rsquo;re harder to maintain than they should be.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try It&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve ever stared at a blank self-review form trying to remember what you did last quarter, BragLog might help. Log your wins as they happen, let AI do the heavy lifting at review time.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://apps.apple.com/app/braglog/id6759666989"&gt;Download on the App Store&lt;/a&gt; | &lt;a href="https://braglog.app"&gt;Website&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Launching Calometric: A Nutrition Tracker That Respects Your Privacy</title><link>https://ricardodantas.me/posts/launching-calometric/</link><pubDate>Thu, 05 Mar 2026 10:00:00 +0100</pubDate><guid>https://ricardodantas.me/posts/launching-calometric/</guid><description>&lt;p&gt;I&amp;rsquo;ve never been great at tracking what I eat. I&amp;rsquo;d download a calorie tracker, spend five minutes manually searching for &amp;ldquo;grilled chicken breast 150g,&amp;rdquo; give up after three days, and delete the app. The friction was always too high.&lt;/p&gt;
&lt;p&gt;Most nutrition apps want you to weigh everything, type everything, and subscribe to everything. And in return, they collect your data and sell it to advertisers. That never sat well with me.&lt;/p&gt;
&lt;p&gt;So I built something different.&lt;/p&gt;
&lt;h2 id="introducing-calometric"&gt;Introducing Calometric&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://calometric.app"&gt;Calometric&lt;/a&gt; is a nutrition tracker for iPhone and Apple Watch. Take a photo of your meal, and it tells you the calories and macros. That&amp;rsquo;s the core idea.&lt;/p&gt;
&lt;p&gt;What makes it different is where the AI runs: entirely on your device. The food recognition uses Core ML, and the portion estimation uses Apple&amp;rsquo;s Foundation Models. Nothing gets sent to a server. There&amp;rsquo;s no account to create. No data to leak.&lt;/p&gt;
&lt;h2 id="five-ways-to-log"&gt;Five Ways to Log&lt;/h2&gt;
&lt;p&gt;Not every meal is a photo opportunity. Sometimes you&amp;rsquo;re eating a protein bar with a barcode. Sometimes you&amp;rsquo;re driving and just want to say &amp;ldquo;two eggs and toast.&amp;rdquo; So I built five input methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Photo scan&lt;/strong&gt; for when you can snap a picture&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Barcode scanner&lt;/strong&gt; for packaged foods (via Open Food Facts)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice logging&lt;/strong&gt; for hands-free moments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Food search&lt;/strong&gt; against a local USDA database with 177+ foods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nutrition label OCR&lt;/strong&gt; for when you want exact numbers from the package&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each one feeds into the same pipeline and saves consistently to SwiftData, HealthKit, Spotlight, and widgets.&lt;/p&gt;
&lt;h2 id="why-on-device-ai"&gt;Why On-Device AI?&lt;/h2&gt;
&lt;p&gt;Privacy was a hard requirement from day one. I didn&amp;rsquo;t want to build something that phones home every time you eat lunch. But beyond privacy, there&amp;rsquo;s a practical benefit: it works offline. On a plane, in the mountains, in your kitchen with spotty Wi-Fi. It just works.&lt;/p&gt;
&lt;p&gt;The trade-off is that on-device models aren&amp;rsquo;t as powerful as cloud models. The AI portion estimation requires an iPhone 15 Pro or newer with Apple Intelligence enabled. On older devices, everything still works, you just get default portion sizes instead of smart estimates.&lt;/p&gt;
&lt;h2 id="apple-watch-too"&gt;Apple Watch Too&lt;/h2&gt;
&lt;p&gt;I wanted to log meals from my wrist. The watchOS app is fully independent, with voice logging, a quick-add menu of common foods, and complication widgets showing your daily progress. It syncs with the iPhone via WatchConnectivity.&lt;/p&gt;
&lt;h2 id="the-business-model"&gt;The Business Model&lt;/h2&gt;
&lt;p&gt;One-time purchase. That&amp;rsquo;s it. No subscriptions, no ads, no in-app purchases. One price covers iPhone and Apple Watch.&lt;/p&gt;
&lt;p&gt;I keep coming back to this model because I believe in it. If you&amp;rsquo;re building a tool that respects people&amp;rsquo;s privacy, charging them a recurring fee to keep accessing their own data feels contradictory.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try It&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re looking for a nutrition tracker that stays out of your way and keeps your data on your device, give Calometric a look.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://apps.apple.com/app/id6759844251"&gt;Download on the App Store&lt;/a&gt; | &lt;a href="https://calometric.app"&gt;Website&lt;/a&gt;&lt;/p&gt;</description></item><item><title>ratatui-themes: Building a Theme Library and Finding a Community</title><link>https://ricardodantas.me/posts/ratatui-themes-building-a-theme-library/</link><pubDate>Mon, 02 Mar 2026 10:00:00 +0100</pubDate><guid>https://ricardodantas.me/posts/ratatui-themes-building-a-theme-library/</guid><description>&lt;p&gt;There&amp;rsquo;s a moment in every side project where you push your code to the world and think, &amp;ldquo;Well, that&amp;rsquo;s done.&amp;rdquo; You close the laptop, maybe feel a brief spark of accomplishment, and move on. Nobody&amp;rsquo;s going to notice. It&amp;rsquo;s just another crate in a sea of crates.&lt;/p&gt;
&lt;p&gt;And then someone opens an issue.&lt;/p&gt;
&lt;h2 id="the-backstory"&gt;The Backstory&lt;/h2&gt;
&lt;p&gt;While building &lt;a href="https://perch.ricardodantas.me"&gt;Perch&lt;/a&gt;, &lt;a href="https://feedo.ricardodantas.me"&gt;Feedo&lt;/a&gt;, and &lt;a href="https://hazelnut.ricardodantas.me"&gt;Hazelnut&lt;/a&gt;, I kept running into the same problem: theming. Every ratatui application handles colors differently. Some hardcode hex values. Others define their own theme structs. There&amp;rsquo;s no shared vocabulary for &amp;ldquo;give me a Dracula theme&amp;rdquo; or &amp;ldquo;switch to Catppuccin.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I wanted a simple, reusable library. Define a theme by name, get consistent semantic colors (foreground, background, accent, error, warning, success) that any ratatui app could use. No runtime overhead. No complex configuration. Just &lt;code&gt;Theme::new(ThemeName::Dracula)&lt;/code&gt; and you&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;So I built &lt;a href="https://github.com/ricardodantas/ratatui-themes"&gt;ratatui-themes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What It Does&lt;/h2&gt;
&lt;p&gt;The crate is deliberately minimal. It gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;15+ popular themes&lt;/strong&gt; - Dracula, Nord, Catppuccin (all four flavors), Gruvbox, Tokyo Night, Solarized, One Dark, Kanagawa, Everforest, Rosé Pine, and a few originals&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semantic colors&lt;/strong&gt; - Every theme maps to the same set of named colors, so your app looks consistent regardless of which theme the user picks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Theme cycling&lt;/strong&gt; - Built-in &lt;code&gt;next()&lt;/code&gt; and &lt;code&gt;prev()&lt;/code&gt; methods, because every TUI app needs a &amp;ldquo;press T to switch theme&amp;rdquo; feature&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Light/dark detection&lt;/strong&gt; - Programmatically check if a theme is light or dark, useful for adapting UI elements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional serde support&lt;/strong&gt; - For persisting the user&amp;rsquo;s theme choice in a config file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zero dependencies beyond ratatui itself. The whole thing compiles in seconds.&lt;/p&gt;
&lt;h2 id="publishing-to-cratesio"&gt;Publishing to crates.io&lt;/h2&gt;
&lt;p&gt;Publishing a crate is oddly nerve-wracking every time. You run &lt;code&gt;cargo publish&lt;/code&gt;, watch the progress bar, and suddenly your code is on &lt;a href="https://crates.io/crates/ratatui-themes"&gt;crates.io&lt;/a&gt; for anyone to install. There&amp;rsquo;s no review process, no gatekeeper. Just you and the Rust ecosystem&amp;rsquo;s trust model.&lt;/p&gt;
&lt;p&gt;I wrote thorough documentation: rustdoc with examples for every public function, a detailed README, a changelog. Partly because good docs matter. Partly because if someone was actually going to use this, I didn&amp;rsquo;t want them to have to read my source code to figure out how.&lt;/p&gt;
&lt;p&gt;Then I waited. Not expectantly. I genuinely assumed the crate would sit there with maybe a handful of downloads from bots and search indexers.&lt;/p&gt;
&lt;h2 id="the-first-issue"&gt;The First Issue&lt;/h2&gt;
&lt;p&gt;A few days later, I got a GitHub notification. Someone had opened an issue. My first reaction was a small adrenaline spike, the kind you get when your phone rings unexpectedly. Is it a bug report? Did I break something?&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t a bug. It was a feature request. And not just any feature request, but a thoughtful, well-structured proposal for &amp;ldquo;associated colors.&amp;rdquo; The idea was to add extended color palettes (reds, greens, blues, etc.) that go beyond the core semantic colors, useful for things like charts, graphs, and data visualization.&lt;/p&gt;
&lt;p&gt;The message opened with: &lt;em&gt;&amp;ldquo;I was just looking for something like this three days ago when you published it. Amazing timing!&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I read that line three times. Someone had been looking for exactly what I built. The timing was coincidental, but the validation was real. This wasn&amp;rsquo;t a theoretical exercise anymore. Someone had a concrete use case, and my crate was close enough to what they needed that they wanted to help shape it.&lt;/p&gt;
&lt;h2 id="the-first-pull-request"&gt;The First Pull Request&lt;/h2&gt;
&lt;p&gt;Then came the pull request. They&amp;rsquo;d built a &lt;strong&gt;theme gallery example&lt;/strong&gt;, a visual picker that renders all available themes side by side so you can see what they look like before choosing one. 192 lines of additions, cleanly written, with a new &lt;code&gt;ThemePicker&lt;/code&gt; widget.&lt;/p&gt;
&lt;p&gt;I reviewed the code, left some comments, we discussed the approach, and I merged it. The whole interaction was respectful, constructive, and genuinely fun. This is open source at its best: a stranger on the internet saw something they liked, made it better, and shared the improvement with everyone.&lt;/p&gt;
&lt;h2 id="why-this-matters"&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve contributed to open source projects before. I&amp;rsquo;ve opened PRs, filed issues, and reviewed code on other people&amp;rsquo;s repos. But being on the receiving end is a completely different experience.&lt;/p&gt;
&lt;p&gt;When someone uses your library, they&amp;rsquo;re trusting your decisions. Your API design, your color choices, your documentation. When they open an issue, they&amp;rsquo;re investing their time to make your project better. When they submit a PR, they&amp;rsquo;re saying &amp;ldquo;I believe in this enough to write code for it.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a powerful thing. And it&amp;rsquo;s easy to take for granted if you&amp;rsquo;ve been in the open source world for a while. But with ratatui-themes, it hit differently.&lt;/p&gt;
&lt;h2 id="what-i-learned"&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re sitting on a library or tool that you built for yourself, consider publishing it. Here&amp;rsquo;s what I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Someone needs what you built.&lt;/strong&gt; You wrote it to solve your problem. Chances are, someone else has the same problem. The timing might just line up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Documentation is your first impression.&lt;/strong&gt; Good docs with real examples lower the barrier to adoption. People will judge your crate by its README before they ever read a line of source code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start small.&lt;/strong&gt; ratatui-themes does one thing. It doesn&amp;rsquo;t try to be a full UI framework or a design system. Focused libraries are easier to maintain and easier for others to adopt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be responsive.&lt;/strong&gt; When that first issue comes in, engage with it. The early contributors are the ones who&amp;rsquo;ll shape your project&amp;rsquo;s direction. Treat their input with respect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It doesn&amp;rsquo;t have to be perfect.&lt;/strong&gt; Version 0.1.0 had rough edges. That&amp;rsquo;s fine. Ship it, iterate, improve. The crate is on 0.2.0 now, and each version is better because of real-world feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s Next&lt;/h2&gt;
&lt;p&gt;The &amp;ldquo;associated colors&amp;rdquo; proposal from that first issue is still being discussed. We&amp;rsquo;re figuring out the right API. I suggested a &lt;code&gt;HashMap&amp;lt;String, Vec&amp;lt;Color&amp;gt;&amp;gt;&lt;/code&gt; approach instead of fixed fields, which would be more flexible and future-proof.&lt;/p&gt;
&lt;p&gt;The crate is integrated into &lt;a href="https://feedo.ricardodantas.me"&gt;Feedo&lt;/a&gt;, &lt;a href="https://perch.ricardodantas.me"&gt;Perch&lt;/a&gt;, and my other TUI apps. It&amp;rsquo;s doing exactly what I built it to do: making theming consistent and easy across projects. But now it&amp;rsquo;s also doing something I didn&amp;rsquo;t plan for: connecting me with other developers who care about making terminal apps look beautiful.&lt;/p&gt;
&lt;p&gt;And honestly? That&amp;rsquo;s better than any download count.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check it out:&lt;/strong&gt; &lt;a href="https://crates.io/crates/ratatui-themes"&gt;crates.io/crates/ratatui-themes&lt;/a&gt; | &lt;a href="https://github.com/ricardodantas/ratatui-themes"&gt;GitHub&lt;/a&gt; | &lt;a href="https://docs.rs/ratatui-themes"&gt;Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PRs and new theme suggestions are always welcome. 🎨&lt;/p&gt;</description></item><item><title>Perch: Social Media from the Terminal</title><link>https://ricardodantas.me/posts/perch-a-terminal-social-client/</link><pubDate>Fri, 27 Feb 2026 10:00:00 +0100</pubDate><guid>https://ricardodantas.me/posts/perch-a-terminal-social-client/</guid><description>&lt;p&gt;I&amp;rsquo;ve been on a bit of a streak with Rust and terminal apps. After &lt;a href="https://ricardodantas.me/posts/building-tui-apps-with-rust/"&gt;Feedo and Hazelnut&lt;/a&gt;, I kept looking for things I do daily that could live in the terminal. Social media was an obvious one, and an interesting challenge.&lt;/p&gt;
&lt;p&gt;The thing about social media clients is that they&amp;rsquo;re either overwhelming web apps with infinite scroll and algorithmic noise, or they&amp;rsquo;re bare-bones API wrappers that feel like work. I wanted something in between: a beautiful, keyboard-driven interface that makes social media feel intentional instead of addictive.&lt;/p&gt;
&lt;h2 id="why-a-terminal-client"&gt;Why a Terminal Client?&lt;/h2&gt;
&lt;p&gt;I spend most of my day in the terminal. Between coding, managing files with Hazelnut, reading feeds with Feedo, and everything else, the terminal is home. Opening a browser tab for Mastodon or Bluesky always felt like a context switch. And context switches are expensive.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also something philosophical about using social media in a terminal. It strips away the visual manipulation: the infinite scroll, the notifications badge, the algorithmic feed. You see the content, you engage with it, and you move on. It&amp;rsquo;s social media on your terms.&lt;/p&gt;
&lt;h2 id="what-perch-does"&gt;What Perch Does&lt;/h2&gt;
&lt;p&gt;Perch supports both Mastodon and Bluesky, which covers the decentralized social networks I actually use. You authenticate once, and then everything works through either the TUI (text user interface) or the CLI.&lt;/p&gt;
&lt;p&gt;The TUI is a three-panel layout: accounts on the left, timeline in the center, and post detail on the right. It&amp;rsquo;s navigated entirely with vim keybindings, which at this point feels as natural as breathing. You can browse your home timeline, like and boost posts, reply, compose new posts, everything you&amp;rsquo;d do in a web client.&lt;/p&gt;
&lt;p&gt;But the part I&amp;rsquo;m most proud of is &lt;strong&gt;cross-posting&lt;/strong&gt;. Write a post once, and Perch sends it to both Mastodon and Bluesky simultaneously. I&amp;rsquo;ve been maintaining a presence on both networks, and doing it manually was getting old. Now it&amp;rsquo;s one command or one keystroke.&lt;/p&gt;
&lt;p&gt;The CLI side is equally useful. You can script your social media: schedule posts, fetch timelines, manage accounts, all from shell scripts or cron jobs. It composes nicely with other tools.&lt;/p&gt;
&lt;h2 id="the-technical-bits"&gt;The Technical Bits&lt;/h2&gt;
&lt;p&gt;Building a multi-network social client in Rust was more complex than my previous projects. Mastodon uses OAuth and a REST API, while Bluesky uses the AT Protocol with app passwords. Abstracting these behind a unified &lt;code&gt;SocialApi&lt;/code&gt; trait took some careful design, but the result is clean. Adding a new network in the future would be straightforward.&lt;/p&gt;
&lt;p&gt;Credentials are stored in the system keyring (via the &lt;code&gt;keyring&lt;/code&gt; crate), so no plaintext tokens lying around in config files. There&amp;rsquo;s also a SQLite-backed cache for offline reading, which means Perch works even when your connection doesn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;For theming, I integrated &lt;a href="https://github.com/ricardodantas/ratatui-themes"&gt;ratatui-themes&lt;/a&gt;, a theme library I built separately. Perch ships with 15 themes out of the box, from Dracula to Catppuccin to a neon Cyberpunk theme that&amp;rsquo;s entirely too fun.&lt;/p&gt;
&lt;h2 id="what-i-learned-this-time"&gt;What I Learned This Time&lt;/h2&gt;
&lt;p&gt;Each Rust project teaches me something different:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trait-based abstraction pays off.&lt;/strong&gt; The &lt;code&gt;SocialApi&lt;/code&gt; trait let me treat Mastodon and Bluesky uniformly throughout the app. When I added cross-posting, it was trivial because the abstraction was already there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OAuth in Rust is painful.&lt;/strong&gt; Not because of Rust itself, but because OAuth flows involve HTTP redirects, local servers, token exchange&amp;hellip; it&amp;rsquo;s inherently messy. Getting it right took more time than I&amp;rsquo;d like to admit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SQLite is the right default.&lt;/strong&gt; Every time I reach for SQLite in a desktop/CLI app, I&amp;rsquo;m reminded how good it is. Zero configuration, embedded, fast. The &lt;code&gt;rusqlite&lt;/code&gt; crate makes it feel native to Rust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;People care about themes.&lt;/strong&gt; I added theming almost as an afterthought in Feedo, and it was the most commented-on feature. For Perch, I made it a first-class concern from day one.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="try-it"&gt;Try It&lt;/h2&gt;
&lt;p&gt;Perch is open source and available now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://perch.ricardodantas.me"&gt;perch.ricardodantas.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ricardodantas/perch"&gt;github.com/ricardodantas/perch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;brew install ricardodantas/tap/perch&lt;/code&gt; or &lt;code&gt;cargo install perch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you use Mastodon, Bluesky, or both, give it a try. It might change how you think about social media. Or at least save you from opening another browser tab. 🐦&lt;/p&gt;</description></item><item><title>Launching Pikr: A Color Picker for Accessibility-Minded Developers</title><link>https://ricardodantas.me/posts/launching-pikr/</link><pubDate>Tue, 17 Feb 2026 16:00:00 +0100</pubDate><guid>https://ricardodantas.me/posts/launching-pikr/</guid><description>&lt;p&gt;If you&amp;rsquo;ve ever worked on a UI, whether as a developer or designer, you know the dance. Pick a color. Check if it&amp;rsquo;s accessible. Open another tool. Paste the hex code. Check the contrast ratio. Realize it fails AA. Go back. Adjust. Repeat.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s tedious. And it&amp;rsquo;s a workflow I&amp;rsquo;ve done hundreds of times.&lt;/p&gt;
&lt;p&gt;So I built something to fix it.&lt;/p&gt;
&lt;h2 id="introducing-pikr"&gt;Introducing Pikr&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://getpikr.app"&gt;Pikr&lt;/a&gt; is a color picker with built-in WCAG accessibility contrast checking. Pick any color from your screen, and instantly see if it meets AA or AAA compliance standards. No switching between apps. No copy-pasting hex codes into web tools. Just pick and know.&lt;/p&gt;
&lt;p&gt;It sounds simple because it should be simple. That&amp;rsquo;s the whole point.&lt;/p&gt;
&lt;h2 id="the-problem-it-solves"&gt;The Problem It Solves&lt;/h2&gt;
&lt;p&gt;Accessibility isn&amp;rsquo;t optional anymore, and it shouldn&amp;rsquo;t be. But the tooling around it has always felt fragmented. You have your design tool, your color picker, and then some separate contrast checker (usually a website). Every time you want to verify a color choice, you&amp;rsquo;re context-switching.&lt;/p&gt;
&lt;p&gt;I wanted something integrated. Pick a color, see the contrast ratio against your background, know immediately if it passes. All in one place.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What It Does&lt;/h2&gt;
&lt;p&gt;Pikr keeps things focused:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pick colors from anywhere on screen&lt;/strong&gt; - Works system-wide, not locked to any specific app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instant WCAG contrast checking&lt;/strong&gt; - See AA and AAA compliance as you pick&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple color formats&lt;/strong&gt; - Hex, RGB, HSB, HSL, LAB, and OpenGL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean, minimal interface&lt;/strong&gt; - It stays out of your way until you need it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing more than necessary. I&amp;rsquo;ve grown to appreciate tools that do one thing well.&lt;/p&gt;
&lt;h2 id="why-tauri"&gt;Why Tauri?&lt;/h2&gt;
&lt;p&gt;After spending time with Rust building &lt;a href="https://ricardodantas.me/posts/building-tui-apps-with-rust/"&gt;Feedo and Hazelnut&lt;/a&gt;, I wanted to apply what I learned to a desktop app with an actual GUI. &lt;a href="https://tauri.app/"&gt;Tauri&lt;/a&gt; was the natural choice. It combines a Rust backend with a web-based frontend, resulting in small, fast, native applications.&lt;/p&gt;
&lt;p&gt;The development experience was smooth. Tauri handles the cross-platform complexity (system tray, global shortcuts, native dialogs) while letting me use familiar web technologies for the interface. The final binary is tiny compared to Electron-based alternatives, and it feels snappy.&lt;/p&gt;
&lt;p&gt;Pikr currently runs on macOS and Linux, with Windows support coming soon.&lt;/p&gt;
&lt;h2 id="shipping-something"&gt;Shipping Something&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s something satisfying about taking a personal frustration and turning it into a tool others can use. Pikr started as a solution to my own workflow problem, but accessibility affects everyone building interfaces. If it saves someone else from the tab-switching dance, that&amp;rsquo;s a win.&lt;/p&gt;
&lt;p&gt;The app is available at &lt;a href="https://getpikr.app"&gt;getpikr.app&lt;/a&gt; for $5, or $3 right now with a 40% launch discount. It&amp;rsquo;s not free, but it&amp;rsquo;s also not trying to be a subscription or harvest your data. Just a small tool that does its job.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s Next?&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll keep refining Pikr based on feedback and my own usage. Windows support is the immediate priority. Beyond that, I have some ideas for features, but I want to be careful not to bloat it. The simplicity is intentional.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a developer or designer who cares about accessibility (and you should), give it a look. And if you have feedback, I&amp;rsquo;d love to hear it.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see where this one goes. 🎨&lt;/p&gt;</description></item><item><title>Building TUI Apps with Rust: Feedo and Hazelnut</title><link>https://ricardodantas.me/posts/building-tui-apps-with-rust/</link><pubDate>Wed, 04 Feb 2026 17:00:00 +0100</pubDate><guid>https://ricardodantas.me/posts/building-tui-apps-with-rust/</guid><description>&lt;p&gt;My family traveled abroad for a month, and suddenly I had something rare: free time. Instead of binge-watching series or scrolling endlessly, I decided to channel that energy into something I&amp;rsquo;ve been curious about for a while: Rust development.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been watching Rust from the sidelines for years. The language always intrigued me: its focus on memory safety, the passionate community, the promise of &amp;ldquo;fearless concurrency.&amp;rdquo; But between work and family life, I never found the right moment to dive in properly.&lt;/p&gt;
&lt;p&gt;Well, the moment arrived.&lt;/p&gt;
&lt;h2 id="why-rust"&gt;Why Rust?&lt;/h2&gt;
&lt;p&gt;As a software developer, I&amp;rsquo;ve worked with many languages over the years. JavaScript and TypeScript dominate my day job, and I&amp;rsquo;ve dabbled in Python, Go, and others. But Rust felt different. The learning curve is famously steep, but the payoff (fast, safe, reliable code) seemed worth it.&lt;/p&gt;
&lt;p&gt;What really drew me in was the terminal ecosystem. Rust has incredible libraries for building command-line and TUI (Text User Interface) applications. Tools like &lt;a href="https://ratatui.rs/"&gt;ratatui&lt;/a&gt; make it surprisingly pleasant to create rich terminal interfaces.&lt;/p&gt;
&lt;h2 id="feedo-a-tui-rss-reader"&gt;Feedo: A TUI RSS Reader&lt;/h2&gt;
&lt;p&gt;The first project I tackled was &lt;strong&gt;Feedo&lt;/strong&gt;, a terminal-based RSS feed reader.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always liked RSS. It&amp;rsquo;s the antidote to algorithm-driven feeds: you choose what you want to read, and that&amp;rsquo;s what you get. But most RSS readers are either web-based or clunky desktop apps. I wanted something fast, keyboard-driven, and integrated into my terminal workflow.&lt;/p&gt;
&lt;p&gt;Feedo lets you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add and organize RSS/Atom feeds&lt;/li&gt;
&lt;li&gt;Browse articles with vim-like keybindings&lt;/li&gt;
&lt;li&gt;Open articles in your browser&lt;/li&gt;
&lt;li&gt;Search through your feeds&lt;/li&gt;
&lt;li&gt;Choose from multiple themes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Building it taught me a lot about async Rust, HTTP clients, and XML parsing. The ratatui library made the UI work enjoyable, and I&amp;rsquo;m genuinely happy with how it turned out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check it out:&lt;/strong&gt; &lt;a href="https://feedo.ricardodantas.me"&gt;feedo.ricardodantas.me&lt;/a&gt; | &lt;a href="https://github.com/ricardodantas/feedo"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="hazelnut-automated-file-organization"&gt;Hazelnut: Automated File Organization&lt;/h2&gt;
&lt;p&gt;The second project, &lt;strong&gt;Hazelnut&lt;/strong&gt;, scratches a different itch. It&amp;rsquo;s inspired by &lt;a href="https://www.noodlesoft.com/"&gt;Hazel&lt;/a&gt;, the popular macOS file automation tool.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always wanted something like Hazel, but cross-platform and terminal-based. Hazelnut watches folders and automatically organizes files based on rules you define. Downloaded a PDF? Move it to Documents. Old screenshots? Archive them. Temporary files older than 30 days? Delete them.&lt;/p&gt;
&lt;p&gt;The architecture is split into two parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;hazelnut&lt;/strong&gt; - The TUI for managing rules and watches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hazelnutd&lt;/strong&gt; - The background daemon that does the actual work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Building the daemon was particularly interesting. It uses the &lt;code&gt;notify&lt;/code&gt; crate for cross-platform file watching (inotify on Linux, kqueue on macOS) and supports hot-reloading configuration via Unix signals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check it out:&lt;/strong&gt; &lt;a href="https://hazelnut.ricardodantas.me"&gt;hazelnut.ricardodantas.me&lt;/a&gt; | &lt;a href="https://github.com/ricardodantas/hazelnut"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-i-learned"&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;This month of intense Rust development taught me more than I expected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The compiler is your friend.&lt;/strong&gt; Yes, it&amp;rsquo;s strict. Yes, it will reject your code often. But when it compiles, it usually works. The confidence that brings is remarkable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TUI development is fun.&lt;/strong&gt; There&amp;rsquo;s something deeply satisfying about building interfaces that run in the terminal. It feels efficient and focused.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Side projects need deadlines.&lt;/strong&gt; Having a month with clear free time created natural pressure to ship something. Without that, these projects might have lingered in &amp;ldquo;someday&amp;rdquo; territory forever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rust is worth the investment.&lt;/strong&gt; The learning curve is real, but the language&amp;rsquo;s design makes you think more carefully about your code. That translates to better habits in other languages too.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s Next?&lt;/h2&gt;
&lt;p&gt;Both projects are open source and available on GitHub. I&amp;rsquo;ve already published them on &lt;a href="https://crates.io/"&gt;crates.io&lt;/a&gt; and set up Homebrew formulas, so you can install them with a simple &lt;code&gt;brew install ricardodantas/tap/feedo&lt;/code&gt; or &lt;code&gt;brew install ricardodantas/tap/hazelnut&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s still plenty to improve: better documentation, more features, and refinements based on real-world usage. But for now, I&amp;rsquo;m happy to have shipped two actual tools that I use daily.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re curious about Rust or TUI development, I encourage you to try building something small. The ecosystem is welcoming, the tooling is excellent, and there&amp;rsquo;s something special about seeing your creation run in the terminal.&lt;/p&gt;
&lt;p&gt;Now I just need to figure out what to build next. 🦀&lt;/p&gt;</description></item><item><title>Leveling up my dotfiles</title><link>https://ricardodantas.me/posts/leveling-up-my-dotfiles/</link><pubDate>Fri, 23 Jan 2026 23:54:21 +0100</pubDate><guid>https://ricardodantas.me/posts/leveling-up-my-dotfiles/</guid><description>&lt;p&gt;For months, I have sought better ways to automate reinstalling my work tools when switching to a new laptop. Years ago, I began using &lt;a href="https://www.freecodecamp.org/news/dotfiles-what-is-a-dot-file-and-how-to-create-it-in-mac-and-linux/"&gt;dotfiles&lt;/a&gt;. Initially, I used some tooling I wasn&amp;rsquo;t entirely happy with, but given the options at the time, it was what I had. After a few months, I simplified my approach, adopting only &lt;a href="https://www.gnu.org/software/stow/"&gt;Stow&lt;/a&gt; and a Bash Script for managing my dotfiles. This made the setup process much faster and easier, significantly reducing overhead. However, I was concerned about the security of my secrets, since they were stored in plain text in the config files. Although my repository was private and I used a password manager via a Bash Script, I didn’t feel comfortable with unencrypted passwords in the configs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://mise.jdx.dev/"&gt;Mise (or “mise-en-place”)&lt;/a&gt; is an open-source development environment setup tool designed to make local dev environments easy, consistent, and reproducible across projects and languages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://fnox.jdx.dev/"&gt;Fnox&lt;/a&gt; is a developer-focused secret management CLI tool that helps you securely manage and use sensitive configuration values (like API keys, database passwords, tokens) across development, CI/CD, and production workflows. It combines encrypted storage in version control with support for remote secret providers into a single workflow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;rsquo;t like giving other apps permission to integrate with my password manager, and that is non-negotiable. This was one of the main problems in integrating my secrets with my old workflow. With Fnox and Mise, I can pull the secrets from my password manager during the setup script, encrypt them with a disposable key, and that is it. No secrets exposed in the config files.&lt;/p&gt;
&lt;p&gt;Maintaining my Bash scripts became much easier thanks to &lt;a href="https://mise.jdx.dev/tasks/"&gt;Mise Tasks&lt;/a&gt;. It reminded me of &lt;a href="https://www.gnu.org/software/make/manual/make.html"&gt;Makefiles&lt;/a&gt;, but easier to use. Additionally, with support for managing versions of Node.js, Rust, Ruby, and many other packages (since it also functions as a package manager), along with integration for &lt;a href="https://mise.jdx.dev/configuration.html#idiomatic-version-files"&gt;idiomatic version files&lt;/a&gt; like .ruby-version, Gemfile, .nvmrc, environment variable management, and CI/CD integration, it fulfilled all my needs.&lt;/p&gt;
&lt;p&gt;As a result, my dotfiles are now easier to maintain, more secure, and quicker to install. I might consider making my dotfiles public at some point. Yeah&amp;hellip; maybe. 🤔&lt;/p&gt;
&lt;p&gt;And, Yes! I rotated all my secrets while refactoring my dotfiles and recreated my repo from scratch. 😎&lt;/p&gt;</description></item><item><title>New Release: Edge Protocol</title><link>https://ricardodantas.me/posts/new-release-edge-protocol/</link><pubDate>Wed, 15 Oct 2025 19:07:26 +0100</pubDate><guid>https://ricardodantas.me/posts/new-release-edge-protocol/</guid><description>&lt;p&gt;Today is the day! I am excited to announce the release of my first album, &amp;ldquo;Edge Protocol&amp;rdquo;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A cinematic cyberpunk EP chronicling the origin of a dystopian world where rogue AIs, militarized corporations, and augmented rebels clash. The EP unfolds the chain reaction sparked by a single event: Genesis Override, the first cyber-assault that triggers the collapse of modern civilization. What follows is warfare, infiltration, survival, and the emergence of a resistance protocol: Edge Protocol.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is available on all streaming platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/album/1gamDUY9ZQybvNtUdoA8IM"&gt;Spotify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geo.music.apple.com/us/album/edge-protocol/1843580770?app=music&amp;amp;ls=1"&gt;Apple Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tidal.com/album/464313637"&gt;Tidal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deezer.com/album/831594791"&gt;Deezer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And many more &lt;a href="https://ffm.to/prln8ex"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;img src="uploads/2025/edge-protocol-cover-art-1400x1400.jpg" width="600" height="600" alt=""&gt;</description></item><item><title>OUT NOW: Killware</title><link>https://ricardodantas.me/posts/out-now-killware/</link><pubDate>Wed, 17 Sep 2025 11:11:08 +0100</pubDate><guid>https://ricardodantas.me/posts/out-now-killware/</guid><description>&lt;p&gt;My debut single, Killware, is out now! 🎉&lt;/p&gt;
&lt;p&gt;&lt;img src="https://eu.uploads.micro.blog/237808/2025/e142f051cd.png" alt="cover art"&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Killware&amp;rdquo; began as a fun little idea during a late-night jam session, and before I knew it, it evolved into a more electronic and techno-inspired track. This sparked even more inspiration for the other tracks that will be featured on my first EP, which is set to release on October 15, 2025.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a short instrumental track, just like the others on the upcoming EP, that uses sound effects to tell a story. The EP as a whole is inspired by a cyberpunk theme. So, if you&amp;rsquo;re creating this type of content, it might be helpful for your project.&lt;/p&gt;
&lt;p&gt;Assembling and releasing everything took a long time, but it was a very rewarding experience. Now I understand the entire process of releasing a song. I’ve taken on the entire process myself, from composing and mixing to mastering and publishing through a distributor.&lt;/p&gt;
&lt;p&gt;If you take the time to listen to my music, thank you so much. If you save it to a playlist or share it with a friend, it means the world to an independent artist like me. It genuinely helps me keep going. I’d love to hear what you noticed about my music: a transition you enjoyed, a tone that resonated with you, or even suggestions for improvement. I’m constantly learning and growing with each track I release.&lt;/p&gt;
&lt;p&gt;Listen on streaming platforms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/track/0f3P6PJ0qEVfqOHhTxgwYQ?nd=1&amp;amp;dlsi=370a0ad9a18b40eb"&gt;Spotify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://music.apple.com/se/album/killware/1840079890?i=1840079891"&gt;Apple Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=CV1JLdMKTVQ"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://music.youtube.com/watch?v=CV1JLdMKTVQ"&gt;YouTube Music&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are additional links for other streaming platforms: &lt;a href="https://ffm.to/darkfrets-killware"&gt;https://ffm.to/darkfrets-killware&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you’d like to support me even further, you can do so on &lt;a href="https://ko-fi.com/darkfrets"&gt;my Ko-fi profile&lt;/a&gt; or by purchasing tracks on &lt;a href="https://darkfrets.bandcamp.com/album/killware-single"&gt;Bandcamp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Guess what? My second EP is already in progress! Stay tuned for more exciting updates, available right here on this blog and on &lt;a href="https://ko-fi.com/darkfrets"&gt;my Ko-fi profile&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>My first EP: Mix and Master are done!</title><link>https://ricardodantas.me/posts/my-first-ep-mix-and/</link><pubDate>Thu, 04 Sep 2025 15:40:00 +0100</pubDate><guid>https://ricardodantas.me/posts/my-first-ep-mix-and/</guid><description>&lt;p&gt;I have finally completed the mixing and mastering process! 🎉&lt;/p&gt;
&lt;p&gt;In the next couple of weeks, the single will be released, followed by the EP in mid-October.&lt;/p&gt;
&lt;p&gt;It was intense and a lot of work, but I managed to do it all by myself. The learning curve was long, and I still have much to learn to improve my workflow. However, I&amp;rsquo;m happy to say it&amp;rsquo;s finally done!&lt;/p&gt;
&lt;p&gt;I spent hours learning about registering songs, entering data for the distribution to streaming platforms, and registering the songs with the &lt;a href="https://en.wikipedia.org/wiki/Performance_rights_organisation"&gt;PRO&lt;/a&gt;. Now, it’s just a matter of waiting for the distribution process to be completed. Soon, I will reveal the title and links for the streaming platforms.&lt;/p&gt;
&lt;p&gt;Overall, it was a very interesting process to learn about composing, mixing, distributing, and releasing music.&lt;/p&gt;</description></item><item><title>12 Albums That Shaped My Music Taste</title><link>https://ricardodantas.me/posts/albums-that-shaped-my-music/</link><pubDate>Sat, 16 Aug 2025 07:00:00 +0100</pubDate><guid>https://ricardodantas.me/posts/albums-that-shaped-my-music/</guid><description>&lt;p&gt;The albums that profoundly influenced my musical taste during my teenage and early adult years were truly transformative. Each one holds a special place in my heart, representing not just a collection of songs but moments of self-discovery and emotional growth. These albums introduced me to various genres and artists, expanding my horizons and shaping my identity. Each record played a significant role in defining my appreciation for music and its ability to connect deeply with personal experiences.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Iron Maiden - Fear Of The Dark&lt;/li&gt;
&lt;li&gt;Iron Maiden - Best Of the Beast&lt;/li&gt;
&lt;li&gt;Black Sabbath - Paranoid&lt;/li&gt;
&lt;li&gt;Metallica - Black Album&lt;/li&gt;
&lt;li&gt;Megadeth - Rust in Peace&lt;/li&gt;
&lt;li&gt;Van Halen - Van Halen&lt;/li&gt;
&lt;li&gt;Angra - Rebirth&lt;/li&gt;
&lt;li&gt;Unearth - The Oncoming Storm&lt;/li&gt;
&lt;li&gt;Misery Signals - Of Malice and the Magnum Heart&lt;/li&gt;
&lt;li&gt;As I Lay Dying - Shadows Are Security&lt;/li&gt;
&lt;li&gt;As I Lay Dying - Frail Words Collapse&lt;/li&gt;
&lt;li&gt;Killswitch Engage - The End of Heartache&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Music: Producing my first EP</title><link>https://ricardodantas.me/posts/music-producing-my-first-ep/</link><pubDate>Fri, 15 Aug 2025 16:04:00 +0100</pubDate><guid>https://ricardodantas.me/posts/music-producing-my-first-ep/</guid><description>&lt;p&gt;I know my &lt;a href="https://instagram.com/darkfrets"&gt;Instagram&lt;/a&gt; may look abandoned. I&amp;rsquo;ve been quiet there and took a break from posting cover songs. The reason is that I&amp;rsquo;ve been working on my first EP, which might include four to five short-length songs. I&amp;rsquo;ve always wanted to release my music, but I&amp;rsquo;ve postponed this dream for decades, and now it feels like I&amp;rsquo;m very close to making it a reality.&lt;/p&gt;
&lt;p&gt;All the songs are instrumental and designed to tell a story on their own, with sound effects, quite different from the metal music I usually write. The songs are finished, and I&amp;rsquo;m currently in the process of mixing and mastering them. This may take some time, as I can only dedicate a few hours at a time. I&amp;rsquo;m handling everything myself without outsourcing any part of the work. Because of this, the release of the singles and the EP will be entirely independent, which requires more time. However, it has been an interesting challenge in many ways, and I&amp;rsquo;ve been learning a lot about the various aspects of the process.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s all I can share for now. Hopefully, I will make it through the next months. 🤞&lt;/p&gt;</description></item><item><title>I was too optimistic about using Safari as my default browser</title><link>https://ricardodantas.me/posts/i-was-too-optimistic-about/</link><pubDate>Fri, 15 Aug 2025 11:02:51 +0100</pubDate><guid>https://ricardodantas.me/posts/i-was-too-optimistic-about/</guid><description>&lt;p&gt;I was initially optimistic about Safari, as it was fast and smooth. However, once I started using extensions, it began to freeze and crash frequently. This was particularly frustrating with the Grammarly extension, which I rely on heavily. Additionally, I experienced crashes on YouTube, and the sound would randomly stop working, forcing me to reload the page. I tried various workarounds, but none of them resolved the issues.&lt;/p&gt;
&lt;p&gt;For now, I am switching back to Arc, even though &lt;a href="https://www.theverge.com/news/674603/arc-browser-development-stopped-dia-browser-company"&gt;it will no longer be updated with new features&lt;/a&gt;. Arc just works, and for web development, it is much better than Safari.&lt;/p&gt;
&lt;p&gt;This experience is part of my broader journey of &lt;a href="https://ricardodantas.me/posts/leaning-into-the-apple-ecosystem/"&gt;leaning into the Apple ecosystem&lt;/a&gt;, where I talk about the trade-offs of going all-in on Apple products and services.&lt;/p&gt;</description></item><item><title>My top 10 movies of all time</title><link>https://ricardodantas.me/posts/my-top-movies-of-all/</link><pubDate>Sun, 10 Aug 2025 09:42:57 +0100</pubDate><guid>https://ricardodantas.me/posts/my-top-movies-of-all/</guid><description>&lt;p&gt;I have a deep love for these movies and have watched them many times.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0133093/?ref_=chttp_t_16"&gt;The Matrix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0096874/?ref_=ext_shr_lnk"&gt;Back to the Future Part II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0083658/?ref_=ext_shr_lnk"&gt;Blade Runner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0120815/?ref_=chttp_t_24"&gt;Saving Private Ryan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0167260/?ref_=chttp_t_6"&gt;The Lord of the Rings: The Return Of The King&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0816692/?ref_=chttp_t_18"&gt;Interstellar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt1375666/?ref_=chttp_t_14"&gt;Inception&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0109830/?ref_=chttp_t_11"&gt;Forrest Gump&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt0120689/?ref_=chttp_t_25"&gt;The Green Mile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.imdb.com/title/tt1675434"&gt;Untouchable&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Thank you Mr. Ozzy Osbourne</title><link>https://ricardodantas.me/posts/thank-you-mr-ozzy-osbourne/</link><pubDate>Tue, 22 Jul 2025 20:07:34 +0100</pubDate><guid>https://ricardodantas.me/posts/thank-you-mr-ozzy-osbourne/</guid><description>&lt;p&gt;Today marks a profoundly sad day for the Heavy Metal community as we mourn the loss of the legendary Ozzy Osbourne. His passing leaves a significant void, as he was a major influence on generations of musicians and fans, including myself. Ozzy was a pivotal figure who played a crucial role in shaping the Heavy Metal genre, and his legacy will undoubtedly endure.&lt;/p&gt;
&lt;p&gt;So thank you, Mr Ozzy Osbourne! Rest in peace.&lt;/p&gt;
&lt;img src="uploads/2025/98b4d9f011.jpg"&gt;</description></item><item><title>Leaning Into the Apple Ecosystem</title><link>https://ricardodantas.me/posts/leaning-into-the-apple-ecosystem/</link><pubDate>Tue, 15 Jul 2025 09:39:44 +0100</pubDate><guid>https://ricardodantas.me/posts/leaning-into-the-apple-ecosystem/</guid><description>&lt;p&gt;I began my journey with computers in 1996, using MS Windows. In 1999, I discovered the incredible world of Open Source and Linux, which was mind-blowing.&lt;/p&gt;
&lt;p&gt;In 2006, after a trip to the 🇳🇱 Netherlands, I met a guy using a MacBook. I approached him and asked about the computer, and he enthusiastically discussed it. He mentioned that there was an Apple store nearby, which had a wide variety of products on sale. Excited by the opportunity, I decided to buy my very first Apple device, a white MacBook. I had never used macOS before, so I spent the day familiarizing myself with it and customizing the settings to suit my preferences. It was a rewarding experience, and since then, I have exclusively used MacBooks.&lt;/p&gt;
&lt;p&gt;The macOS has been a key part of my workflow. For my use case, it is the best Operating System, especially with all the improvements and integration with iPhones and iPads in the last decade.&lt;/p&gt;
&lt;p&gt;I have always been concerned about being locked into a single ecosystem, which feels unsettling. Naturally, I have had those thoughts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;What if I decide to switch to a different ecosystem someday?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Some apps and workflows that are designed exclusively for Apple devices may have difficulty adjusting to new environments.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah, those points make sense, but in reality, I never switched or truly wished to move away from Apple. In fact, I have only become more invested in their features and devices. Over the years, I have acquired more and more Apple products, and now I own an Apple TV, Apple Watch, iPhone, iPad, MacBook, and Magic Keyboard. However, I do not have the Magic Mouse; in my opinion, it has poor ergonomic design. While its features are impressive, I find it uncomfortable to use for long sessions.&lt;/p&gt;
&lt;p&gt;After the recent announcement about unifying features across Apple devices with iOS, macOS, watchOS, and tvOS 26, which will significantly enhance my workflow, I have been considering fully committing to the Apple ecosystem. The overall experience and simplicity of using Apple products are hard to beat. Everything just works, eliminating the need to waste time on configurations. The interface is very intuitive for me, likely because I have been using their devices for decades. If I had to summarize my experience in a single word, it would be &amp;ldquo;convenience.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;For my online services and apps, I have the following setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;iCloud:&lt;/strong&gt; Basic plan includes 50GB for syncing app data and hosts my main email with a custom domain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apple Music:&lt;/strong&gt; I recently switched from Spotify because I can&amp;rsquo;t stand the way they treat artists, and their user interface has become very cluttered in recent years. Additionally, I wanted better integration with Apple operating systems, especially to use features like Shortcuts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apple TV:&lt;/strong&gt; I subscribe occasionally. Their catalog is currently limited, especially for kids&amp;rsquo; content. Because of this, I primarily use Netflix and Disney+ for video streaming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Google Drive:&lt;/strong&gt; It&amp;rsquo;s my main cloud storage provider, chosen for easy sharing with non-Apple users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Google Photos:&lt;/strong&gt; It&amp;rsquo;s similar to Google Drive, but it&amp;rsquo;s easier to share with non-Apple users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mail:&lt;/strong&gt; I have used Apple Mail for years. I also tried many third-party apps, but due to performance, simplicity, and privacy concerns, I returned to Apple Mail.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt; I experimented with various note-taking apps, but ultimately I returned to Apple Notes because accessing my notes across my Apple devices is seamless and straightforward. However, I do miss Markdown, so I use &lt;strong&gt;iA Writer&lt;/strong&gt; for creating Markdown content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reminders:&lt;/strong&gt; Just like Apple Notes, this app is seamless and incredibly user-friendly. It&amp;rsquo;s my go-to task management tool!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Final Cut:&lt;/strong&gt; for video editing. Love it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Logic Pro:&lt;/strong&gt; I am currently in a 90-day trial period and not using it yet, but I plan to start soon, especially after the recent updates that include AI integration and improved performance. For music production, I have been using &lt;strong&gt;Luna&lt;/strong&gt; from Universal Audio, which I really like. The workflow is very intuitive; however, there are times when it struggles with performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;XCode:&lt;/strong&gt; For Apple app development, I am still new to this field, but it is the most integrated IDE for the job. For my regular software development routine, I use &lt;strong&gt;VS Code&lt;/strong&gt;. Xcode is not suitable for languages other than Swift and Objective-C, and it lacks many features.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Safari:&lt;/strong&gt; I switched to Safari for internet browsing because of its performance, bookmark management across devices, which suits my needs for most daily tasks. Previously, I used Arc, but managing numerous pinned tabs became a nightmare, and I frequently experienced performance issues in recent months. However, I still use Arc as a secondary browser for its translation feature, especially when I need to translate languages like Swedish that aren&amp;rsquo;t supported by Apple&amp;rsquo;s translation feature. For front-end related work, I primarily use Arc as well, but I am considering switching to another browser for secondary use. &lt;em&gt;(Update: I ended up &lt;a href="https://ricardodantas.me/posts/i-was-too-optimistic-about/"&gt;switching back to Arc&lt;/a&gt; after Safari&amp;rsquo;s extension crashes became too frequent.)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maps:&lt;/strong&gt; I’ve started using Apple Maps more frequently than Google Maps, and I realized it can create lists like Google Maps. This was the missing feature for me. Now, I think it’s finally time to switch completely from Google Maps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smart home:&lt;/strong&gt; I used to use a combination of Google devices, including Google Nest and Google Home, along with the Apple ecosystem. However, I decided to eliminate many of these devices due to compatibility and privacy concerns. Now, I only keep the devices that I truly need and that are Matter-compatible. My plan is to acquire several HomePod Minis to play Apple Music throughout my home.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I plan to completely move away from Google services. Months ago, I began the process of reducing my dependence on Google in my digital life. I dislike their core values, especially regarding privacy. I&amp;rsquo;m uncertain about the timing and method of this transition, but I will attempt to share updates here.&lt;/p&gt;
&lt;p&gt;I understand that none of the major tech companies prioritize privacy, but I try to stick with those that are more committed to delivering privacy-first features.&lt;/p&gt;
&lt;p&gt;At the end of the day, it’s not about brand loyalty, it’s about using the tools that help me focus on what matters most: my work, my creativity, and my life with less friction.&lt;/p&gt;
&lt;p&gt;I know this setup isn’t perfect, and it might evolve over time. But right now, the Apple ecosystem gives me the balance of performance, simplicity, and integration that I need without constant maintenance or second-guessing.&lt;/p&gt;
&lt;p&gt;I’ll keep exploring, refining, and adjusting along the way. If it helps bring a bit more peace and flow into my digital life, then it’s a path worth continuing.&lt;/p&gt;</description></item><item><title>My first Micro.blog contribution: Instagram plugin</title><link>https://ricardodantas.me/posts/my-first-microblog-contribution-instagram/</link><pubDate>Mon, 14 Jul 2025 21:51:49 +0100</pubDate><guid>https://ricardodantas.me/posts/my-first-microblog-contribution-instagram/</guid><description>&lt;p&gt;This is my first contribution to the Micro.blog community. I’ve created a simple plugin that lets you embed Instagram posts and reels right into your Micro.blog posts.&lt;/p&gt;
&lt;p&gt;To install it, just search for Instagram in the plugins directory.&lt;/p&gt;
&lt;p&gt;Code available on &lt;a href="https://github.com/ricardodantas/mbplugin-instagram-embedded-posts"&gt;Github&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Starting without a plan</title><link>https://ricardodantas.me/posts/starting-without-a-plan/</link><pubDate>Mon, 14 Jul 2025 12:48:52 +0100</pubDate><guid>https://ricardodantas.me/posts/starting-without-a-plan/</guid><description>&lt;p&gt;I’ve been thinking about starting a blog for a little while now. It’s not about having an audience or building a personal brand. I just want to slow down and share what’s on my mind.&lt;/p&gt;
&lt;p&gt;As a software developer and a dad, I understand the challenges of balancing work and family life. I find joy in playing guitar and writing code, and I’m constantly striving to live a more mindful life.&lt;/p&gt;
&lt;p&gt;I’m not quite sure yet what this blog will become. Maybe it’ll be a place to share my thoughts on life in Sweden, digital habits, fatherhood, or even the occasional nerdy tech or guitar post. Or maybe it’ll just serve as a public journal.&lt;/p&gt;
&lt;p&gt;There is no set schedule for posts; I will write whenever I have time and feel inspired to share something.&lt;/p&gt;
&lt;p&gt;Let’s see where this journey takes us.&lt;/p&gt;</description></item></channel></rss>