← 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ò RebughiniauthoredAccidentally 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 journeypresented_atwroclove.rb 2026
context (empty) Talk given on day 1 of wroclove.rb 2026 (2026-04-17).
create Nicolò Rebughiniworks_atNebulab
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ò Rebughiniattendedwroclove.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 databaseasked_atAccidentally 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_toNeural 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 Pipelinerelated_toNeural 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 NebulabusesRuby 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 NebulabusesSolidus
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 NebulabusesShopify
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 Nebulabrelated_toCometeer
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 Nebulabrelated_toFramework
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 journeyaboutCometeer
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 journeyaboutNeural 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 journeyaboutAmplifier (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 journeyaboutFilter-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 journeyaboutAuditability 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 journeyaboutShopify
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 journeyaboutRuby 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 journeyaboutGraphQL
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 Problemfrom_talkAccidentally 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 Trainingfrom_talkAccidentally 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 Solutionsfrom_talkAccidentally 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 weightsasked_atAccidentally 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 framingasked_atAccidentally 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 benchmarkedasked_atAccidentally 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 databaseaboutShopify
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 databaseaboutGraphQL
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