← Extractions

Nicolò Rebughini — Accidentally Building a Neural Network (wroclove.rb 2026)

Nicolò Rebughini, a senior developer at Nebulab, tells the story of building a product-recommendation engine for coffee subscription company Cometeer. Iterating from simple if-filters to a weighted scoring system with 'amplifiers', he realizes the architecture mirrors a neural network — with filters as hidden layers, amplification methods as activation functions, and manual coefficient tweaking as ad-hoc training. He argues the right tool is whatever solves the problem while staying auditable to stakeholders.

Model
claude-opus-4-7
Ingestion
93c236ac
Input tokens
475,262
fresh
110,230
cached
323,893
cache write
41,139
Output tokens
11,536
Duration
203.3s
Roundtrips
11
Tool calls
22
Cost
$0.00
Nodes/edges extracted
16 / 28
Read set (nodes/edges)
110 / 2

Nodes (16)

update Nicolò Rebughini person
attrs (empty) → {"role" => "Senior Developer", "background" => "10 years in cinema post-production before software", "nationality" =>...
description Ruby developer who accidentally built a neural network for product recommendations. → Senior developer at Nebulab, an Italian e-commerce consultancy. Italian; spent roughly 10 years working in cinema pos...
short_description Ruby developer, ML in Ruby. → Senior developer at Nebulab; Ruby and e-commerce; speaker at wroclove.rb 2026.
update Accidentally building a neural network — A Ruby product recommendation journey talk
description Talk on ML product recommendations in Ruby. → wroclove.rb 2026 talk by Nicolò Rebughini (Nebulab). Walks through the evolution of the product-recommendation engine...
short_description Talk on ML product recommendations in Ruby. → Ruby product-recommendation system that accidentally grew into a neural-network-shaped scoring engine.
create Nebulab company
kind (empty) → company
name (empty) → Nebulab
slug (empty) → nebulab
attrs (empty) → {"country" => "Italy", "industry" => "e-commerce consultancy"}
description (empty) → Italian e-commerce consultancy. Builds custom e-commerce systems on Ruby on Rails, Solidus, and Shopify. Clients cite...
short_description (empty) → Italian e-commerce consultancy building custom stores on Rails, Solidus and Shopify.
create Cometeer company
kind (empty) → company
name (empty) → Cometeer
slug (empty) → cometeer
attrs (empty) → {"country" => "US", "industry" => "coffee / subscription e-commerce"}
description (empty) → US-based specialty-coffee brand and Nebulab client. Partners with top coffee roasters around the world, extracts coff...
short_description (empty) → US coffee brand shipping flash-frozen specialty coffee capsules under dry ice.
create Framework company
kind (empty) → company
name (empty) → Framework
slug (empty) → framework
attrs (empty) → {"country" => "US", "industry" => "consumer hardware / laptops"}
description (empty) → US-based laptop manufacturer known for repairable, modular laptops. Cited as a Nebulab e-commerce client.
short_description (empty) → US laptop manufacturer; Nebulab e-commerce client.
create Neural Network concept
kind (empty) → concept
name (empty) → Neural Network
slug (empty) → neural-network
attrs (empty) → {"category" => "architecture"}
description (empty) → A weighted decision graph with input, hidden, and output layers. Inputs flow from one layer to the next, each connect...
short_description (empty) → Weighted decision graph of layered neurons mapping inputs to outputs via local computations.
create Amplifier (scoring object) concept
kind (empty) → concept
name (empty) → Amplifier (scoring object)
slug (empty) → amplifier-scoring-object
attrs (empty) → {"category" => "pattern"}
description (empty) → Design pattern used in the Cometeer recommendation engine. Each amplifier is a plain old Ruby object initialized with...
short_description (empty) → Plain Ruby object that multiplies a product's score by a coefficient based on one local question.
create Filter-then-Score Recommendation Pipeline concept
kind (empty) → concept
name (empty) → Filter-then-Score Recommendation Pipeline
slug (empty) → filter-then-score-recommendation-pipeline
attrs (empty) → {"category" => "architecture"}
description (empty) → Two-stage architecture the Nebulab team adopted after rewriting their Cometeer recommendation code. Stage 1 (filterin...
short_description (empty) → Two-stage recommender: filter a product pool, then score survivors with weighted amplifiers.
create Auditability Of Recommendation Decisions concept
kind (empty) → concept
name (empty) → Auditability Of Recommendation Decisions
slug (empty) → auditability-of-recommendation-decisions
attrs (empty) → {"category" => "practice"}
description (empty) → The property of a recommendation system that lets engineers and stakeholders answer 'why was this item picked?'. Nico...
short_description (empty) → Ability to trace each recommendation back to the parameters and signals that produced it.
create Build The System That Solves The Problem takeaway
kind (empty) → takeaway
name (empty) → Build The System That Solves The Problem
slug (empty) → build-the-system-that-solves-the-problem
attrs (empty) → {"type" => "lesson-learned"}
description (empty) → Core message of the talk: developers are tasked with solving problems, not with implementing a particular canonical s...
short_description (empty) → Engineers are hired to solve problems, not to apply canonical solutions like ML.
create Manual Coefficient Tweaking Is Informal Training takeaway
kind (empty) → takeaway
name (empty) → Manual Coefficient Tweaking Is Informal Training
slug (empty) → manual-coefficient-tweaking-is-informal-training
attrs (empty) → {"type" => "insight"}
description (empty) → Observation from the talk: the team deployed, observed the resulting coffee boxes, asked 'is this good?', then adjust...
short_description (empty) → Iteratively hand-tuning weights while watching outputs is a backwards form of model training.
create Stakeholder Explainability Sells Simpler Solutions takeaway
kind (empty) → takeaway
name (empty) → Stakeholder Explainability Sells Simpler Solutions
slug (empty) → stakeholder-explainability-sells-simpler-solutions
attrs (empty) → {"type" => "recommendation"}
description (empty) → As consultants, Nebulab needed to make recommendation decisions explicit to product and operations stakeholders. A st...
short_description (empty) → Simple, explainable algorithms empower stakeholders and make non-ML solutions easier to sell.
create Concerns about letting users define weights question
kind (empty) → question
name (empty) → Concerns about letting users define weights
slug (empty) → concerns-about-letting-users-define-weights
attrs (empty) → {"answer_summary" => "Nebulab keeps weight-tweaking internal and iterates based on support signals; no major concerns...
description (empty) → Audience member shared experience with apps where end-users defined all the weights themselves, and asked whether Nic...
short_description (empty) → Audience asks whether giving users control over scoring weights caused problems in production.
create Optimization algorithm with a score function framing question
kind (empty) → question
name (empty) → Optimization algorithm with a score function framing
slug (empty) → optimization-algorithm-with-a-score-function-framing
attrs (empty) → {"answer_summary" => "Yes — the scoring pipeline is that optimization; future work migrates to proper ML."}
description (empty) → Audience member observes that the problem — pick a set of five SKUs from available stock maximizing a score combining...
short_description (empty) → Audience frames the problem as set-level optimization over SKUs; was it considered?
create How were manual tweaks benchmarked question
kind (empty) → question
name (empty) → How were manual tweaks benchmarked
slug (empty) → how-were-manual-tweaks-benchmarked
attrs (empty) → {"answer_summary" => "Benchmark was product/ops teams vibe-checking resulting boxes — taste-based, not metric-based."}
description (empty) → Audience asked how the team knew whether a manual tweak was for the better — customer reactions or benchmarking? Answ...
short_description (empty) → How did Nebulab decide that a coefficient tweak was an improvement?
create In-memory filtering without a database question
kind (empty) → question
name (empty) → In-memory filtering without a database
slug (empty) → in-memory-filtering-without-a-database
attrs (empty) → {"answer_summary" => "All in-memory; no local DB because the store is on Shopify, and a sync layer would add new fail...
description (empty) → Audience asked whether products had to be pulled into memory to run filters, or if the work could happen as SQL. Answ...
short_description (empty) → Did filters run in-memory or as SQL, given the large product catalog?

Edges (28)

update Nicolò Rebughini → authored → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Nicolò delivered this talk at wroclove.rb 2026.
update Accidentally building a neural network — A Ruby product recommendation journey → presented_at → wroclove.rb 2026
context (empty) → Talk given on day 1 of wroclove.rb 2026 (2026-04-17).
create Nicolò Rebughini → works_at → Nebulab
attrs (empty) → {"role" => "Senior Developer"}
context (empty) → Self-identified as senior developer at Nebulab.
relation (empty) → works_at
source_node_id (empty) → af7a75fe-d70a-4c5a-8859-a74d41488c49
target_node_id (empty) → e32db4c5-5592-4bcf-9743-401eda4cf0e3
create Nicolò Rebughini → attended → wroclove.rb 2026
context (empty) → Attended as speaker.
relation (empty) → attended
source_node_id (empty) → af7a75fe-d70a-4c5a-8859-a74d41488c49
target_node_id (empty) → c1bfbda9-9fbb-4d7f-8e12-1a7a81621ba9
create In-memory filtering without a database → asked_at → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Asked during the post-talk Q&A.
relation (empty) → asked_at
source_node_id (empty) → e32aa592-7715-480c-87f1-bc30daf96be4
target_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
create Amplifier (scoring object) → related_to → Neural Network
context (empty) → Amplifiers serve as the talk's analog of neurons with per-neuron activation functions.
relation (empty) → related_to
source_node_id (empty) → b42b99a3-dd79-4411-8f3c-2ba78806293d
target_node_id (empty) → b3c4ae0d-f7c3-488e-bce0-837bfd0c96be
create Filter-then-Score Recommendation Pipeline → related_to → Neural Network
context (empty) → The filter and scoring stages map to hidden layers of a neural network.
relation (empty) → related_to
source_node_id (empty) → 4c9348a9-f3ed-493c-9bb4-ed2ee99ffe08
target_node_id (empty) → b3c4ae0d-f7c3-488e-bce0-837bfd0c96be
create Nebulab → uses → Ruby on Rails
context (empty) → Nebulab builds custom e-commerce systems on Rails.
relation (empty) → uses
source_node_id (empty) → e32db4c5-5592-4bcf-9743-401eda4cf0e3
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Nebulab → uses → Solidus
context (empty) → Nebulab builds e-commerce stores on Solidus.
relation (empty) → uses
source_node_id (empty) → e32db4c5-5592-4bcf-9743-401eda4cf0e3
target_node_id (empty) → 26699889-8b58-4e7f-9965-6bc6e513ea5e
create Nebulab → uses → Shopify
context (empty) → Nebulab also builds e-commerce stores on Shopify (as with Cometeer).
relation (empty) → uses
source_node_id (empty) → e32db4c5-5592-4bcf-9743-401eda4cf0e3
target_node_id (empty) → 934a1185-4a30-4c56-b417-b26f0ad00133
create Nebulab → related_to → Cometeer
attrs (empty) → {"relationship" => "client"}
context (empty) → Cometeer is a Nebulab client; the recommendation engine was built for them.
relation (empty) → related_to
source_node_id (empty) → e32db4c5-5592-4bcf-9743-401eda4cf0e3
target_node_id (empty) → 0efc27e1-15ad-4568-961a-3656b8457a0f
create Nebulab → related_to → Framework
attrs (empty) → {"relationship" => "client"}
context (empty) → Framework (laptop manufacturer) is cited as a Nebulab e-commerce client.
relation (empty) → related_to
source_node_id (empty) → e32db4c5-5592-4bcf-9743-401eda4cf0e3
target_node_id (empty) → e46a8cd7-3226-42b9-be8c-cbfee54c3fd8
create Accidentally building a neural network — A Ruby product recommendation journey → about → Cometeer
context (empty) → The case study in the talk is Cometeer's mixed-roast coffee box recommendation engine.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → 0efc27e1-15ad-4568-961a-3656b8457a0f
create Accidentally building a neural network — A Ruby product recommendation journey → about → Neural Network
context (empty) → Core claim: the scoring engine accidentally mirrors a neural network.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → b3c4ae0d-f7c3-488e-bce0-837bfd0c96be
create Accidentally building a neural network — A Ruby product recommendation journey → about → Amplifier (scoring object)
context (empty) → Amplifiers are the central design element of the recommendation engine described.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → b42b99a3-dd79-4411-8f3c-2ba78806293d
create Accidentally building a neural network — A Ruby product recommendation journey → about → Filter-then-Score Recommendation Pipeline
context (empty) → The rewrite adopts an explicit filter stage followed by a weighted scoring stage.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → 4c9348a9-f3ed-493c-9bb4-ed2ee99ffe08
create Accidentally building a neural network — A Ruby product recommendation journey → about → Auditability Of Recommendation Decisions
context (empty) → Auditability is the main trade-off driving the non-ML design.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → 6b20587c-9a21-41e6-b1c3-67bbb644d986
create Accidentally building a neural network — A Ruby product recommendation journey → about → Shopify
context (empty) → Product data for Cometeer lives in Shopify, constraining the design.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → 934a1185-4a30-4c56-b417-b26f0ad00133
create Accidentally building a neural network — A Ruby product recommendation journey → about → Ruby on Rails
context (empty) → The recommendation engine is implemented in Ruby (Rails context); algorithm shown as plain Ruby.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → 7aac705a-0987-49f2-b665-9d4e08a6acee
create Accidentally building a neural network — A Ruby product recommendation journey → about → GraphQL
context (empty) → Q&A reveals the engine queries Shopify's GraphQL endpoints in memory.
relation (empty) → about
source_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
target_node_id (empty) → c6a1041c-3116-4194-b7f0-eba7cd4a7e64
create Build The System That Solves The Problem → from_talk → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Explicit closing message of the talk.
relation (empty) → from_talk
source_node_id (empty) → bcc9346d-5560-4d15-aa50-3b4da3ddeb94
target_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
create Manual Coefficient Tweaking Is Informal Training → from_talk → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Nicolò reflects that iterative coefficient tweaking resembled informal training.
relation (empty) → from_talk
source_node_id (empty) → fe357e08-98b4-4efa-b551-260d01671676
target_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
create Stakeholder Explainability Sells Simpler Solutions → from_talk → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Talk emphasizes that explainability to stakeholders justified the non-ML approach.
relation (empty) → from_talk
source_node_id (empty) → 93c85284-97a2-48d5-937c-e2a0a94821e0
target_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
create Concerns about letting users define weights → asked_at → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Asked during the post-talk Q&A.
relation (empty) → asked_at
source_node_id (empty) → f6aded4e-59b1-4da9-9546-8b9530db1584
target_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
create Optimization algorithm with a score function framing → asked_at → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Asked during the post-talk Q&A.
relation (empty) → asked_at
source_node_id (empty) → 1c2288e3-d199-4912-bacc-3175e510a447
target_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
create How were manual tweaks benchmarked → asked_at → Accidentally building a neural network — A Ruby product recommendation journey
context (empty) → Asked during the post-talk Q&A.
relation (empty) → asked_at
source_node_id (empty) → 68cdae9c-c808-40d0-a7d5-f94863f5ca8c
target_node_id (empty) → d124ce83-0ad9-46a1-acb1-4cad8dc8953d
create In-memory filtering without a database → about → Shopify
context (empty) → Answer explains why there is no local database — the store runs on Shopify.
relation (empty) → about
source_node_id (empty) → e32aa592-7715-480c-87f1-bc30daf96be4
target_node_id (empty) → 934a1185-4a30-4c56-b417-b26f0ad00133
create In-memory filtering without a database → about → GraphQL
context (empty) → Answer notes the in-memory approach uses Shopify's GraphQL endpoints.
relation (empty) → about
source_node_id (empty) → e32aa592-7715-480c-87f1-bc30daf96be4
target_node_id (empty) → c6a1041c-3116-4194-b7f0-eba7cd4a7e64

Read set

110 nodes

takeaway Name Things To Find Their Properties search_nodes concept xkcd Dependency / Nebraska Problem search_nodes concept AI Agent search_nodes project Arkency Knowledge Graph search_nodes tool ChatGPT search_nodes project Nerds and Threads search_nodes tool Top Secret LLM search_nodes tool langchainrb search_nodes tool Speaker Deck search_nodes concept Prompt Alchemy search_nodes talk Accidentally building a neural network — A Ruby product recommendation journey search_nodes+get_node_edges concept Falsehoods Programmers Believe About LLMs search_nodes concept Large Language Models search_nodes concept Transformers search_nodes resource Attention Is All You Need search_nodes concept Vector Embeddings search_nodes concept Jailbreaking search_nodes takeaway Every Model Is Wrong But Some Are Useful search_nodes project rails_event_store/ecommerce search_nodes tool Render search_nodes tool Apollo GraphQL Platform search_nodes tool Klaviyo search_nodes question Business Motivation for UringMachine search_nodes tool Apollo GraphQL search_nodes tool RealtimeBoard search_nodes tool Solidus search_nodes company Shopify search_nodes resource Ruby Gem Fellowship Fund search_nodes tool Tapioca search_nodes tool Packwerk search_nodes tool Bootsnap search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes talk Performance Panel wroclove.rb 2024 search_nodes talk Fix Production Bugs 20x Faster search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes concept Tea Taster search_nodes company SpaceX search_nodes resource tea White Paper search_nodes tool Grace search_nodes event atmosphere conf search_nodes company Anthropic search_nodes tool Tailscale search_nodes tool Sync Space VR search_nodes concept Cynefin Framework search_nodes tool Axon Framework search_nodes takeaway Buy Faster Hardware search_nodes project monolith framework search_nodes concept MCP Server search_nodes tool llamafile search_nodes tool Claude Code search_nodes tool Electron search_nodes concept Hexagonal Architecture search_nodes concept Onion Architecture search_nodes concept Architecture Drivers search_nodes concept Service-Oriented Architecture search_nodes tool Ruby on Rails search_nodes tool Hanami search_nodes takeaway Rails leads JS frameworks on Core Web Vitals search_nodes event Rails World search_nodes tool Ember.js search_nodes company thoughtbot search_nodes resource Woman on Rails search_nodes tool GraphQL search_nodes concept GraphQL query timeout search_nodes tool graphql-ruby search_nodes tool graphql-batch search_nodes question JSON API or GraphQL — what do you recommend? search_nodes concept GraphQL look_ahead search_nodes takeaway Use GraphQL when clients need flexible queries search_nodes tool graphql-preload search_nodes concept Plain Old Java Object search_nodes tool ROM search_nodes tool PStore search_nodes tool Ruby search_nodes concept Active Record search_nodes concept ObjectSpace heap dumps search_nodes concept Active Record Custom Types search_nodes resource Practical Object-Oriented Design in Ruby search_nodes tool Distributed Ruby search_nodes takeaway Prefer Procedural Code For Everyday Rails search_nodes person Nicolò Rebughini get_node_edges resource ATProtoHackers Discord search_nodes project Check search_nodes concept Turing Machine search_nodes tool llama.cpp search_nodes project Petri Nets Performance Prediction Gem search_nodes concept Vector Database search_nodes takeaway Baseline Metrics Before Building AI Features search_nodes tool Codex CLI search_nodes resource Rocket Real-Time Benchmark search_nodes tool CoffeeScript search_nodes project Linux Custom Feed search_nodes tool Turbo Native search_nodes project Ruby Romania search_nodes concept DRY Principle search_nodes takeaway Give Unto Rails That Which Is Rails search_nodes concept Open-Closed Principle search_nodes resource Painless Rails search_nodes takeaway Rails Way vs Design Way search_nodes concept Rails Is All Or Nothing search_nodes talk Rethink Modularity in Rails search_nodes resource Rails Architect Master Class search_nodes concept MVC Modularity Violations search_nodes talk No 'Pundit' Intended search_nodes

2 edges