Sign in

Sandro Circi

@sandros94.com
330 followers 122 following 530 posts

Picture after picture is how the story is told. Formally a photographer, insanely curious and passioned optimizer. 💾 github.com/sandros94 Part of unjs.io, h3js and the ecosystem team of nuxt.com Also helping in any OSS project such as nitro.build

PostsRepliesMedia
Sandro Circi @sandros94.com · 25/09/2026
I've finally started developing a personal project that is just for fun Combining all the usual tools that I generally build or contribute to, but this time driven only by curiosity. I'm sure that with the right spirit and perseverance I'll finish it and publish it for everyone to enjoy
XDraw 2d rendering of path discoverability over rough terrain
011
Sandro Circi @sandros94.com · 31/07/2026
I still have my very first computer right next to me, patiently waiting for when I'll have time to play with it again...
Just a picture of my olivetti pc m290 sitting next to my desk
110
Sandro Circi @sandros94.com · 05/02/2026
Giving some love to what is probably my all-time favorite package, which powers everything under the hood 🙌 npmx.dev/h3
h3 on npmx.dev with exactly one like
1220
Sandro Circi @sandros94.com · 04/02/2026
Aaah, ez task
Desk setup, showing my two monitors: main one landscape, secondary vertical on the right for socials and devtools
210
Sandro Circi @sandros94.com · 01/10/2025
Published yet another update for `unjwt` Added an h3 (v1) adapter with in-context caching for both JWS and JWT tokens. With minimal runtime configuration you'll be also able to wrap them in your Nuxt and Nitro projects
Minimal code example for handling JWE and JWS sessions in h3, Nitro and Nuxt

```ts
import { useJWESession, useJWSSession, generateJWK } from "unjwt/adapters/h3";

const keys = await generateJWK("RS256");

export default defineEventHandler(async (event) => {
  const privateSession = await useJWESession(event, {
    name: "app-session",
    secret: "my-secret", // or JWK (symmetric or asymmetric keypair)
  });

  await privateSession.update((data) => ({
    visits: (data.visits ?? 0) + 1,
  }));

  const publicSession = await useJWSSession(event, {
    name: "app-session-public",
    key: keys, // you can directly pass symmetric or asymmetric keypairs
    maxAge: 60 * 60, // automatic JWT and cookie expiration
  });

  return {
    encryptedSession: privateSession.data,
    signedSession: publicSession.data,
  };
});
```
110
Sandro Circi @sandros94.com · 03/08/2025
I might have just found an impossible array type inference... I just wanted to get the `usedName` in the callback 💀
```ts
interface Brand<T extends string> {
  name: T
  cb: (usedName: T) => T
}

function multiple<T extends string>(
  brands: Brand<T>[]
) {
  return brands
}

const _brands = multiple([
  {
    name: 'Brand1' as const,
    cb: (usedName) => {
      // ^?(parameter) usedName: "Brand1" | "Brand2"
      return usedName
    }
  },
  {
    name: 'Brand2' as const,
    cb: (usedName) => {
      // ^?(parameter) usedName: "Brand1" | "Brand2"
      return usedName
    }
  }
])
```
000
Sandro Circi @sandros94.com · 13/07/2025
Unfortunately it was clearly stated in the first 3.6.0-alpha.1 release 😢 github.com/vuejs/core/r...
Pending Features

Things that do not work in this version yet:

- SSR hydration* (which means it does not work with Nuxt yet)
- Async Component*
- Transition*
- KeepAlive*
- Suspense
230
Sandro Circi @sandros94.com · 01/07/2025
I wasn't expecting such a wholesome face to great me on VSCode today 😍 @thealexlichter.com
091
Sandro Circi @sandros94.com · 22/06/2025
Sometimes I focus a bit too much on performance tho... from a simple 8x gain, up to a 22x gain for tokens >= 128 characters in length
performance comparison between unsecure and @deepsource/shifty packages.

