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

69 pages in one array, and 29 tests that fail if any of them is an orphan

69 pages in one array, and 29 tests that fail if any of them is an orphan

Comments
6 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
One of our fourteen guides emits HowTo markup, and the other thirteen are not instructions

One of our fourteen guides emits HowTo markup, and the other thirteen are not instructions

Comments
5 min read
A hundred phones in one pub share one IP, so an IP-keyed rate limit is a limit on the room

A hundred phones in one pub share one IP, so an IP-keyed rate limit is a limit on the room

Comments
5 min read
null meant unlimited, so our free plan had more of the paid feature than the paid plan

null meant unlimited, so our free plan had more of the paid feature than the paid plan

Comments
5 min read
Four tools on our marketing site, none of which have a backend, and one that competes with us

Four tools on our marketing site, none of which have a backend, and one that competes with us

Comments 1
6 min read
A price that is right in the first frame, and a conversion that only ever rounds up

A price that is right in the first frame, and a conversion that only ever rounds up

Comments
5 min read
We shipped a feature whose only job is to stop the pipeline, and enough is two weekdays of outflow

We shipped a feature whose only job is to stop the pipeline, and enough is two weekdays of outflow

Comments
8 min read
Pause became a question with three answers, so we wrote the rules twice and only one copy has tests

Pause became a question with three answers, so we wrote the rules twice and only one copy has tests

Comments
7 min read
One request a second for the whole app, so our place search has no search-as-you-type

One request a second for the whole app, so our place search has no search-as-you-type

Comments
7 min read
Our email filter keeps two kinds of address, and a Wix subdomain is why it almost kept everything

Our email filter keeps two kinds of address, and a Wix subdomain is why it almost kept everything

Comments
7 min read
Two campaigns in one city import the listing once, and the cache key is a half degree square

Two campaigns in one city import the listing once, and the cache key is a half degree square

Comments
6 min read
16 Parquet files in a bucket we do not own, and the only client is DuckDB

16 Parquet files in a bucket we do not own, and the only client is DuckDB

Comments
5 min read
Encrypted at rest unless it cannot be, and the file itself says which

Encrypted at rest unless it cannot be, and the file itself says which

Comments
7 min read
Our window reloads itself every time you open it, so the renderer may not remember anything

Our window reloads itself every time you open it, so the renderer may not remember anything

Comments
6 min read
Our download button is a 302 to a URL that stops working in 60 seconds

Our download button is a 302 to a URL that stops working in 60 seconds

Comments
5 min read
Four kinds of email, one endpoint, and only one caller is allowed to throw

Four kinds of email, one endpoint, and only one caller is allowed to throw

Comments
6 min read
Our ledger is one append-only text file, and a torn last line costs us one row

Our ledger is one append-only text file, and a torn last line costs us one row

Comments
6 min read
Our activation code has no O, no 0, no I and no 1, and 32 is what makes the maths safe

Our activation code has no O, no 0, no I and no 1, and 32 is what makes the maths safe

Comments
5 min read
Our cache TTL was shorter than the gap between reads, which makes it a timer, not a cache

Our cache TTL was shorter than the gap between reads, which makes it a timer, not a cache

Comments
5 min read
Renaming our publisher was two constants away from re-prompting every account for consent

Renaming our publisher was two constants away from re-prompting every account for consent

Comments 1
5 min read
A Resend webhook belongs to the account, not the domain, so every email arrived twice

A Resend webhook belongs to the account, not the domain, so every email arrived twice

Comments
5 min read
One palette, three consumers that import it and one that keeps a copy, and the copy is the deliberate part

One palette, three consumers that import it and one that keeps a copy, and the copy is the deliberate part

Comments
5 min read
1,250,964 audit rows recorded that we had decided nothing, and 51,884 recorded a decision

1,250,964 audit rows recorded that we had decided nothing, and 51,884 recorded a decision

Comments
5 min read
A search box is a second door into the same scanner, and Postgres made us write one expression twice

A search box is a second door into the same scanner, and Postgres made us write one expression twice

Comments
5 min read
Our delete all my data button leaves one table alone, and the dialog says so

Our delete all my data button leaves one table alone, and the dialog says so

Comments
4 min read
We dropped 8 indexes and added 3 without a single production statistic

We dropped 8 indexes and added 3 without a single production statistic

Comments
5 min read
Our re-consent flow is two strings, and the hard part was not writing during render

Our re-consent flow is two strings, and the hard part was not writing during render

Comments
4 min read
Five of our ten analytics event groups were never called, so the insights said no data forever

Five of our ten analytics event groups were never called, so the insights said no data forever

Comments 1
3 min read
Two signals want the same redirect, and the fresher one is not the one we stored

Two signals want the same redirect, and the fresher one is not the one we stored

Comments
4 min read
Deleting an account calls one function and names no table

Deleting an account calls one function and names no table

Comments
3 min read
Our structured data named a founder, and the fix was to name nobody

Our structured data named a founder, and the fix was to name nobody

