DEV Community

Daniel Pertu profile picture

Daniel Pertu

404 bio not found

Location London Joined Joined on  Personal website https://cogniprep.app

Work

Founder of CogniPrep

A list nothing derives from will drift, and ours did it twice

A list nothing derives from will drift, and ours did it twice

Comments 1
5 min read

Want to connect with Daniel Pertu?

Create an account to connect with Daniel Pertu. You can also sign in below to proceed if you already have an account.

Already have an account? Sign in
Our entitlements are five independent axes, not a plan ladder

Our entitlements are five independent axes, not a plan ladder

Comments
5 min read
We asked for a review the moment someone paid, which is the worst moment

We asked for a review the moment someone paid, which is the worst moment

Comments
5 min read
A CSS triangle vanished, because one selector matched by substring

A CSS triangle vanished, because one selector matched by substring

Comments 1
5 min read
Our scoring pipeline had one output, and for 31 tests it was the wrong one

Our scoring pipeline had one output, and for 31 tests it was the wrong one

Comments
5 min read
If you generate the puzzle randomly, you have to solve it too

If you generate the puzzle randomly, you have to solve it too

Comments
6 min read
Our prices are a function of the content, so the content is not allowed to lie

Our prices are a function of the content, so the content is not allowed to lie

Comments
4 min read
for...in turned my nested arrays into objects, and the candidate scored zero

for...in turned my nested arrays into objects, and the candidate scored zero

Comments
4 min read
A sequential send loop hit a 10 per second rate limit, because it was fast

A sequential send loop hit a 10 per second rate limit, because it was fast

Comments
5 min read
Eleven branches, one shared file: the anchor rule that made them merge

Eleven branches, one shared file: the anchor rule that made them merge

Comments
5 min read
The answer options were below the fold, on a 1440px screen

The answer options were below the fold, on a 1440px screen

Comments
5 min read
Every answer key in our product was on the CDN, with an immutable header

Every answer key in our product was on the CDN, with an immutable header

Comments
5 min read
Our design tokens are a package, and the marketing site is deliberately not a consumer

Our design tokens are a package, and the marketing site is deliberately not a consumer

Comments 1
4 min read
A nightly pg_dump that fails with the reason, not with "Network is unreachable"

A nightly pg_dump that fails with the reason, not with "Network is unreachable"

Comments
4 min read
Three capture screens in ninety minutes: what we deleted to make label photos readable

Three capture screens in ninety minutes: what we deleted to make label photos readable

Comments
5 min read
We upgraded our job platform at 10:22 and deleted it at 13:34

We upgraded our job platform at 10:22 and deleted it at 13:34

Comments
5 min read
120 milliseconds is not a delay, it is proof of a second frame

120 milliseconds is not a delay, it is proof of a second frame

Comments
5 min read
One human agreement counts the same as one matching machine read

One human agreement counts the same as one matching machine read

Comments
4 min read
Green ticks for three hours: the lock whose TTL was the job's worst case

Green ticks for three hours: the lock whose TTL was the job's worst case

Comments
4 min read
Five sequential awaits before a cache hit could leave the building

Five sequential awaits before a cache hit could leave the building

Comments
4 min read
Why our 404 page exists: the default one painted the header the wrong colour

Why our 404 page exists: the default one painted the header the wrong colour

Comments
3 min read
The session rides in the URL fragment: handing a login from the marketing site to the app

The session rides in the URL fragment: handing a login from the marketing site to the app

Comments
4 min read
Reply-To is the foreign key: threading support email onto tickets with plus addressing

Reply-To is the foreign key: threading support email onto tickets with plus addressing

Comments
5 min read
Our house style is a 63-line unit test, and the first thing it caught was an email

Our house style is a 63-line unit test, and the first thing it caught was an email

Comments
4 min read
Fifty nine characters: the test that reads the title of every generated page

Fifty nine characters: the test that reads the title of every generated page

Comments
4 min read
450 label words the test suite will not let us ship without

450 label words the test suite will not let us ship without

Comments
4 min read
A type with no word for "absent": an allergen layer that can only push down

A type with no word for "absent": an allergen layer that can only push down

Comments
4 min read
The number the label does not print: reading fat off an ingredients list

The number the label does not print: reading fat off an ingredients list

Comments
5 min read
A recipe is a scan with no camera: one rules engine, three surfaces

A recipe is a scan with no camera: one rules engine, three surfaces

