# Notes and anecdotes > Random notes and anecdotes from tech and startups Each note has a corresponding html article at the same path without the appended .md. ## Posts - [Don't build your own invoicing](https://notes.webutvikling.org/dont-build-your-own-invoicing-system.md): Vibe-coding invoicing to save time and transaction fees looks cheap until taxes, coupons, and a billing bug show up. - [AI: Think of them as a summer intern](https://notes.webutvikling.org/ai-is-an-intern.md): Stop treating coding models as a tool on your machine. Encode the company and give always-on AI a job. - [Code is the new coal](https://notes.webutvikling.org/code-is-the-new-coal.md): Number of books exploded after the printing press. Coal usage surged once it got cheap. Same thing is happening to code. - [Make the world your 2nd market](https://notes.webutvikling.org/international-version-before-your-2nd-market.md): Your neighboring country may look like the same thing, just twice the size. Instead: ship an global version, then follow traction instead of geography. - [When to raise money and what for](https://notes.webutvikling.org/when-to-raise-money-and-what-for.md): Raising is selling belief that you will be profitable. Each stage sells a different proof. - [AI: become a good evaluator](https://notes.webutvikling.org/how-to-excel-in-the-age-of-ai.md): Generating decent content gets cheap. The work that remains is taste, judgment, and deciding what to make. - [Say that the world is changing, and you're the new stuff](https://notes.webutvikling.org/andy-raskin-brand-framework.md): Andy Raskin's brand framework paints a divide, prompts action, and is dead simple to retell. - [Give feedback on either Speed, Quality OR Priority](https://notes.webutvikling.org/types-of-feedback.md): Don't call the work good or bad. Name whether you need speed, quality, or alignment right now, and own the tradeoff. - [Stickiness matter](https://notes.webutvikling.org/startup-metrics-that-matter.md): Seed-stage metrics that calm investors: revenue, churn, margins. Stickiness first, and only if you actually measure. - [Managers should be careful worrying about dev speed](https://notes.webutvikling.org/can-we-go-faster.md): When a manager worries about speed, the real topic is trust. Grunt work is not how software actually moves. Instead, think of how priorities should change. - [Turborepo: TypeScript gotchas](https://notes.webutvikling.org/typescript-build-gotchas.md) - [Nginx - why would I use it?](https://notes.webutvikling.org/what-is-nginx.md) - [ESM vs CommonJS](https://notes.webutvikling.org/esm-vs-commonjs.md) - [Avoid commission in startups](https://notes.webutvikling.org/startup-sales-commission.md): Based-on-reality short-story of a sales team, and the effects of introducing commission based salaries on culture and process. - [Email providers: AWS SES, Mailgun, Sendgrid, Mailchimp?](https://notes.webutvikling.org/choosing-an-email-provider.md) - [Cows are killing bio-diversity](https://notes.webutvikling.org/cows-are-killing-bio-diversity.md): CO2 gets the headlines. Biodiversity dies from land use, and most of that land is for cows. - [Use plain text emails](https://notes.webutvikling.org/use-plain-text-emails.md): People say they prefer HTML emails, but they engage more with plain text — it feels like a person, not a billboard. - [Suggested data structure for logging](https://notes.webutvikling.org/structured-logs.md) - [Postgres needs built-in connection pooling](https://notes.webutvikling.org/postgres-should-get-builtin-connection-pooling.md) - [Starting with Google BigQuery](https://notes.webutvikling.org/starting-bigquery.md) - [Reminder: iPhone wants H.264 encoded videos](https://notes.webutvikling.org/video-wont-render-on-iphone.md) - [Firebase data modeling](https://notes.webutvikling.org/firebase-data-modelling.md) - [Burn Firebase to the ground](https://notes.webutvikling.org/firebase-highscore-this-month.md) - [Deploying GraphQL API to Google cloud](https://notes.webutvikling.org/deploying-typescript-graphql-api-to-gcloud-functions.md) - [Aurora serverless starts at 100$ month](https://notes.webutvikling.org/aurora-serverless-is-not-for-your-hobby-project.md) - [No rules rules](https://notes.webutvikling.org/no-rules-rules.md): Hastings and Meyer sold me on talent density, candid feedback, and letting employees make the calls. - [How-to: Run npm/yarn with one command](https://notes.webutvikling.org/npm-yarn-merger-script.md) - [NextJS: Add state to URL query params](https://notes.webutvikling.org/nextjs-store-state-in-url-query.md) - [How will you measure your life? 🤔](https://notes.webutvikling.org/how-will-you-measure-your-life.md): Christensen wears his values on the outside. Job to be done, plus a framework for not wrecking the rest of your life. - [Please lower case db table names](https://notes.webutvikling.org/postgres-table-should-be-lowercased.md): Unquoted Postgres names are lowercased. Stick to snake_case or autocomplete and unquoted queries will bite you. - [A lunch about marketing](https://notes.webutvikling.org/marketing-tips.md) - [Make Raspberry Pi display an URL on boot](https://notes.webutvikling.org/make-raspberry-pi-your-status-screen.md) - [The effective engineer 👍](https://notes.webutvikling.org/the-effective-engineer.md): Keep leverage in the back of your mind: value produced over time invested. Read this if you ship digital products. - [Adding system metrics dashboard to logz.io](https://notes.webutvikling.org/adding-system-metrics-dashboard-to-logz.io.md) - [How-to: find bugs with git bisect](https://notes.webutvikling.org/use-git-bisect.md) - [1Password vs LastPass for teams](https://notes.webutvikling.org/1password-vs-lastpass-for-teams.md) - [How to load web fonts quickly](https://notes.webutvikling.org/loading-webfonts.md) - [Passbolt on AWS](https://notes.webutvikling.org/passbolt-on-heroku.md) - [Blitzscaling pt. 2: Management](https://notes.webutvikling.org/blitzscaling-management.md): How a company feels as it grows from 10 to 100, and the odd rules that keep it from falling apart. - [Blitzscaling pt. 1](https://notes.webutvikling.org/blitzscaling.md): Splurge money to grow insanely fast. Only do it when speed into the market is the whole game. - [Understanding ESLint config](https://notes.webutvikling.org/eslint-config.md) - [[package] has unmet peer dependency](https://notes.webutvikling.org/[package]-has-unmet-peer-dependency.md) - [Migrating to React Redux hooks](https://notes.webutvikling.org/redux-hooks.md) - [Always say what we try to accomplish](https://notes.webutvikling.org/github-clickup-integration.md): A good leaders repeats why and what we try to accomplish. So should issue trackers and code tools. Here's a short guide on integrating ClickUp with GitHub, so exactly that becomes simpler. - [Stop using defaultProps](https://notes.webutvikling.org/stop-using-defaultprops.md): In functional components, default argument values beat defaultProps. Use the language, not the library. - [Convert mp4 to gif](https://notes.webutvikling.org/mp4-to-gifs.md) - [Setting up a new developer Macbook](https://notes.webutvikling.org/post-setup-setup-of-new-mac.md) - [IDE shortcuts](https://notes.webutvikling.org/ide-shortcuts.md) - [Stop using default exports](https://notes.webutvikling.org/default-exports.md): Default exports look cleaner on the import line, then break find-usages, rename, and go-to-definition in your own code. - [Gatsby won't last](https://notes.webutvikling.org/gatsby-intro.md): Gatsby is React meeting WordPress. Cool static pages, but the plugin trash pile will be the end of it. - [This is how you do Pull requests](https://notes.webutvikling.org/pull-request-mountain-code.md) - [Standups should state goals, accomplishments and blockers](https://notes.webutvikling.org/a-reminder-about-standsups.md): Good standups give speed, through increased focus and accountability. It does this if you state your current goals, your recent accomplishment and ask others to help you. But it often becomes a meaningless chore when you don't. - [Always use Exact types in Flow](https://notes.webutvikling.org/why-use-exact-types-in-flow.md) - [Where is my PostgreSQL logs?](https://notes.webutvikling.org/finding-postgres-logs.md) - [Quick http benchmarking with curl](https://notes.webutvikling.org/quick-http-benchmarking-with-curl.md) - [Boto3 - copy, create files + cloudfront invalidations](https://notes.webutvikling.org/boto3-copying-and-creating-files-cloudfront-invalidations.md) - [Adding a python API handler with serverless](https://notes.webutvikling.org/adding-a-python-api-handler-with-serverless.md) - [Creating a Google Chrome Extension](https://notes.webutvikling.org/creating-a-google-chrome-extension.md) - [CSS systems and principles](https://notes.webutvikling.org/on-the-topic-of-css-systems.md) - [Stop using semantic class names](https://notes.webutvikling.org/semantic-vs-content-independent-css.md): Name CSS classes for what they are, not how they're used. - [What skills does an it consultant need?](https://notes.webutvikling.org/what-skills-does-an-it-consultant-need.md) - [Access Google Analytics API with OAuth token](https://notes.webutvikling.org/access-google-analytics-api-with-oauth-token.md) - [How to add Web App Manifest](https://notes.webutvikling.org/how-to-add-web-app-manifest.md) - [AWS S3 and CloudFront workshop](https://notes.webutvikling.org/aws-s3-and-cloudfront-workshop.md) - [Getting started with Hubot + Slack](https://notes.webutvikling.org/getting-started-with-hubot-slack.md) - [Custom Slack slash commands](https://notes.webutvikling.org/custom-slack-slash-commands-on-heroku.md) - [Elastic Beanstalk with Terraform](https://notes.webutvikling.org/elastic-beanstalk-with-terraform.md) - [Elastic Beanstalk – In a VPC](https://notes.webutvikling.org/elastic-beanstalk-in-a-vpc.md) - [HTTPS for AWS CloudFront and AWS ELB](https://notes.webutvikling.org/howto-aws-cloudfront-with-ssl-and-your-domain.md) - [Using AWS Route 53 and SES to handle DNS and e-mail](https://notes.webutvikling.org/using-aws-route-53-and-ses-to-handle-dns-and-e-mail.md) - [Build screen bootup](https://notes.webutvikling.org/build-screen-bootup.md) - [Create Elastic Beanstalk app with Java 8](https://notes.webutvikling.org/create-elastic-beanstalk-app-with-java-8.md) - [AWS Elastic Beanstalk](https://notes.webutvikling.org/aws-elastic-beanstalk.md) - [Send AWS EC2 logs to Slack](https://notes.webutvikling.org/aws-send-ec2-logs-to-slack.md) - [Send AWS CloudWatch Alarms to Slack](https://notes.webutvikling.org/send-aws-cloudwatch-alarms-to-slack.md) - [Add S3 bucket + CloudFront using Terraform (example)](https://notes.webutvikling.org/s3-bucket-cloudfront-using-terraform.md) - [AWS CodePipeline](https://notes.webutvikling.org/aws-codepipeline.md) - [Adding Freshdesk to Slack](https://notes.webutvikling.org/adding-freshdesk-to-slack.md) - [Startup workflow toolkit](https://notes.webutvikling.org/startup-workflow-toolkit.md) - [Porting a React app to Phonegap](https://notes.webutvikling.org/porting-a-react-app-to-phonegap.md) - [git cheatsheet](https://notes.webutvikling.org/git-cheatsheet.md) - [Don't convert SVG to PNG in the browser](https://notes.webutvikling.org/converting-svg-to-png-with-javascript-cross-browser.md) - [ES6 notes](https://notes.webutvikling.org/es6-notes.md) - [Javascripts var, let, and const](https://notes.webutvikling.org/javascripts-var-let-and-const.md) - [D3 + article combo ideas](https://notes.webutvikling.org/d3-article-combo-ideas.md) - [Set index.html as default file on S3 bucket](https://notes.webutvikling.org/set-index-html-as-default-file-on-s3-bucket.md) - [React intro notes](https://notes.webutvikling.org/react-intro-notes.md) - [How to add hubot to slack](https://notes.webutvikling.org/how-to-add-hubot-to-slack.md) - [grep middle of file (unix)](https://notes.webutvikling.org/grep-middle-of-file-unix.md) - [Awesome webdeveloper links](https://notes.webutvikling.org/sexy-webdeveloper-links.md) - [AWS rules of thumb notes](https://notes.webutvikling.org/aws-rules-of-thumb-notes.md) - [Profiling in Chrome Developer Tools](https://notes.webutvikling.org/profiling-javascript-in-chrome-developer-tools.md) - [Sending SMS from python via your phone](https://notes.webutvikling.org/sending-sms-from-python-via-your-phone.md) - [Add S3 bucket using awscli (example)](https://notes.webutvikling.org/add-s3-bucket-using-awscli-example.md) - [Add S3 bucket using Terraform (example)](https://notes.webutvikling.org/add-s3-bucket-using-terraform.md) - [curl headers only](https://notes.webutvikling.org/curl-headers-only.md) - [Django on Heroku with AWS S3 for files](https://notes.webutvikling.org/django-on-heroku-with-aws-s3-bucket-for-static-and-media-files.md) - [django rewrite / redirect to new urls](https://notes.webutvikling.org/django-rewrite-redirect-to-new-urls.md) - [Show environment variables in Heroku](https://notes.webutvikling.org/show-environment-variables-in-heroku.md) - [Monitor-driven development](https://notes.webutvikling.org/monitor-driven-development.md) - [Parallax: solve it with CSS](https://notes.webutvikling.org/parallax-css-it-please.md) - [Export data from one Django to another](https://notes.webutvikling.org/export-data-from-one-django-to-another-over-ssh.md) - [Do not design your own newsletter emails!](https://notes.webutvikling.org/the-easy-way-of-sending-newsletter-emails.md) - [Django + Heroku bootstrap](https://notes.webutvikling.org/create-django-project-and-publish-on-heroku-script.md) - [Center content in HTML mails for OWA](https://notes.webutvikling.org/center-content-in-html-mails-for-owa.md) - [Sending and receiving JSON over Bluetooth](https://notes.webutvikling.org/sending-and-receiving-json-over-bluetooth.md) - [Fresh Macbook and a set of neat tools](https://notes.webutvikling.org/fresh-macbook-and-a-set-of-neat-tools.md) - [Django autocomplete in (virtualenv) shell](https://notes.webutvikling.org/django-autocomplete-in-shell.md) - [jquery confirm modal using bootstrap](https://notes.webutvikling.org/jquery-confirm-modal-using-bootstrap.md) - [Running Django with nginx (on webfaction)](https://notes.webutvikling.org/nginx-on-webfaction.md) - [Get python, pip, virtualenv without sudo](https://notes.webutvikling.org/get-python-virtualenv-pip-without-sudo.md) - [pip on python3: Can't decompress data; zlib not available](https://notes.webutvikling.org/darn-installation-of-python-3-4.md) - [No module named '_sqlite3'](https://notes.webutvikling.org/no-module-named-_sqlite3.md) - [fork: retry: Resource temporarily unavailable](https://notes.webutvikling.org/fork-retry-resource-temporarily-unavailable.md) - [Ignore webkit-*, moz-* when typing css](https://notes.webutvikling.org/grunt-dont-worry-about-webkit-moz-when-typing-css.md) - [bash backup of webserver (FTP and SQL)](https://notes.webutvikling.org/backup.md) - [Git repo on FTP-server](https://notes.webutvikling.org/git-repo-on-ftp-server.md) - [Mount FTP-server in debian using curlftpfs](https://notes.webutvikling.org/mount-ftp-server-in-debian-using-curlftpfs.md) - [Automatic MySQL and FTP backup](https://notes.webutvikling.org/automatic-mysql-and-ftp-backup.md) - [Facebook: Invite all friends to event](https://notes.webutvikling.org/facebook-invite-all-friends-to-event.md) - [Web Icon Fonts](https://notes.webutvikling.org/icons.md) - [Track custom events with google analytics](https://notes.webutvikling.org/track-custom-events-with-google-analytics.md) - [Cron tabs: create and delete](https://notes.webutvikling.org/cron-tabs.md) - [git: Replace master branch](https://notes.webutvikling.org/git-replace-master-branch.md) - [SFTP in Finder](https://notes.webutvikling.org/sftp-in-finder.md) - [Alfred for Windows](https://notes.webutvikling.org/alfred-for-windows.md) - [Humørteste sosiale medier](https://notes.webutvikling.org/humorteste-sosiale-medier.md) ## Links - [Speed is not velocity](https://notes.webutvikling.org/speed-is-not-velocity.md): A good leader points clearly in an ambitious direction and helps people separate activity from progression. Confusing the two is how you get exhaustion and burnout. - [Focus is the kryptonite for founders](https://notes.webutvikling.org/focus-is-the-cryptonite-for-founders.md): Lack of focus is a company killer. Ironically, founders often have easily-excited distractible personalities. - [Postpone getting a board](https://notes.webutvikling.org/startups-avoid-a-board.md): Early startups need speed, and a board can be a big slowdown. Alignment inside the team already eats enough time. Want input? Coffee. Want names on the website? Call them an advisory board. - [Stop guessing: give AI access to your DB](https://notes.webutvikling.org/stop-guessing-give-ai-access-to-your-db.md): If you can give an LLM read-access to your database, you get great wins with immediate answers to debunk or confirm your gut feelings. [But don't forget to hide the sensitive data] - [Become a generalist now](https://notes.webutvikling.org/ic-work-is-the-new-career-flex.md): Becoming a skilled individual contributor is the next thing, as AI lets one person ship end-to-end. This shift increases the value of a self-propelled coder who also understands strategy, sales and operations. - [Obesity is a thing of the past](https://notes.webutvikling.org/obesity-is-a-thing-of-the-past.md): Novo Nordisk spent a century on insulin, then disrupted themselves with Ozempic. Body composition as a class marker is just getting started. - [Startup execution: Focus on few things](https://notes.webutvikling.org/startup-focus.md): Focus is critical. There's 100 important things to work on every single day, so you need to say no more often than you'd like. - [Make everyone do support](https://notes.webutvikling.org/make-everyone-do-support.md): Support tickets are condensed user feedback. It's a user telling you what they want, what they don't understand, and what they don't like. Treasure it, and spread that knowledge across the company by having everyone do customer support. - [Make it easy to be dumb in your codebase](https://notes.webutvikling.org/scalable-frontend-applications.md): Make it easy to delete: colocate by feature. Make it easy to build it right: automated checks. Make it easy to be newb: reduce knowledge-requirements, embrace dumb questions. Migrate incrementally: large diffs fail. Use a monorepo: reduced error rate. Make code quality derivative positive: make things better over time. - [Time zones: It's not just «use UTC, man»](https://notes.webutvikling.org/dont-build-a-calendar.md): «Hi. This is my first time at Developers Anonymous. My name is Tomas, I'm a coder and I've built a calendar»... Time zones are f***ing hard. The last 6 months I've reported and fixed bugs in Moment, dayjs, date-fns-tz and React Aria. - [Review your own PRs](https://notes.webutvikling.org/review-your-own-prs.md): I wrote in a (student) newspaper once. I bet I wrote ~10 typos per page. 9 of which I caught on my own review. Similarly, most bugs I write are apparent to myself when I review the code. It's like it's two different brain modes: producer and reviewer. - [Build for today. Only today](https://notes.webutvikling.org/build-for-today-only.md): I often add a field, model or endpoint that I need 'tomorrow'. When 'tomorrow' finally shows up, it's usually not quite what I need. Note to self: Stop building for tomorrow. Stop build it 100% complete. Stop over-generalizing to fit future scenarios. - [Don't abbreviate variable names](https://notes.webutvikling.org/dont-abbrivate-variable-names.md): Variable name: don't make them short and cryptic – let them be as long as they really are. Sidenote: Subscribe to that channel, it's great. - [Don't write comments](https://notes.webutvikling.org/dont-write-comments.md): There is a consistent way of describing how a program should work, it is called writing code. Writing comments that describe how code work is usually an excuse for writing bad code. Exceptions: documentation/issue links, and sometimes bad code is required. - [Test "commit driven development"](https://notes.webutvikling.org/write-small-commits.md): Writing smaller commits is a constant practice that I feel often pays off. The Primeagen's reflections on the topic is worth seeing (from 11:16, earlier parts are so so). Challenge: for your next feature, write commit messages first! - [DRY does more harm than good](https://notes.webutvikling.org/do-repeat-yourself.md): «Please DRY up your code» is usually bad advice – abstraction creates coupling and complex code. I'd advocate ALRY – ALways Repeat Yourself. When that code has matured, you are in a better position to see if it's a matching concept that can be combined to common code – or if it's just accidentally similar. - [Select velocity + adaptability over performance](https://notes.webutvikling.org/performance-velocity-adaptability.md): Your code speed can be seen as a combination of velocity (how fast you add features), adaptability (how well suited code are for future changes) and performance (how fast the user experiences it). Don't care about performance until it's a problem. Then measure, test and measure. - [React.js: The Documentary](https://notes.webutvikling.org/react-documentary.md): React.js: The Documentary is a 2015 documentary film about the React.js JavaScript library. Bring popcorn? - [create-t3-app](https://notes.webutvikling.org/create-t3-app.md): The easiest way to get started with the best tools for building a modern web app. - [astro.build](https://notes.webutvikling.org/astro-lib.md): Build islands of interactive Svelte, React++ apps inside a static site. Perfect for building personal sites. - [Typescript: don't use interfaces](https://notes.webutvikling.org/do-not-use-ts-interfaces.md): Use types instead of interfaces in Typescript. Except when you have to use interface. - [Typescript: do not use enums](https://notes.webutvikling.org/do-not-use-typescript-enums.md): Typescript enums are bad. Never use them, use a record as const instead. Note: This still applies after the 5.0 release with enum improvements (they are now bad instead of terrible). - [No more CSS-in-JS](https://notes.webutvikling.org/no-more-css-in-js.md): A foreshadowing about stitches, emotion and styled components dying off, and tailwind becomes emperor. - [react.email](https://notes.webutvikling.org/react-email.md): Amazing. Crafting e-mails has been a remarkable pain in my butt several times. This looks like it could be a game changer. - [State of JS 2022](https://notes.webutvikling.org/state-of-js-2022.md): Superb stats on the state of JavaScript. TLDR: NextJS still nice, Svelte is great, and watch Solid. Vite or Turbopack replaces Webpack. Playwright replaces Cypress. Turborepo replaces Lerna. - [React Query, the complete tutorial](https://notes.webutvikling.org/react-query.md): Comprehensive, well-written writeup of React Query. I've learned a lot about my favourite data fetching library. - [The Grug Brained Developer](https://notes.webutvikling.org/grugbrain.md): Hilarious text, just to the point on why thinking stupid about code is being very smart. HARD RECOMMEND. - [The job of my boss: make me feel trusted](https://notes.webutvikling.org/why-leaders-eat-last.md): Extend the circle of safety to the outer parts of the organisation. When employees feels safe and trusted, they can spend their energy being creative and productive. - [Take initiative beyond what is expected of you](https://notes.webutvikling.org/the-heart-of-agile.md): «Guest leadership» is about taking responsibility to try to solve a problem or task that is not your own (alone), without needing an invitation to do so. Increase trust and ownership by giving your team the freedom to own the outcome and trust to solve things their way. - [A Prettier JavaScript Formatter](https://notes.webutvikling.org/prettier-javascript.md): While ESLint eliminated the need for people to talk about code conventions, Prettier can eliminate the need for people to think about code formatting. 10 000 thumbs up! I will never work for a company without autoformatting again. - [React Conf 2017: A Prettier Printer](https://notes.webutvikling.org/prettier-javascript.md): While ESLint eliminated the need for people to talk about code conventions, Prettier can eliminate the need for people to think about code formatting. 10 000 thumbs up! I will never work for a company without autoformatting again. - [GraphQL: Designing a Data Language](https://notes.webutvikling.org/graphql.md): GraphQL will replace REST, and the world will be a better place with end-to-end typing safety. - [Chromes Awesome Developer Tools](https://notes.webutvikling.org/chromes-awesome-developer-tools.md): A tour of the Developer tools: emulate network speed. emulate devices. JS debugger. console log timing. profiler. - [slides.com](https://notes.webutvikling.org/creating-a-presentation.md): This replaces PowerPoint for me: native to the web, simpler, with an open-source variant. - [Building a better Bootstrap](https://notes.webutvikling.org/building-a-better-bootstrap.md): Many mini nuggets on CSS systems. cssstats.com, atozcss.com, sassmeister.com, thesassway.com - [7 ineffective coding habits](https://notes.webutvikling.org/7-ineffective-coding-habits.md): Don't write comments, don't write off the line, don't make complex methods with many parameters, don't make complex methods with many parameters, don't do lousy encapsulation, testing should be a reflection of your functions. - [Clean Code III: Functions](https://notes.webutvikling.org/clean-code-iii-functions.md): Functions should do 1 thing. And be short. With few args. Without comments.