RSSAmplifier

Blog

maciej.litwiniuk.net

maciej.litwiniuk.netRSS feed ↗20 posts

Latest posts

Overmaxxing the AI

I have to admit—I’ve been overwhelmed by large language models' capabilities. Videos, images, music, code, and specifically here—written word. For some time, I've used it for almost every piece of content I've shared or published, including on my personal blog. What was meant to improve clarity became AI-generated drafts based on my vague prompt. You know, a sentence or two describing my…

Making Encrypted Records Searchable (Without Losing Sleep Over Your Audit)

TL;DR I needed full-text search across compliance records in Humadroid — some of which are encrypted at the application layer. The naive answer is "just decrypt everything into a search index." The real answer involves understanding exactly what you're trading, making that trade-off explicit and per-organization, and designing the index so it reveals as little as possible. Here's the pattern I…

How We Pivoted from HRMS to GRC (and Somehow Got SOC 2 Certified Without Losing Our Minds)

Me and Bartek before learning about System Descrition I need to share something that makes my impostor syndrome go absolutely wild: the complete clusterfuck that was our journey to SOC 2 certification. Because here's the thing about vulnerability in entrepreneurship—every time I think about sharing the messy parts, that voice kicks in: "Won't admitting you struggled destroy your credibility?" Fuck…

I Got Paranoid About Security, So I Vibe-Coded a Rails Engine (Use at Your Own Risk)

Beskar TL;DR Built Beskar - a Rails security engine with WAF, impossible travel detection, and auto-banning. Named after Mandalorian armor because layered protection. Mostly vibe-coded. Currently running in monitor-only mode on Humadroid because I'm not quite paranoid enough to trust my own paranoia gem. You probably shouldn't use it yet. But here it is anyway. The SOC 2 Paranoia Spiral I'm going…

