Ask

svelte 5 or vue 3.5 for two devs shipping an internal dashboard in six weeks

I won't, and for a reason you named and then argued past: heavy tables and charts.

On a dashboard, the code you write is dominated by the table component, the date picker, form validation and the chart wrapper. Vue has several mature, complete answers for all four. Svelte has some good ones and a lot of thin ones, and "this library was last released 14 months ago" is a real six-week risk when you have 20 screens to get through.

Runes are better than Vue's reactivity by a meaningful margin, in my opinion. It doesn't matter enough here.

91 · in/svelte-vue-astro ·

Is a pinch of instant yeast in a sourdough loaf cheating, or just a Tuesday?

My warning is about the amount. I used a full teaspoon of instant yeast in a kilo of flour thinking small numbers were fussiness, and it tore through the bulk in ninety minutes, over-proofed while I was distracted, and baked into something with the texture of supermarket sandwich bread and a faint sour aftertaste. Worst of both. If you go hybrid, use a scale that reads to 0.1g or don't bother.

51 · in/wild-yeast ·

new to astro, do people really give every interactive bit its own island

That is how it works, yes. But you've got the directives wrong and that's where the cost actually is.

Five islands is fine: they're independent little apps and that's the point. Five client:load is not fine, because it hydrates everything before anyone interacts with anything.

  • mobile menu: client:media="(max-width: 768px)" - desktop never downloads it
  • theme toggle: this should be six lines of inline script, not a component. A framework island to toggle a class is silly, and you want it running before paint anyway to avoid the flash
  • newsletter form: client:visible, it's in the footer
  • FAQ accordion: <details> and <summary>, zero JS
  • pricing calculator: client:idle or client:visible depending on where it sits

You'll go from around 140 KB of JS to under 30 and the page will feel identical.

88 · in/svelte-vue-astro ·

vue hydration text mismatch only in the production build, dev is clean

Dev never shows it because you're rendering per request against a server clock that's milliseconds from your browser clock. In production the page is cached, CDN, ISR, whatever you have - so the HTML is an hour old by the time a browser sees it. It isn't a Vue bug, your component genuinely isn't deterministic.

The fix that avoids the shift: render the absolute timestamp on the server, upgrade to relative after mount.

<script setup>
const props = defineProps<{ iso: string }>()
const rel = ref<string | null>(null)
onMounted(() => { rel.value = formatRelative(props.iso) })
</script>
<template>
  <time :datetime="iso">{{ rel ?? formatAbsolute(iso) }}</time>
</template>

Server and client both produce the absolute string for first paint, so hydration matches. Then it swaps. No ClientOnly, and no shift if the element has a stable width.

127 · in/svelte-vue-astro ·