```
✓ test/password.bench.ts > bench password generation > 16 characters 1302ms
    name                        hz     min     max    mean     p75     p99    p995    p999     rme  samples
  · unsecure            258,008.92  0.0030  1.1852  0.0039  0.0034  0.0126  0.0283  0.0500  ±2.06%   129005
  · @deepsource/shifty   31,944.22  0.0140  0.3600  0.0313  0.0339  0.0589  0.1472  0.1927  ±0.65%    15973

✓ test/password.bench.ts > bench password generation > 32 characters 1260ms
    name                        hz     min     max    mean     p75     p99    p995    p999     rme  samples
  · unsecure            189,041.70  0.0040  1.8323  0.0053  0.0046  0.0147  0.0347  0.0563  ±2.57%    94521
  · @deepsource/shifty   16,477.37  0.0334  0.3218  0.0607  0.0645  0.1572  0.1837  0.2418  ±0.64%     8239

✓ test/password.bench.ts > bench password generation > 64 characters 1263ms
    name                        hz     min     max    mean     p75     p99    p995    p999     rme  samples
  · unsecure            138,450.62  0.0057  1.3309  0.0072  0.0067  0.0186  0.0304  0.0531  ±1.68%    69226
  · @deepsource/shifty    8,159.16  0.0790  0.6198  0.1226  0.1276  0.2451  0.2639  0.3306  ±0.71%     4080

✓ test/password.bench.ts > bench password generation > 128 characters 1223ms
    name                       hz     min     max    mean     p75     p99    p995    p999     rme  samples
  · unsecure            89,836.24  0.0090  0.7473  0.0111  0.0106  0.0204  0.0313  0.0552  ±1.24%    44919
  · @deepsource/shifty   4,275.94  0.1729  0.4772  0.2339  0.2405  0.3586  0.3752  0.4173  ±0.58%     2139
```
010
Sandro Circi @sandros94.com · 19/03/2025
146... in 51h... Now I see what you were talking about...
146 github notifications
010
Sandro Circi @sandros94.com · 07/03/2025
I'm still amazed how much a cheap VPS with a simple Bun+h3 can do
Breaking over 5k requests/sec in a quick and dirty oha benchmark
010
Sandro Circi @sandros94.com · 21/02/2025
This still feels surreal to me... Thank you @nuxt.com for having me in the ecosystem team!
Screenshot of my GitHub profile showing the `Joined the Nuxt Organization` card
2290
Sandro Circi @sandros94.com · 05/01/2025
Still, we have some issues counting up to five... (at 0:40)
AI-generated image of a 6-fingers hand
000
Sandro Circi @sandros94.com · 31/12/2024
At last, joining my favorite game ♨️
First log for the night (new year's eve) set on fire in the fire pit, above the dinner embers.
130
Sandro Circi @sandros94.com · 30/12/2024
I am constantly insulted on this platform
Gwen taking her daily sunbath
010
Sandro Circi @sandros94.com · 22/12/2024
Would be nice to know which stars are actually from this year tho (GitHub API limitation) git-wrapped.com/profiles/san...
My personal git-wrapped for this year:

- Universal Rank: Top 1%
- Longest Streak: 129 days
- Total Commits: 2590
- Most Active Month: October
- Most Active Day: Monday
- Stars Earned: 4718
- Top Language: TypeScript
- Power Lever: Sage Mode
020
Sandro Circi @sandros94.com · 13/12/2024
_Pssst_, if you are on a @nuxt.com project you can add `h3-valibot/nuxt` as a module and have everything auto-imported. `v` and `vh` also available vue side 😏
in `nuxt.config.ts`:
```ts
export default defineNuxtConfig({
  modules: [
    //other nuxt modules
    'h3-valibot/nuxt',
  ],
})
```
050
Sandro Circi @sandros94.com · 13/12/2024
On the subject of @valibot.dev I recently enjoyed refactoring and updating `h3-valibot`. It brings a series of utility functions (and `safe` variants) that accept an h3 `event` and a valibot schema. It also comes with `vh` object with various string manipulation utils. github.com/intevel/h3-v...
```ts
import { useValidatedParams, vh, v } from 'h3-valibot'
import { defineEventHandler } from 'h3'

export default defineEventHandler((event) => {
  const { id } = await useValidatedParams(event,
    v.object({
      id: vh.uuid,
    }),
  )

  // rest of the code
})
```
1172
Sandro Circi @sandros94.com · 05/12/2024
Se il try/catch fosse scritto in romano...
```ts
function parse(data: string) {
  provamoce () {
    return JSON.parse(data)
  } maporca(err) {
    console.error(err.message)
    return null
  }
}
```
010
Sandro Circi @sandros94.com · 04/12/2024
While doing some research for my website I stumbled on this codepen and I'm having a meltdown... codepen.io/nicolasjesen... Credits: @njesenberger.bsky.social
140
Sandro Circi @sandros94.com · 04/12/2024
Just did a small `nuxt-qrcode` release. Automatic integration for #Nuxt UI and UI Pro color tokens, no need to define colors manually. qrcode.s94.dev/guide/config...
QRCode for: https://qrcode.s94.dev
3150
Sandro Circi @sandros94.com · 01/12/2024
I mean, everything is in-check, but probably my account is too new for such a short red flags list. Nobody started a mice/monitors discussion, yet 🤭 blueskyroast.com/roast/sandro...
Bluesky Roaster, Dating App Edition 💝

Bio:
"Coder by day, passionate tinkerer by night. Looking for someone who appreciates both fine coding and the finer points of mechanical keyboards. Let’s swap project ideas and enjoy life's glitches together!"

Red Flags:
🚩 Might obsessively talk about keyboard switches and Nuxt.
🚩 Could have a meltdown over a poorly formatted code snippet.

Green Flags:
✅ Passionate about open-source contributions.
✅ Loves techy humor and knows the value of a good meme.

Perfect Match:
Someone who can handle tech debates and appreciates a solid Vite release.Bluesky Roaster, Spice Level Check🌶️

Gentle Roasts:
🔥 He talks about coding like he’s crafting an epic saga—somewhere out there, J.R.R. Tolkien is raising an eyebrow.
🔥 If passion were monetized, Sandro could retire on his thoughts about Nuxt alone!

Main Character Moments:
✨ Sandro’s tech journey reads like an epic quest narrative; just swap out dragons for AI models and you’d be all set!
✨ When Sandro finds a new tool, it’s basically like an artist discovering a new medium—cue the dramatic music!Bluesky Roaster, Squad Check🌟

Role in Community:
The Bridge Builder of Tech

Conversation Style:
Conversationally curious, with a knack for engaging others like a friendly tech support agent on a caffeine rush.

Impact Assessment:
Sandro's contributions are like well-placed code comments—always appreciated and often leading to deeper discussions. He's the friendly neighborhood contributor everyone wishes they had on speed dial.
030
Sandro Circi @sandros94.com · 01/12/2024
ngl, this globe is starting to give me _can it run Crysis_ vibes
side-by-side view of a small 3d globe rendering and gpu utilization being at ~50%
110
Sandro Circi @sandros94.com · 27/11/2024
A few new component got merged into @nuxt.com UI v3, one of which is a mobile-inspired Drawer! If you can't wait for the next pre-release just edit your `package.json` 😏: ``` "dependencies": { "@nuxt/ui": "pkg.pr.new/@nuxt/ui@3496b2d", }, ``` Check it out 👇 ui3.nuxt.dev/components/d...
060
Sandro Circi @sandros94.com · 19/11/2024
New release for `nuxt-qrcode`! This release focuses on more improvements for QRCode generation, server side util and docs (finally)! I still need to describe many functionalities and use-cases, but feel free to ping me here or on Github if you have any question! qrcode.s94.dev
QRCode that points to https://qrcode.s94.dev
100
Sandro Circi @sandros94.com · 18/11/2024
Two years ago today I ran for the first time `npx nuxi init`. I had no JS experience, but was looking for learning it and one day sustain my family with it. While I haven't achieved the latter yet, @nuxt.com did felt to me like a second family. Helping while having fun, regardless of the runtime.
My own profile on Nuxters. https://nuxters.nuxt.com/Sandros94

Top 52 contributor, with 265 points. 25 issues; 201 comments; 21 merged PRs, 168 reactions.
130
Sandro Circi @sandros94.com · 16/11/2024
I became a 😸!
my personal insights at https://jyc.dev/at/sandros94.com

The Curious Cat Conversationalist
Poking your whiskers into every interesting conversation you find. Your strength lies in pure dialogue, weaving words into meaningful exchanges.
120
Sandro Circi @sandros94.com · 15/11/2024
The Social Butterfly Conversationalist on 🦋 #14,658,313 (I like it, it includes a few of my favorite numbers) 📎 jyc.dev/at/sandros94...
Sandro's insights:

@sandros94.com
#14,658,313
11/4/2024

bio:
Picture after picture is how the story is told.
Formally a photographer, insanely curious and passioned optimizer.

💾 github.com/sandros94

Contributor and moderator of the italian community for:
ui.nuxt.com • nuxt.com • nitro.build

Insights (Rolling 28 days):
The Social Butterfly Conversationalist 🦋
You're fluttering from conversation to conversation, pollinating discussions with your replies. Your strength lies in pure dialogue, weaving words into meaningful exchanges.
010
Sandro Circi @sandros94.com · 14/11/2024
one question that popped up frequently during @nuxtnation.com was: "when is #Nuxt 4 going to be released? Is is a big migration?" or "how can I test Nuxt 4 breaking changes?" You can already do so just by changing its `future.compatibilityVersion` to `4` and update your folder structure!
// nuxt.config.ts
export default defineNuxtConfig({
  future: {
    compatibilityVersion: 4,
  }
})Nuxt 4 folder structure:
```
app/
  assets/
  components/
  composables/
  layouts/
  middleware/
  pages/
  plugins/
  utils/
  app.config.ts
  app.vue
  router.options.ts
layers/
modules/
public/
server/
  api/
  middleware/
  plugins/
  routes/
  utils/
nuxt.config.ts
```
210
Sandro Circi @sandros94.com · 12/11/2024
@thealexlichter.com are you going to keep the 10k balloons till you reach 20k? 🤣 www.youtube.com/@TheAlexLich...
360
Sandro Circi @sandros94.com · 11/11/2024
While for reading QRCodes (or most barcodes) you have various options, such as capturing a live feed from a camera, a single picture or file drop.
020
Sandro Circi @sandros94.com · 11/11/2024
Creating a QRCode is as simple as: ```vue <template> <div> <Qrcode value="My string to encode" variant="pixelated" /> </div> </template> ```
110
Sandro Circi @sandros94.com · 11/11/2024
Finally some deserved rest after merge+release!
020
Sandro Circi @sandros94.com · 10/11/2024
Quick! Reply with your personal PR reviewer 😸 @patak.dev @danielroe.dev @pi0.io
Gwen standing in front of my monitors. She always helps me review my PRs before merge 😸
4190
Sandro Circi @sandros94.com · 06/11/2024
Fixed your screenshot
020