Sign in

Mastro.{js,ts}

@mastrojs.bsky.social
479 followers 378 following 2.6K posts

No dependencies, #nobuild step. Just a simple web framework and site generator for people who care about their users and web standards. Implemented in ~800 lines of TypeScript. 🧑‍🍳 mastrojs.github.io Account run by Mauro Bieg @mb21.bsky.social

PostsRepliesMedia
Reposted by Mastro.{js,ts}
Matthew Somerville @dracos.co.uk · 12/09/2026
As @infrequently.org noted in infrequently.org/2023/02/the-..., and the same applies with AI coding
The complexity merchants knew their environments weren't typical, but sold their highly specialised tools to folks shopping for general purpose solutions anyway. They understood most sites lack latency budgeting, dedicated performance teams, hawkish management reviews, ship gates to prevent regressions, and end-to-end measurements of critical user journeys. They grasped that massive investment in controlling complexity is the only way to scale JS-driven frontends, but warned none of their customers.Production code written by Claude should have a higher bar than if it was written by a human. At Anthropic, we have many guardrails in place to make sure this is happening: lots of lint rules, lots of tests, Claude-driven end to end tests, Claude-powered fuzzers running daily, automated code reviews and security reviews, automated code refactoring, and so on. Without these, you can end up with a mess that is hard to maintain down the line.
– Boris Cherny
142
Mastro.{js,ts} @mastrojs.bsky.social · 11/09/2026
Who’s at @zurichjs.com ? Happy to chat!
161
Mastro.{js,ts} @mastrojs.bsky.social · 09/09/2026
Looking forward to see y'all at today's @zurichjs.com pre-conference meetup! 🙌
3111
Mastro.{js,ts} @mastrojs.bsky.social · 02/09/2026
Our contribution to the dark mode picker debate, give it a try!
000
Mastro.{js,ts} @mastrojs.bsky.social · 01/09/2026
It's kinda painful how in the end Theo's only remaining argument for why you should pick React is: "because that's how I learned frontend and there are lots of courses out there!" 🙈
170
Mastro.{js,ts} @mastrojs.bsky.social · 31/08/2026
Build websites that last 👏
youtube.com
Alexander Petros – Getting off the Modernization Treadmill | Big Sky DevCon 2026
YouTube video by Montana Programmers
140
Reposted by Mastro.{js,ts}
drk @drk.wtf · 28/08/2026
The argument for SPAs being good for long-running sessions/productivity apps falls flat for me. Take Sentry for example. Yeah I have a long session here and there (long being like 3-5 minutes), but the lion share if fresh page loads.
161
Mastro.{js,ts} @mastrojs.bsky.social · 28/08/2026
Enshittification and bloated software isn’t inevitable! “Overproduction is all the product changes you ship that don’t increase the benefit of the software to the users.”
medium.com
Enshittification as Overproduction in Software, Part 1: Seeing Overproduction
As someone who has previously enshittified a product, I have a few things to say about this moment of mass enshittification…
090
Mastro.{js,ts} @mastrojs.bsky.social · 27/08/2026
@davatron5000.bsky.social Thanks for microlighter – very cool! But the URLs in the README are wrong! @jim-nielsen.com already made a PR in case you haven't seen it: github.com/davatron5000...
020
Mastro.{js,ts} @mastrojs.bsky.social · 27/08/2026
Is this the final nail in the coffin for SPAs? (think persisting a video player or chat widget incl. all DOM state across page navigations)
1141
Mastro.{js,ts} @mastrojs.bsky.social · 25/08/2026
Tell me again how client-side rendering improves the user experience. I just want to look at a bit of text on a GitHub issue page!
GitHub screenshot: "Timeline cannot be loaded"
230
Mastro.{js,ts} @mastrojs.bsky.social · 20/08/2026
Another happy user of github.com/mastrojs/atp... 🙌
050
Reposted by Mastro.{js,ts}
Jake Lazaroff @jakelazaroff.com · 20/08/2026
pretty wild how liberating it is to write code that just works in the browser without a build step
1337
Reposted by Mastro.{js,ts}
Tobbe @tobbe.dev · 18/08/2026
Thanks for having me Jeff, I had a blast. And for anyone watching, if you like what you hear, I am looking for a job. Please reach out if you need a senior engineer on your team. Full-stack, frontend, backend, team lead, CTO, eng manager. I've done most of it :)
094
Mastro.{js,ts} @mastrojs.bsky.social · 18/08/2026
@infrequently.org how do you convince such people? 😰
Screenshot of slack conversation:

