close

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

Our CSV export has 26 columns and not one of them is an email address

Our CSV export has 26 columns and not one of them is an email address

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
28 migration files, two of which cancel each other out, and not one of them written by hand

28 migration files, two of which cancel each other out, and not one of them written by hand

Comments
6 min read
Our 53 Server Actions never throw at the UI, and one call to unstable_rethrow is why

Our 53 Server Actions never throw at the UI, and one call to unstable_rethrow is why

Comments
6 min read
Every animation in our app is declared paused, and one CSS selector is the play button

Every animation in our app is declared paused, and one CSS selector is the play button

BERJAYA 1
Comments 1
7 min read
The server renders "midnight Pacific time" and the browser replaces it with 08:00, in the same element

The server renders "midnight Pacific time" and the browser replaces it with 08:00, in the same element

Comments
6 min read
Our llms-full.txt is 574,626 bytes generated from the same array that renders the pages

Our llms-full.txt is 574,626 bytes generated from the same array that renders the pages

Comments
5 min read
I put Redis on the delivery path of my WebSocket server, and it cost every phone in the room seconds

I put Redis on the delivery path of my WebSocket server, and it cost every phone in the room seconds

Comments
5 min read
Sixty phones reconnect in the same second, and they all share one snapshot build

Sixty phones reconnect in the same second, and they all share one snapshot build

Comments
6 min read
A hundred answers to a hundred phones is ten thousand messages, for a number only the host reads

A hundred answers to a hundred phones is ten thousand messages, for a number only the host reads

Comments
5 min read
Browsers answer WebSocket pings and never tell your JavaScript, so we send two heartbeats

Browsers answer WebSocket pings and never tell your JavaScript, so we send two heartbeats

Comments
6 min read
Our broadcast died with the function that sent it, and the fix was to stop firing and forgetting

Our broadcast died with the function that sent it, and the fix was to stop firing and forgetting

Comments
5 min read
Our game clock does not live in the app, because a serverless function cannot hold a timer for fifteen seconds

Our game clock does not live in the app, because a serverless function cannot hold a timer for fifteen seconds

Comments
5 min read
Two files hold the same listings, and only one of them survives you editing a search

Two files hold the same listings, and only one of them survives you editing a search

Comments
8 min read
Four product demos on our home page, not one of them a video, and every loop has to be able to cancel itself

Four product demos on our home page, not one of them a video, and every loop has to be able to cancel itself

BERJAYA 1
Comments
8 min read
Three of our pages render per request and thirty-five do not, and the only thing deciding that is whether a price is on screen

Three of our pages render per request and thirty-five do not, and the only thing deciding that is whether a price is on screen

Comments
7 min read
Our displayed price is allowed to be wrong in one direction only, and Intl decides how many decimals it is wrong by

Our displayed price is allowed to be wrong in one direction only, and Intl decides how many decimals it is wrong by

Comments 1
8 min read
Our title budget is 60 characters, the layout quietly spends ten of them, and a test reads our own source files to prove it

Our title budget is 60 characters, the layout quietly spends ten of them, and a test reads our own source files to prove it

BERJAYA 1
Comments
7 min read
Five sites claim one publisher, and the single line that differs between them is typed so a typo cannot compile

Five sites claim one publisher, and the single line that differs between them is typed so a typo cannot compile

BERJAYA 1
Comments
7 min read
Our recipe pages run the barcode scanner's engine on a recipe, at the strictest setting the app offers

Our recipe pages run the barcode scanner's engine on a recipe, at the strictest setting the app offers

Comments
5 min read
A rescan in the aisle is not a second scan, and three pure functions are the whole of our history screen

A rescan in the aisle is not a second scan, and three pure functions are the whole of our history screen

Comments
5 min read
One Platform.OS branch decides whether our paywall gets a button or a sentence

One Platform.OS branch decides whether our paywall gets a button or a sentence

Comments
5 min read
Our licenses page lists no licenses, and the subsystem that absence deleted is object storage

Our licenses page lists no licenses, and the subsystem that absence deleted is object storage

Comments
5 min read
The only thing a scan tells our server is a barcode and a number, and that number decides what we curate next

The only thing a scan tells our server is a barcode and a number, and that number decides what we curate next

Comments
5 min read
Our product search index covers a tenth of the table, because a hit on the other nine tenths would say not found

Our product search index covers a tenth of the table, because a hit on the other nine tenths would say not found

Comments
5 min read
Our longest practice run is 30 minutes in one page view, and two seconds in a hidden tab ends it

Our longest practice run is 30 minutes in one page view, and two seconds in a hidden tab ends it

Comments
5 min read
153 rows answer "which test did I just get invited to", and 33 of them say no

153 rows answer "which test did I just get invited to", and 33 of them say no

Comments
4 min read
We merged 25 games with no pages, and exactly two tests were allowed to fail

We merged 25 games with no pages, and exactly two tests were allowed to fail

BERJAYA 1
Comments
4 min read
58 component prefixes for 56 providers, and includes('tsa') is a bug waiting to happen

58 component prefixes for 56 providers, and includes('tsa') is a bug waiting to happen

Comments
4 min read
Three of our six tests say "candidates report", the other three say "our estimate"

Three of our six tests say "candidates report", the other three say "our estimate"

Comments
4 min read
Two of the six tests we researched turned into pages instead of products

