Made for your interface.
Snow follows the surface.
Give it a little nudge.
Turn ordinary interfaces into little winter landscapes. Snow that settles, follows your layout, and invites a moment of play.
Snow follows the surface.
Give it a little nudge.
Drag the handle to move the card. Brush an edge. Shift + drag to roll a snowball.
A LITTLE WINTER, IN YOUR STACK.
MORE THAN A FALLING EFFECT
Most snow stops at the screen. Fluri gives it a place in your interface — and lets your visitors become part of the forecast.
Snow gathers along supported cards, navigation bars, and buttons. Move the element; the snow comes along.
Brush a fresh edge, gather a snowball, or send a snowplough across a shelf. A small interaction can change the scene.
Choose from ten presets. Tune the wind, flakes, and snow depth, then export your configuration from the playground.
FOR THE SEASON. OR JUST THE FEELING.
A barely there dusting for a portfolio. A playful snowfall for a launch. A string of warm lights for the season. Start with a mood and make the details yours.
A FEW LINES TO THE FIRST FLAKE
A framework independent core. Typed configuration. An explicit lifecycle. Start the weather when your page is ready, and clean up when it leaves.
Build your first snowfallimport { createWeather } from '@themes/fluri';
const weather = createWeather({
preset: 'gentle-snow',
dom: { detection: 'explicit' },
});
weather.start();
// Release the effect when your page unmounts.
window.addEventListener('pagehide', () => {
weather.destroy();
}, { once: true });
import { useFluri } from '@themes/fluri-react';
export function WinterPage() {
const weather = useFluri({
preset: 'gentle-snow',
dom: { detection: 'explicit' },
});
return (
<article data-weather-surface>
<h1>A little winter.</h1>
<button onClick={() => weather.current?.pause()}>
Pause snow
</button>
</article>
);
}
<script setup lang="ts">
import { onMounted, onBeforeUnmount } from 'vue';
import { createWeather } from '@themes/fluri';
const weather = createWeather({ preset: 'gentle-snow' });
onMounted(() => weather.start());
onBeforeUnmount(() => weather.destroy());
</script>
<template>
<article data-weather-surface>A little winter.</article>
</template>
A GOOD GUEST ON YOUR WEBSITE
Pointer-transparent canvases preserve ordinary clicks and scrolling. Choose exactly which surfaces collect snow.
Reduced-motion preferences are respected, hidden tabs suspend animation, and visitors can pause the preview.
No weather API, geolocation, or engine telemetry. Pointer interaction is processed in browser memory.
The core uses browser APIs and works independently of your UI framework. Start it after the DOM mounts and destroy it during cleanup. The optional React adapter handles that lifecycle for you. The documentation includes TypeScript, React, and Vue examples.
The rendering overlay is pointer-transparent. Normal links, forms, and scrolling remain available. Use explicit surfaces and exclude important content with data-weather-ignore. Always test your own page and target devices.
Yes. Fluri uses the MIT license, which permits commercial use, modification, and redistribution while retaining its copyright and license notice. Read the full license for its conditions.
Adaptive quality bounds snowfall by visible area and device input class, responds to late frames, and reduces rendering cost under pressure. You can also set particle, surface, DPR, and FPS budgets. Performance depends on your device and page; there is no universal frame-rate guarantee.
Fluri is an interactive visual effect for websites. It simulates winter locally and does not fetch real weather or your location.
SMALL DETAILS. LASTING IMPRESSIONS.
Your website. Your forecast.