- first clicking around doesn't do anything, because it's not hydrated yet.
  then, presumably the fetch call ran into a network error, where our error message is not ideal.
  it's an extreme case, but it can happen... 

- We’ll improve this when we move this to an SPA instead of Next.js — the loading will be more explicit initially and then we’ll move to tRPC which makes error handling easier to do robustly.

- well, if you don't do any SSR, it would just stay completely white/blank until hydration is finished (that's at the 45 second mark here).

- We can serve a non-blank index page.

- put a loading indicator there? yeah, doesn't make it usable faster though
270
Mastro.{js,ts} @mastrojs.bsky.social · 18/08/2026
@remix.run this URL currently returns a 500 🫠 remix.run/docs/en/main...
000
Reposted by Mastro.{js,ts}
Firefox @firefox.com · 10/08/2026
Our support for uBlock Origin isn't going anywhere.
271071266
Reposted by Mastro.{js,ts}
Rob Palmer @robpalmer.bsky.social · 10/08/2026
We're hiring a Technical Product Manager for Web Platform & Frameworks infrastructure at Bloomberg in New York. You'll be working with me and @jonkuperman.com plus a whole bunch of folks excited by web technologies ✨ Feel free to DM with questions. bloomberg.avature.net/careers/JobD...
bloomberg.avature.net
Technical Product Manager - Web Platform & Frameworks - CTO Office
03617
Reposted by Mastro.{js,ts}
Vale @vale.rocks · 10/08/2026
@lea.verou.me published an interesting article on website theme toggle design, which set me off thinking about them. After a bit of experimenting and testing with users, I've got a pattern I quite like. vale.rocks/micros/20260... #UI #UX
vale.rocks
Light/Dark/System Theme Setting Design - 10 Aug 2026 03:30 UTC
84410
Reposted by Mastro.{js,ts}
Dylan Beattie @dylanbeatt.ie · 06/08/2026
This is one of the best articles I've seen about the difference between letting the underlying settings dictate the structure of your UI, and thinking about what actually makes sense to your users. Really, really insightful, and definitely worth ten minutes of your time.
1254
Mastro.{js,ts} @mastrojs.bsky.social · 08/08/2026
Happy HTML day everyone!
0132
Reposted by Mastro.{js,ts}
Olivier Forget @olivierforget.net · 07/08/2026
I've come to the same conclusion. SPAs are basically two apps: the backend one and the frontend one, and they need to work perfectly toegether. It's so much code to write correctly for every little feature or bit of read-write data. What a pain. This is why I am spending time on BackflipHTML
161
Reposted by Mastro.{js,ts}
Richard Groß @richargh.de · 05/08/2026
You are making it very, very Hard to resist Mastro.
111
Mastro.{js,ts} @mastrojs.bsky.social · 05/08/2026
Don't you have to compile TypeScript to JavaScript before you can run it?
mastrojs.github.io
TypeScript web framework with no build step – but how? | Mastro Blog
Don't you have to compile TypeScript to JavaScript before you can run it?
2123
Mastro.{js,ts} @mastrojs.bsky.social · 05/08/2026
Didn't realize this is supported even in Safari >=16 🥳 :root { --screen: "small"; @media (width > 900px) { --screen: "large"; } } body { font-size: 1rem; @container style(--screen: "large") { font-size: 1.5rem; } }
1161
Reposted by Mastro.{js,ts}
Brian LeRoux @brianleroux.bsky.social · 30/07/2026
no build is faster than #nobuild
3141
Mastro.{js,ts} @mastrojs.bsky.social · 30/07/2026
“I will spend the rest of my career working hard so that you’ll never have to use build tools again.” – @davatron5000.bsky.social Welcome to the #nobuild movement! 🙌✊
0141
Reposted by Mastro.{js,ts}
Oliver Ash @oliverjash.me · 28/07/2026
I'm looking for a new role as a lead frontend/TypeScript engineer. 👋 13 years of experience and I formerly led the web team at Unsplash. My CV: drive.google.com/file/d/1Hp7w... If you know of any roles, please reach out. I'd really appreciate if you could share. Thank you!
23122
Mastro.{js,ts} @mastrojs.bsky.social · 29/07/2026
That’s good (assuming it’s not an excuse for them to just burn more tokens 😬)
010
Reposted by Mastro.{js,ts}
Nathan Knowler @knowler.dev · 28/07/2026
Chromium devtools is almost a web IDE/design tool. You can add folders + files to it. Make changes in the style editor that persist to disk. developer.chrome.com/docs/devtool...
developer.chrome.com
Set up workspaces to save changes to source files  |  Chrome DevTools  |  Chrome for Developers
Set up a workspace to save changes made within DevTools back to your source files.
231
Mastro.{js,ts} @mastrojs.bsky.social · 27/07/2026
Mastro's HTML generation is even faster now. 🚀 Our first benchmark runs in an amazing 2.0µs on my laptop (down from 6.0µs): - Benchmark: github.com/mastrojs/mas... - Implementation: github.com/mastrojs/mastro/blob/main/src/core/html.ts
051
Mastro.{js,ts} @mastrojs.bsky.social · 24/07/2026
Never been a better time to switch to a static site!
052
Reposted by Mastro.{js,ts}
Joe Pea @joe.trusktr.io · 23/07/2026
@nomster.bsky.social's Two-Phase View Transitions example here shows an MPA (multi-page application) navigating between to separate pages (two full page loads), with a smooth skeletal loader animation between them. noamr.github.io/two-phase-vt...
1133
Reposted by Mastro.{js,ts}
Frontend Dogma @frontenddogma.com · 20/07/2026
Do We Still Need Build Tools?, by @ollie-williams.bsky.social: olliewilliams.xyz/blog/no-build/?re… #css #javascript #building #tooling
olliewilliams.xyz
Do we still need build tools?
Do we still need Rspack, SWC, PostCSS, Vite, Parcel, Webpack, Turbopack, esbuild, Rollup, Rolldown, Babel, Autoprefixer, esbuild and Lightning CSS in 2026?
062
Reposted by Mastro.{js,ts}
Brian LeRoux @brianleroux.bsky.social · 16/07/2026
Think we've all known this intuitively for a long time now. embrace.io/blog/researc...
embrace.io
New research: The Core Web Vitals thresholds you trust might be wrong for your site
Core Web Vitals data from ten leading online retailers reveals that "good" for Google may not be good enough for your users or your business.
193
Mastro.{js,ts} @mastrojs.bsky.social · 10/07/2026
Updated hero and footer on mastrojs.github.io 🥳 Also, "Getting started" is hopefully easier to find now. Thanks @tobbe.dev for the help!
mastrojs.github.io
Mastro: No dependencies. No build step. Just a simple web framework and static site generator.
A minimal tool for people who care about their users and web standards.
121
Mastro.{js,ts} @mastrojs.bsky.social · 10/07/2026
@kevinpowell.co What happened to thecascade.dev/article/leas... (404)? I was linking to that from mastrojs.github.io/guide/css/ 😭
mastrojs.github.io
Styling with CSS | Mastro Guide
A minimal tool to build content-driven websites
100
Mastro.{js,ts} @mastrojs.bsky.social · 09/07/2026
Just updated the Mastro Node.js starter template to TypeScript 7 and it just works.
030
Mastro.{js,ts} @mastrojs.bsky.social · 08/07/2026
The good news is that I managed to replace a Radix select with a customizable select. The bad news? Tailwind. Truly cursed codebase 😱
      {/* Native customizable <select> (Chrome 133+, Safari >=27) instead of Radix: the
          <selectedcontent> mirrors whichever <option> is selected directly off
          the DOM, so an auto-picked value (see the effect above) displays
          correctly without ever having to open the dropdown first — which the
          Radix Select couldn't do. Browsers that don't yet implement
          this part of the spec, fall back to a plain mostly unstyled <select> */}
      <select
        value={value ?? ""}
        onChange={(e) => onChange(e.target.value || null)}
        className={cn(
          "border-input focus-visible:border-ring focus-visible:ring-ring/50 dark:bg-input/30 flex h-8 w-full items-center rounded-lg border bg-transparent px-2.5 py-1 text-sm transition-colors outline-none focus-visible:ring-[3px]",
          // @tailwindcss/forms puts its own arrow on every <select> via
          // background-image — clear it so it doesn't double up with the
          // browser's own ::picker-icon arrow for the customizable select.
          "bg-none",
          "[appearance:base-select]",
          "[&::picker(select)]:border-border [&::picker(select)]:bg-popover [&::picker(select)]:text-popover-foreground [&::picker(select)]:mt-1 [&::picker(select)]:[appearance:base-select] [&::picker(select)]:rounded-[var(--radius)] [&::picker(select)]:border [&::picker(select)]:p-1 [&::picker(select)]:shadow-[0_4px_12px_oklch(0_0_0/10%)]",
          "[&_option]:rounded-[calc(var(--radius)-4px)] [&_option]:px-1.5 [&_option]:py-2",
          "[&_option:hover]:bg-accent [&_option:hover]:text-accent-foreground [&_option:focus-visible]:bg-accent [&_option:focus-visible]:text-accent-foreground",
          "[&_option:disabled]:pointer-events-none [&_option:disabled]:opacity-50",
360
Mastro.{js,ts} @mastrojs.bsky.social · 07/07/2026
> We can’t “go back” — we’re remembering it wrong anyway.
053
Mastro.{js,ts} @mastrojs.bsky.social · 06/07/2026
"JSX is just like HTML", they said 😭
  return (
    <Sidebar collapsible="icon">
      <SidebarContent className="gap-0">
        <SidebarGroup>
          <SidebarGroupContent>
            <SidebarMenu>
              <SidebarMenuItem>
                <SidebarMenuButton onClick={() => setCommandOpen(true)}>
                  <SearchIcon />
                  <span>Search</span>
2170
Mastro.{js,ts} @mastrojs.bsky.social · 02/07/2026
By the guy who brought you CodeMirror and ProseMirror: A new rich text editor called Wordgard! marijnhaverbeke.nl/blog/wordgar...
2482
Mastro.{js,ts} @mastrojs.bsky.social · 27/06/2026
“i want App Router to get good!” yeah… good luck!
030
Mastro.{js,ts} @mastrojs.bsky.social · 25/06/2026
Spending way too much time shaping the flow of the text on mastrojs.github.io – on desktop 😅
Screenshot of the linked website.
000
Mastro.{js,ts} @mastrojs.bsky.social · 25/06/2026
Remember when we were reluctant to add an additional <div> only for the CSS? 😅 Good times.
280
Reposted by Mastro.{js,ts}
Andrea Giammarchi @webreflection.bsky.social · 24/06/2026
are you still doing the awkward atob/btoa dance to convert to and from base64? you can stop it now, it's fully supported on modern environments and it can be polyfilled in here: github.com/ungap/base64...
github.com
GitHub - ungap/base64: Uint8Array.fromBase64 and Uint8Array.prototype.toBase64 polyfill.
Uint8Array.fromBase64 and Uint8Array.prototype.toBase64 polyfill. - ungap/base64
022
Mastro.{js,ts} @mastrojs.bsky.social · 22/06/2026
Just got a ticket for @zurichjs.com 🥳 Looking forward to see some of you there!
5142
Mastro.{js,ts} @mastrojs.bsky.social · 22/06/2026
Please repost so Ollie can find the right people!
020
Mastro.{js,ts} @mastrojs.bsky.social · 20/06/2026
Just removed the last remaining dependency from Mastro 🥳
1260
Mastro.{js,ts} @mastrojs.bsky.social · 18/06/2026
explain your @ Minimal Astro JS
020