Two of the six tests we researched turned into pages instead of products

Comments
4 min read
We shipped an undo button and deleted it two minutes later, then brought the same code back for a different state

We shipped an undo button and deleted it two minutes later, then brought the same code back for a different state

BERJAYA 2
Comments
5 min read
A campaign takes on 200 places a day, and widening its search area costs no AI at all

A campaign takes on 200 places a day, and widening its search area costs no AI at all

BERJAYA 1
Comments
5 min read
The drawings in our reel are the app's own React components, which cost one webpack alias and three CSS variables

The drawings in our reel are the app's own React components, which cost one webpack alias and three CSS variables

BERJAYA 2
Comments
6 min read
Our reel has no licensed audio, because 130 lines of Node synthesise every sound in it

Our reel has no licensed audio, because 130 lines of Node synthesise every sound in it

Comments
5 min read
Four AI jobs, four model choices, and the one we picked for comments was not the most accurate

Four AI jobs, four model choices, and the one we picked for comments was not the most accurate

Comments
5 min read
A creator with no published email costs us nothing now, because the lookup moved to the front of the pipeline

A creator with no published email costs us nothing now, because the lookup moved to the front of the pipeline

Comments
5 min read
Eleven loading.tsx files behind our login and none in front of it

Eleven loading.tsx files behind our login and none in front of it

Comments
5 min read
Every sentence on our pages is in the response twice, and brotli charges us about 4 KB for it

Every sentence on our pages is in the response twice, and brotli charges us about 4 KB for it

Comments
5 min read
Our metadata test reads the page files as text, because importing one boots Supabase

Our metadata test reads the page files as text, because importing one boots Supabase

Comments
6 min read
Our font preload hint travels in the HTML on 70 pages and in a response header on 2

Our font preload hint travels in the HTML on 70 pages and in a response header on 2

Comments
5 min read
Our name generator ships all 110 of its names in the HTML, before any JavaScript runs

Our name generator ships all 110 of its names in the HTML, before any JavaScript runs

Comments
5 min read
462 quiz questions on our site, and not one of them is marked up as a FAQPage

462 quiz questions on our site, and not one of them is marked up as a FAQPage

Comments
5 min read
Our OCR endpoint signs a receipt, because the confidence the client sends us proves nothing

Our OCR endpoint signs a receipt, because the confidence the client sends us proves nothing

Comments
6 min read
We deleted the hosted job runner, and the two schedules we have left are an hourly ping and a monthly invoice

We deleted the hosted job runner, and the two schedules we have left are an hourly ping and a monthly invoice

Comments
6 min read
A status is one word, so the sentence it needs lives in its own channel

A status is one word, so the sentence it needs lives in its own channel

Comments
7 min read
Fifteen required fields and no optional ones, because the type decides whether a site gets a page

Fifteen required fields and no optional ones, because the type decides whether a site gets a page

Comments
7 min read
Our link audit called two citations broken, and curl proved it right and wrong at the same time

Our link audit called two citations broken, and curl proved it right and wrong at the same time

BERJAYA 1
Comments
4 min read
A contributor reward is a Stripe coupon and not a balance credit, because a balance credit does not clear the VAT

A contributor reward is a Stripe coupon and not a balance credit, because a balance credit does not clear the VAT

Comments
7 min read
Six runtime dependencies and no build step, which is why our ledger is a text file

Six runtime dependencies and no build step, which is why our ledger is a text file

Comments
6 min read
We started running outreach, and our inbound spam filter immediately became wrong

We started running outreach, and our inbound spam filter immediately became wrong

Comments
4 min read
Our poll touches every search in turn, and the renderer gets one frame per 120ms

Our poll touches every search in turn, and the renderer gets one frame per 120ms

Comments
6 min read
Supabase Free has no backups, so ours is two pg_dumps a night and the smaller one is kept twelve times longer

Supabase Free has no backups, so ours is two pg_dumps a night and the smaller one is kept twelve times longer

Comments
6 min read
Creating one account by hand touches three systems, and only one of them has transactions

Creating one account by hand touches three systems, and only one of them has transactions

Comments
4 min read
The backoff ladder was not the bug, the key was: per host, not per search

The backoff ladder was not the bug, the key was: per host, not per search

Comments
6 min read
The refund arrived after the payout, so the fix was two nullable columns and no code

The refund arrived after the payout, so the fix was two nullable columns and no code

Comments
4 min read
Our 373 answer pages contain no written answers, because each one runs the rules engine twice at build time

Our 373 answer pages contain no written answers, because each one runs the rules engine twice at build time

Comments
7 min read
Our 30 second poll is measured start to start, and a cycle that overruns goes again in five seconds

Our 30 second poll is measured start to start, and a cycle that overruns goes again in five seconds

Comments
6 min read
A discount has to show up on the pages that do not sell anything, which is how one price component became two

A discount has to show up on the pages that do not sell anything, which is how one price component became two

Comments 1
4 min read
Our recipe pages have no nutrition fields, because the grams are the only thing anybody typed

Our recipe pages have no nutrition fields, because the grams are the only thing anybody typed

Comments
6 min read
One TypeScript file lives in five repositories, and four of our five sites currently agree

One TypeScript file lives in five repositories, and four of our five sites currently agree

Comments
4 min read
loading...