Comments
5 min read
Consent is a version number, and the layout was writing it during render

Consent is a version number, and the layout was writing it during render

Comments
5 min read
Write the ledger row first: the ordering that makes a credit balance auditable

Write the ledger row first: the ordering that makes a credit balance auditable

Comments
5 min read
First touch wins: a personalisation hint that is allowed to be wrong

First touch wins: a personalisation hint that is allowed to be wrong

Comments
5 min read
Twenty four strings got their own file, because one import cost every page 100 KB

Twenty four strings got their own file, because one import cost every page 100 KB

Comments
5 min read
Chrome's MediaRecorder does not tell you how long the video is

Chrome's MediaRecorder does not tell you how long the video is

Comments
5 min read
One constant slows down every ad we render, and some clips are exempt

One constant slows down every ad we render, and some clips are exempt

1
Comments
5 min read
Deleting 50,000 rows inside a 60 second serverless function

Deleting 50,000 rows inside a 60 second serverless function

Comments
5 min read
The fingerprint we deliberately do not use to catch referral fraud

The fingerprint we deliberately do not use to catch referral fraud

Comments
5 min read
Our concurrent login cap asked a question that was always true

Our concurrent login cap asked a question that was always true

Comments
5 min read
What should your app do when Redis is not there?

What should your app do when Redis is not there?

Comments
5 min read
Every constant in this file is a promise to a player

Every constant in this file is a promise to a player

Comments
5 min read
Deploying in the middle of a question: graceful shutdown for a WebSocket game server

Deploying in the middle of a question: graceful shutdown for a WebSocket game server

Comments
4 min read
Ten rate limiters, and the only hard question was what to key each one on

Ten rate limiters, and the only hard question was what to key each one on

Comments
4 min read
null meant unlimited, so our free trial outranked the paid plan

null meant unlimited, so our free trial outranked the paid plan

Comments
4 min read
Print is a feature: laying out A4 QR sheets in the browser with jsPDF

Print is a feature: laying out A4 QR sheets in the browser with jsPDF

1
Comments
4 min read
The reconnect backoff that punished you for reconnecting

The reconnect backoff that punished you for reconnecting

Comments 1
4 min read
The join flow is a URL: designing for a hundred strangers who will not install anything

The join flow is a URL: designing for a hundred strangers who will not install anything

Comments
5 min read
Our link preview cards are drawn by code, from the same three files as the site

Our link preview cards are drawn by code, from the same three files as the site

Comments
4 min read
The arithmetic IS the product: building a planner that tells people the truth

The arithmetic IS the product: building a planner that tells people the truth

Comments
4 min read
A random generator that is still on the page with JavaScript off

A random generator that is still on the page with JavaScript off

Comments
4 min read
Two build roots, one constant: the test that reads the other package's source

Two build roots, one constant: the test that reads the other package's source

Comments
4 min read
Seventy pages from one array: the content registry that cannot disagree with itself

Seventy pages from one array: the content registry that cannot disagree with itself

Comments
5 min read
Two free tools, zero backend: what 'it never leaves your machine' buys you

Two free tools, zero backend: what 'it never leaves your machine' buys you

Comments
4 min read
A WebSocket server you can run two of: Redis pub/sub fan-out in about 60 lines

A WebSocket server you can run two of: Redis pub/sub fan-out in about 60 lines

Comments
5 min read
Exponential decay is the fairest fast-answer scoring curve I could find

Exponential decay is the fairest fast-answer scoring curve I could find

Comments
5 min read
Never trust the player's clock: three timers that have to agree

Never trust the player's clock: three timers that have to agree

Comments
4 min read
One hundred phones, one WiFi IP: rate limiting a room instead of a user

One hundred phones, one WiFi IP: rate limiting a room instead of a user

1
Comments
5 min read
Googlebot is not in your customers' country, and your pricing page just told it so

Googlebot is not in your customers' country, and your pricing page just told it so

Comments
4 min read
Free is free everywhere, and four other rounding bugs in a price formatter

Free is free everywhere, and four other rounding bugs in a price formatter

Comments
5 min read
Ship localised pricing in an afternoon, using a header your CDN already sends

Ship localised pricing in an afternoon, using a header your CDN already sends

Comments
5 min read
Treating "failed" as terminal: idempotency when you cannot ask the recipient

Treating "failed" as terminal: idempotency when you cannot ask the recipient

Comments 1
4 min read
loading...