RSSAmplifier

Blog

felipe

felipeelias.github.ioRSS feed ↗25 posts

Latest posts

claude-statusline: a configurable status line for Claude Code

Claude Code lets you customize the status line at the bottom of your terminal. The default suggestion is a bash script, which works but gets clunky fast and difficult to maintain for more complex features. There are other tools out there that solve this (more on that below), but none written in Go. I think Go is the right fit here: fast, compiles to a single binary, and cross-platform out of the…

HookLab - Watch your Claude Code hooks in real time

Claude Code recently added HTTP hooks . Instead of shell scripts, you can point hook events at a URL. I built HookLab to play with that. It’s a live dashboard. Every hook event shows up in the browser as it happens: which tools are being called, what arguments they get, what comes back. You can filter by event type, tool, session, and expand any row to inspect the full payload. To run it: services…

You Should Be Versioning Your ~/.claude Config

If you’ve been using Claude Code for a while, you’ve probably accumulated a decent amount of configuration: settings, skills, custom agents, CLAUDE.md instructions. Losing all of that would be annoying. The fix: git init inside ~/.claude , with some caveats. What lives in ~/.claude Based on the official docs , here’s what’s worth versioning: CLAUDE.md settings.json skills/**/SKILL.md…

Elixir Toolbox - Major Update

I’ve been working on Elixir Toolbox quite a bit lately and wanted to share what’s new: More categories: ~150 now, including AI/LLM sections (and more) JSON API : the aggregated data is now exposed for anyone to query New trending page, showing packages by recent downloads llms.txt and llms-full.txt endpoints so LLMs can read the catalog: try asking your AI agent to “find me the best Elixir package…

Perfect Claude Code Notifications Setup with Tailscale and ntfy

If you’re like me and have been hooked into running Claude Code on your phone , running several sessions in parallel like Boris , you may have noticed that it is easy to lose track of what is going on across all those sessions. You may go away for a sec, distracted by Minecraft parkour videos and forget that Claude is waiting for your input. Idea Claude Code comes with a notification hook . Some…

Building Houses and Skyscrapers

AI agents are making software more accessible for everyone. Now, with a bit of knowledge of the tools, you can build a site or an app. But will you be able to build Google? I think of it as an analogy to building your own house. You can do it yourself with little knowledge, but the more knowledge you have, the better the house you can build. Building a skyscraper alone, though? That’s going to be…

Using Elixir Telemetry and Tesla

Tesla provides a Telemetry middleware which is pretty straightforward to configure for your clients. However, I find that the middleware on its own is not sufficient to get more detailed metrics . My goal here is to be able to extract the domain and the path in the metrics. This post will show you how to do that. API Client As an example, we’ll create an API client to hex.pm . defmodule MyApp .…

Don't lose that Sidekiq job (and your job)

Many of you have already encountered during your software development career, the following task: write something to the database schedule a job to run asynchronously, because of the database change A simple concrete example may be creating a user and sending a welcome email in the background. Or creating an order, and charging the user in the payment system. Or updating a record in the database…

A new scheduler for Eventboss

Eventboss is a Pub/Sub built on top of SNS and SQS. It’s one of the main components used in AirHelp to handle service-to-service communication. In this post, I’ll go through the internals of the subscriber component, which handles consuming messages from SQS. Shortly before we open-sourced the Eventboss gem, I decided to invest some time improving the subscriber internals and making it more…

On being a Senior Software Engineer

SE means Software Engineer, Developer or Programmer. It may sound shocking for some people, but: as a Software Engineer, you are not hired to code 100% of the time. Companies hire you to solve problems . You happen to have SE skills. The code that you write is just the medium. Most of the times, solving a problem to a SE, you need to: talk to a lot of people read a lot of code draw a diagram of…

Denormalized indexing with elasticsearch-rails

One of the biggest advantages of using Elasticsearch it is because it’s fast even if you have very complex documents with many attributes coming from different models. Achieving that requires you to denormalize those models into a single index and it’s your responsibility as a developer to keep it consistent. That reveals some interesting challenges, let’s take a look. Blog in 5 minutes Imagine we…

Net::HTTP and Timeouts

Ruby’s Timeout is considered dangerous ! That’s sad because I have tons of HTTP requests wrapped in Timeout::timeout {} and it seems that the alternative out there is to use open_timeout and/or read_timeout . My quest is to understand how to use them because they don’t work exactly the same as wrapping your HTTP request into a Timeout block. What are sane values for those two options, and how to…

Optimal way of processing large files in Ruby

