2026 retrospective
Colore is still alive at github.com/ifad/colore — Geremia Taglialatela took over after I drifted onto other things and pushed the project forward through Ruby 2.7, 3.0, 3.1, 3.2, sidekiq 6, and modern CI. He sits at 354 commits — three times mine. The nginx C module Joe wrote in February 2015 is unchanged. Heathen the standalone service was eventually folded directly into Colore as a library; the original repo is archived but the code lives on inside lib/heathen/ of Colore. Same idea, fewer moving parts.
IFAD is a UN agency that runs on documents. Loan agreements, evaluation reports, country strategy notes, board decisions, project briefs — every web application we build sooner or later needs to take a Word file and give back a PDF, or take a scan and give back something searchable, or take an arbitrary blob and turn it into a thumbnail. Three years ago we decided to stop solving this problem one application at a time and put it behind a single service.
Today I’m merging v1.0.0 of Colore. It’s the second attempt at that service, and it’s the one we get to keep. This is the story of both attempts and the people who built them — because almost none of the code below is mine.
This post was written in 2015. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
Eaco reached v1.0.0 on May 5, 2016 — commit message: “This is v1.0.0. Two years in production.” It grew to 54 stars, 8 forks, 240 commits, and ran authorization at IFAD for five more years after that. Geremia Taglialatela picked it up in 2020 and kept it running on Rails 6.0 and 6.1, then modernized the CI in late 2025. The ABAC-with-hash-ACLs pattern turned out to be exactly right for an organization where access is determined by position, department, and working group — not just “admin or not.” The repo is still online, and the YARD documentation is still some of the most thorough I’ve ever written for a gem.
Scriptoria is an internal workflow application at IFAD — a UN specialized agency in Rome — and its authorization layer has been annoying me for months. The code works, but it’s tangled into the app. Every time we need to add a new role or change who can access what, we’re editing application code that shouldn’t care about authorization semantics.
So eight days ago I started extracting it. Today I’m releasing the result: Eaco — an Attribute-Based Access Control framework for Ruby, named after Eacus, the holder of the keys of Hades in Greek mythology.
172 commits. Five releases. 100% test coverage. And a Saturday afternoon I’ll never get back.
This post was written in 2014. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
Twelve years later, AnyConnect rebranded to “Cisco Secure Client” but the philosophy is identical: total control, zero transparency. The industry has largely moved on — Tailscale, WireGuard, and Cloudflare WARP have made split tunneling the default. macOS replaced kexts with the NetworkExtension framework, and scutil tricks require more care. But OpenConnect still works, the protocol hasn’t changed, and the scripts are still on GitHub.
Cisco AnyConnect is the kind of software that makes you question whether the
people who wrote it have ever actually used a computer outside of a corporate
cubicle. You install it, you connect to the VPN, and suddenly all your traffic
is being funneled through your employer’s network. Your personal browsing, your
Spotify, your SSH sessions to your own servers – everything. And there is no
setting to change it. It is by design. The sysadmins at HQ decided what is best
for you, and what is best for you is a full tunnel with zero user control.
The real sysadmin is like the old-fashioned car mechanic, the one you brought
your car to adjust the wheels’ convergence and when you got into his garage he
heard also your engine while idling didn’t have the right RPM. He then fixed
the wheels’ convergence and you paid him for it, but he also fixed the engine
idling RPM without asking you anything - he did it because he couldn’t stand a
car that was not set up properly.
He is the one that from every tiny and imperceptible noise immediately guessed
every car problem, even those the customer did not yet realize.
He is the one that after dinner with family went back to his garage, where
you could see the lights on until late at night, because he was working on
“his” jewel, some old vintage car found who knows where that he was slowly
and passionately rejuvenating until it became like new.
The real sysadmin is like that mechanic, and his cars are servers.
Source code differences between two consecutive versions of the
Security.framework, a macOS/iOS component. The seemingly innocuous extra goto fail; — a duplicated line with no braces around the if body — caused the
SSL/TLS certificate verification to be silently skipped entirely. Any
certificate would be accepted as valid, making every HTTPS connection on
affected devices vulnerable to man-in-the-middle attacks. The bug
(CVE-2014-1266) affected iOS
6/7 and OS X Mavericks, and was patched in iOS 7.0.6 and OS X 10.9.2. It
became one of the most famous examples of why braces matter and why code review
catches what compilers don’t. See ImperialViolet’s technical
analysis for the
full details.
This post was written in 2013. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
The “contextual help” space exploded into a whole product category — Intercom, Pendo, Appcues and others now do this commercially at scale. IFAD’s fork lived on for years inside the agency. The Rails Rumble itself stopped running after 2015, and the era of 48-hour competition hackathons gave way to AI hackathons and startup weekends. The repo is archived but still up.
The Rails Rumble is — was — a 48-hour hackathon where teams of up to four people build a complete web app from scratch using Ruby. No prep work, no pre-written code. Just caffeine, git, and a deadline.
This year our team — @amedeo, @liquid1982, @maisongb, and me — built Hermes: the epic messenger service, entry #385.
This post was written in 2013. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
This tiny gem grew to 268 stars and 112 forks, with 32 contributors over 7 years. It learned Bootstrap 3, then 4 with auto-detection (v1.6.0), got a non-Rails mode with dataConfirmModal.confirm() callbacks (v1.2.0), an npm package still pulling 3,700 downloads/week (v1.6.2), and kept working with every Rails version through 6.0. The concept became so mainstream that every UI framework now ships its own confirmation dialog component. The repo is still up.
Not maliciously — they just clicked through a chain of destructive actions, happily dismissing the browser’s confirm() dialogs without reading them. Because nobody reads those. They’re ugly grey system dialogs that blend into the background of your workflow. Click OK, click OK, click OK — and suddenly half the data is gone.
So I fixed it. And then I extracted the fix into a gem, because this problem isn’t specific to our application. Today I’m releasing data-confirm-modal — 116 lines of JavaScript that replace Rails’ built-in confirm() with a Bootstrap modal.
This post was written in 2012. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
This game used the Facebook Graph API to access your friends list, profile photos, and personal details — name, location, interests, the works. These are exactly the same APIs that Cambridge Analytica exploited in 2018 to harvest data from 87 million Facebook users for political profiling. We built a fun party game; they built a surveillance machine. Facebook shut down these APIs in 2018 after the scandal broke. The game hasn’t worked since. The irony is thick — the same platform features that made silly social games possible also enabled one of the biggest privacy scandals in tech history.
Last weekend we competed in Rails Rumble 2012 — 48 hours to build a web app from scratch using Ruby on Rails, no preparation allowed. Our team was part of the Italian 48rails community, and we built Guess The Friend: a Facebook game that implements the classic Guess Who? board game, but using your real Facebook friends as characters.
This post was written in 2012. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
ChronoModel is still alive — 14 years, 41 releases, 201 stars. The rules got replaced by INSTEAD OF triggers in v0.6 (2014), the box()/point() hack by proper tsrange columns, and the monkey-patching by a proper adapter registration. Geremia Taglialatela took over maintenance in 2020 and pushed it to v5.0.0 with Rails 8.1 and Ruby 4.0 support. The core idea — updatable views on public, current data on temporal, history on history with table inheritance — never changed. The repo is healthy and actively maintained.
Update, April 2019:ChronoModel reached 1.0 — seven years, 506 commits, and 31 releases later.
We’re building a CRM at IFAD — a UN specialized agency in Rome — and one of the hard requirements is temporal data. We need to know what a record looked like at any point in the past. What was this project’s budget on March 15th? When did this beneficiary’s address change? Who approved what, and what did the record look like at the time?
I’d been prototyping a PostgreSQL schema approach for this — views, rules, table inheritance — and it worked. Then Amedeo, my boss, looked at it and said: “This shouldn’t live inside the CRM. Make it a reusable framework.”
He was right. The temporal pattern has nothing to do with CRM logic. It belongs in a gem.
So I had five days of uninterrupted focus, and today I’m releasing ChronoModel — an ActiveRecord extension that gives your models full temporal capabilities on PostgreSQL. What Oracle sells as Flashback Queries and charges enterprise money for, we can do with standard SQL on Postgres 9.0+.