Comments
3 min read
Our brand voice rules are unit tests, including the one that bans the em dash

Our brand voice rules are unit tests, including the one that bans the em dash

Comments
7 min read
The free plan searches exactly like the paid one and hides the results, and the blurred rows are fake on purpose

The free plan searches exactly like the paid one and hides the results, and the blurred rows are fake on purpose

Comments
6 min read
A paused campaign still answers its email, because the pause has a reason column

A paused campaign still answers its email, because the pause has a reason column

Comments
6 min read
Our outreach emails wait for 9am in the creator's time zone, and Intl does all the hard parts

Our outreach emails wait for 9am in the creator's time zone, and Intl does all the hard parts

Comments
6 min read
Our daily API cap is three times last week's busiest day, because a fixed cap is a growth ceiling

Our daily API cap is three times last week's busiest day, because a fixed cap is a growth ceiling

Comments
6 min read
One email address per conversation, because Reply-To is only a suggestion

One email address per conversation, because Reply-To is only a suggestion

Comments
6 min read
Twenty-one tests on one list of pages, and the one that fails if nothing links to a page

Twenty-one tests on one list of pages, and the one that fails if nothing links to a page

Comments
8 min read
Two of our guide pages are instructions and one is a list, so only one of them emits a HowTo

Two of our guide pages are instructions and one is a list, so only one of them emits a HowTo

Comments
7 min read
null meant unlimited, so for a while our free trial could build more question packs than Pro

null meant unlimited, so for a while our free trial could build more question packs than Pro

Comments 1
7 min read
A hundred phones in one pub share one exit IP, so half our rate limiters are not keyed on it

A hundred phones in one pub share one exit IP, so half our rate limiters are not keyed on it

1
Comments
8 min read
Our IndexNow key is committed to the repository, and the auth gate was the only thing that nearly broke it

Our IndexNow key is committed to the repository, and the auth gate was the only thing that nearly broke it

Comments
7 min read
Four working tools on our marketing site, and not one request leaves the browser

Four working tools on our marketing site, and not one request leaves the browser

Comments
7 min read
Chrome on an M3 says it is an Intel Mac, so our download page has three buttons and no guessing

Chrome on an M3 says it is an Intel Mac, so our download page has three buttons and no guessing

Comments
5 min read
A stale "checking..." restored from disk is a lie, so one of our six stores has no file

A stale "checking..." restored from disk is a lie, so one of our six stores has no file

Comments
7 min read
€9,99 per month is a paywall, €1,450 per month is the rent, and two digits is the whole difference

€9,99 per month is a paywall, €1,450 per month is the rent, and two digits is the whole difference

Comments
6 min read
Our own rate limiter answered "valid: false", and the licence check believed it

Our own rate limiter answered "valid: false", and the licence check believed it

Comments
5 min read
A laptop lid is not a restart: seven ways our app stops, and what each one is allowed to forget

A laptop lid is not a restart: seven ways our app stops, and what each one is allowed to forget

Comments
6 min read
Electron cookies say "unspecified", Playwright only knows "Lax", and the mapping logged everyone out

Electron cookies say "unspecified", Playwright only knows "Lax", and the mapping logged everyone out

Comments
5 min read
Two conditions, one product, and the rule we deliberately apply to only one of them

Two conditions, one product, and the rule we deliberately apply to only one of them

Comments
6 min read
We deleted the list of retailers from our label parser, because a list only ever saves the first sighting

We deleted the list of retailers from our label parser, because a list only ever saves the first sighting

Comments
5 min read
Our uncertainty is a field on the rule set, not a sentence in the copy deck

Our uncertainty is a field on the rule set, not a sentence in the copy deck

Comments
5 min read
A dish on a restaurant menu is never allowed to go green in our app

A dish on a restaurant menu is never allowed to go green in our app

Comments
6 min read
A barcode we do not hold is answered by asking you for a photo, not by asking somebody else

A barcode we do not hold is answered by asking you for a photo, not by asking somebody else

Comments
6 min read
A label that prints "nuts" is evidence. The same word inferred from "almond" is not.

A label that prints "nuts" is evidence. The same word inferred from "almond" is not.

Comments
5 min read
Chrome records WebM with no duration in the header, and five HEAD requests decide whether you get charged

Chrome records WebM with no duration in the header, and five HEAD requests decide whether you get charged

Comments
6 min read
664KB of expert answer keys, and an import graph is the only thing keeping them off your machine

664KB of expert answer keys, and an import graph is the only thing keeping them off your machine

Comments
5 min read
Our affiliate payout command cannot send money, and that is the feature

Our affiliate payout command cannot send money, and that is the feature

Comments
6 min read
Skipped is not failed, and that one distinction is what made our nightly job alertable

Skipped is not failed, and that one distinction is what made our nightly job alertable

Comments
5 min read
121,570 blocked email domains, 2MB of JSON, and not one byte of it reaches the browser

121,570 blocked email domains, 2MB of JSON, and not one byte of it reaches the browser

Comments
4 min read
loading...