I was asked what was the optimal way to process files in Ruby . I had some assumptions, but they turn out to be wrong 😁, so I’m writing this post for future reference (and for anyone out there interested on it). Note: the “benchmarks” here are non-scientific, they are just a way to show in how many orders of magnitude the examples differ from each other File.readlines/IO.readlines This is by far…

December Picks

November was a slow month since I was on vacation, but I managed to pick up some good stuff. Take a look! The Myth of the Root Cause Link: http://blog.scalyr.com/2016/10/the-myth-of-the-root-cause/ I learned a lot from this post, and the paper it refers to: “How Complex Systems Fail” . If you work with distributed systems and you ever had to write a post-mortem this is a must read. The post…

October Picks

A rather long list, maybe you’ll find something interesting! [Tool] fswatch Link: https://github.com/emcrisostomo/fswatch The simplest way to run a command whenever a file changes: fswatch . | xargs -n 1 ruby Whenever a file changes in the directory you are (set by . ), it will pipe that file name via xargs to the Ruby executable. [Tool] Quick Look Markdown files on OS X Link:…

How I finished my endless reading list

I keep all my reading list on Pocket , which is a great app for that. I got the Chrome extension, mobile app and even an integration on IFTTT that saves all my liked tweets to Pocket. This is very convenient, but there is an obvious problem: I ended up with tons of things to read, which made me quite frustrated. “I will never finish reading all of this.” This obviously couldn’t go on forever.…

August/September Picks

[Tool] Fonts with ligatures Link: https://github.com/tonsky/FiraCode I didn’t know that fonts could have ligatures, and this is pretty epic! [Post] Preprocessing CSV data in Ruby Link: http://kgrz.io/ruby/2016/08/05/better-csv-preprocessing-in-ruby.html Great tip of using :converters option of CSV.parse . It lets you convert columns to specific formats during parsing. An example: rows = CSV .…

TIL: Python Threadpool

I’m not very proficient in Python yet, but while playing with it, I felt the need to do a bunch of API calls concurrently. In Ruby, you can achieve that with gems like concurrent-ruby , but turns out Python has an implementation of a threadpool in its standard library, and you can use it like this: from multiprocessing.pool import ThreadPool # Work that will be done concurrently def work ( index…

July Picks

[Tool] Zero code option parser Link: http://docopt.org/ docopt is an option parser that is based on conventions that have been used for decades in help messages and man pages for describing a program’s interface. An interface description in docopt is such a help message, but formalized. [Tool] Git 2.9 diff improvements Git 2.9 has been released and with it, few nice additions, my favourites goes…

June Picks

[Article] Rails has won Link: http://www.akitaonrails.com/2016/05/23/rails-has-won-the-elephant-in-the-room This is a response to My time with Rails is up . I recommend reading both articles. While Rails is bloated and there are technically superior solutions out there, we have to accept the reality: People think that because something is “technically superior” everybody else should blindly adopt.…

Erlang, Senior Engineers, Command Lines and Better A/B testing - April Picks

[Video] Systems that Run Forever Self-heal and Scale Link: http://www.infoq.com/presentations/self-heal-scalable-system Joe Armstrong outlines the architectural principles needed for building scalable fault-tolerant systems built from small isolated parallel components which communicate though well-defined protocols. [07:25] in general is a bad idea to start a design for 100s of people and scale…

mysql2 gem installation hell

The current version of MySQL on homebrew is 5.7 . If you need to install a previous version of the server, in my case it was 5.5 , do: brew tap homebrew/versions brew update brew install mysql55 This should be enough for having the server installed correctly, but it’s not enough for installing the ruby gems: gem install mysql2 -v '0.3.11' Building native extensions This could take a while ...…

March Picks

Simple Made Easy Rich Hickey emphasizes simplicity’s virtues over easiness’, showing that while many choose easiness they may end up with complexity, and the better way is to choose easiness along the simplicity path. In other words, simplicity is measurable: simple things have one task, or one goal. Easy, on the other hand is relative to the person’s interpretation; it might be easy for you to…

RabbitMQ with Exponential Backoff

Update: As pointed out in the comments by Bryan, you should consider whether the TTL times you’ll need are not very long, since per-message TTL have some caveats . The messages get expired only when they hit the head of the queue. For example, if you have a message with 1h TTL on the head of the queue, messages after that will expire only after the one in the head is. Recently I was looking for a…

Picks of Feb 8th

From time to time, I’ll post under picks things that I find cool on that week. Mostly for me to remember this later 😅, but you might find them useful. time function Inspired by Clojure’s time function : def time start = Time . now . to_f yield puts "Execution time: #{ Time . now . to_f - start } s" end time { sleep 1 } # => Execution time: 1.0030732154846191s Talk Chad Fowler once again gave an…