I Rage-Quit WordPress and Built My Own Rails Site (Here's What Broke)

TL;DR I migrated my startup's website from WordPress to Rails because I was tired of fighting with hosting providers and plugin conflicts. Built custom scraping scripts, exported everything to Markdown, and automated SEO optimization with background jobs. Made several painful mistakes: forgot to remove old URLs from Search Console, used 301 redirects instead of 410 status codes, and nearly tanked…

A Simple Solution for Combining Different Data Types in Rails

When building Humadroid's dashboard, I needed to show both company announcements and employee shoutouts in a single feed. At first, I took what seemed like the easy route - using notifications as a bridge between these different types of content. Each announcement or shoutout would create a notification, and I'd just query those. Simple enough, right? Well, not quite. I soon realized this approach…

Quick Tip: Reading Ruby Version from .tool-versions in Your Gemfile

While migrating from asdf to mise as my version manager, I needed to update how my Gemfiles read the Ruby version. It's a small change, but I thought it might be useful to share. With asdf, I was using .ruby-version : ruby File .read( File .expand_path( '.ruby-version' , __dir__ )). chomp Now with mise using .tool-versions , which can contain versions for multiple languages, the line changed to:…

A Simple Fix for Dynamicly Added External Widgets in Turbo-Enabled Sites

While working on Humadroid , I recently stumbled upon an interesting challenge with our chat widget. It's a small discovery, but one that might save other developers some headaches. The Problem If you're using Turbo (formerly Turbolinks) and external widgets like Chatwoot , you might notice they disappear or reload whenever you navigate between pages. This happens because these widgets usually…

This Week I've Learned - 2024-W49

PERSONAL No post last weeks - had to take a break. Learning that rest is important, even when there's lots to do. TECH & CODING WordPress Got Humadroid's landing page rewritten in WordPress to let Bartek edit content without my help. Big thanks to Ilia and Florin from inntech who handled it. The frontend is super fast, but I was surprised how slow the admin side has become - making complex changes…

Nested forms with just Turbo Streams

Edit 11.12.2024 : I've updated turbo stream responses to include field index. Recently I was working on implementing dynamic nested forms using Turbo Streams, focusing on handling both new and persisted records without custom JavaScript. Well, mostly for fun, to try something new. And while there are multiple approaches to this problem, including Stimulus controllers or plain JavaScript, Turbo…

This Week I've Learned - 2024-W45

PERSONAL Spent last weekend hiking in Czechia. There's something special about autumn hiking - good weather, fewer people, and those calming colors... CODING & TECH Ruby & Elixir Found this interesting read: Implementing distributed pooling in Elixir . While I'm not confident writing Elixir (never spent enough time learning its API), I'm fascinated by its networking and "supervising" aspects.…

This Week I've Learned - 2024-W44

CODING Found a nice Ruby gem (actually it was recommended to me in this Xitter thread ) - procore-oss/blueprinter which seems to be a very nice serializer (JSON Object Presenter) for Ruby. As I was implementing API for Humadroid recently with Time-To-Market in mind, I've actually settled on Grape & Grape Entity, but when we'll be creating v2 of it in bigger team, we'll most likely look for…

This Week I've Learned - 2024-W43

Quick Learnings PRODUCT Vacation policies can be hard. We've decided not to solve all the problems and leave some flexibility for the users. Automation is important, but people are people and sometimes just manual adjustment is worth more than covering any possible use case. HARDWARE Keyboard marks on my macbook's screen drive me crazy. It's not that I see them all the time, but once I saw them, I…

This Week I've Learned - 2024-W42

Trying to restart this blog, one thing at a time. For quite some time I wanted to start publishing some smaller blobs I find interesting, but giving each and everyone a post seemed wasteful. That's why I've decided to publish my weekly learnings and findings - some links, some thoughts from development, some API methods I haven't used before. Without further ado, here it is for the first time.…

Feature Development in Humadroid

Sometimes, when I read other companies' blogs, I feel like they have it all figured out. They talk about big plans and cool ideas. But for me and Humadroid, it's a lot messier. How It Really Happens Most of the time, new ideas for Humadroid come from everyday problems. Here's how it usually goes: I get stuck: I'm working and hit a problem I can't solve easily. I get frustrated: I try a bunch of…

Figuring Out User Invitations in Humadroid

Building Humadroid by myself is tough. I'm good at writing code, but coming up with new ideas for the app can be really hard when I don't have anyone to talk to about it. Sometimes I write these blog posts just to help me think things through. The Invitation Problem The other day, my friend wanted to try out Humadroid. It made me realize something important: when someone signs up, they might not…

Multiple apps on one server using kamal

Kamal's effectiveness is undeniable. Its integration with power-efficient bare-metal servers, such as those available on Hetzner.com, elevates its appeal, allowing for the simultaneous deployment of multiple Rails applications (or applications developed with other frameworks) on a single server. This setup can be further enhanced with the inclusion of additional components like PostgreSQL or…

Self-hosting tunnel exposing local ports to the internet with custom domain

Although there are some existing solutions to expose local port to the internet, I've decided to use self-hosted solution. I've prefered this over hosted one for few reasons: I wanted to have some pre-configured subdomains I wanted those subdomains to be fixed and/or reserved just for me Custom domain was a nice addition Cost of hosted solution was just too high to justify it. It was just a fun…

Intro to protobuf (with ruby)

Protobuf or more precisely Protocol Buffers is a data serialization format developer by Google and it is designed to be language-agnostic. What's important (and what makes it a better choice than ie. JSON) is that it automatically provides validation of data, preserves order in arrays and provides pre-generated classes that do all the hard work with set of setters and getters. Magic is done by…

git using different ssh key on per directory basis

Disclaimer - I found this solution thanks to my friend Piotr who needed it for different use case, described below. Recently I had to use multiple repositories on one server with different deploy keys. Solution suggested by github docs was not viable, because I could not alter hostname easilly, as it suggest. It turns out, that actually you can use different keys on per directory basis, when using…