desigma
Rust로 만든 무료 Figma 대안
40개의 수학 패턴 생성기, 매개변수 조정·공식 확인·출력·음악 변환 가능, 무료 오픈소스
40 mathematical pattern generators. Tune every parameter, read the formula behind it, then print it or set it moving to music. Free and open source.
디자인TypeScript · JavaScriptGitHub @Jossifresben온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Turn mathematics into art: 25 deterministic pattern generators, composed into print-ready posters or driven by audio. Pure SVG, in the browser.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗flowshape.art — turn mathematics into art.
Explore 40 pattern generators, read the maths that draws each one, and take the result out as a print-ready poster or as a visual that moves with your music.
Free, open source, no accounts, no backend. Everything runs in the browser.
v1.2.0 — a curated gallery. Hand-picked work at flowshape.art/#/gallery, in three tabs: designs, posters and recordings from the animated stage. Posters are live composer URLs rather than exported images, so they stay crisp at any size and open in the composer at that exact state. Videos play full length with sound, on click rather than on scroll.
v1.1.0 — keep and share. Save any design, poster or animation and find it again at #/saved — rename, delete, and export the collection as JSON to carry between browsers. A share control on every view hands over the link that reproduces exactly what you are looking at.
Both are built on the same idea as everything else here: a saved favourite is a URL, so nothing about the artwork is duplicated and nothing can drift out of date.
flowshape turns mathematics into art. Pick one of 40 deterministic pattern generators — a Voronoi mesh, a Truchet tiling, a flow field, an isometric voxel form — move every parameter it has, and watch the shape respond.
Then take it somewhere:
Two things make it more than a toy:
Each pattern in the playground has three views.
1 · The artwork. Live SVG, regenerated on every slider move, deterministic from the URL.
2 · Explain the math. Not a marketing gloss — the equation the code implements, in English and Spanish, with the primary source cited. Phyllotaxis, for example:
θₙ = n · α (α ≈ 137.50776°, the golden angle)
rₙ = s · n^p (p = 0.5 in Vogel's original model)
s = R / (N − 1)^p (R = maximum radius available in the frame)
Every point n is placed at angle n·α and radius rₙ = s·n^p. Because α is the golden angle — the turn that splits a full circle in the golden ratio — no finite number of points ever lands back on the same ray. That single fact is the whole trick: it is what keeps a sunflower head, or this pattern, filling in without ever leaving a visible seam or a repeating spoke.
— Source: Vogel, H. (1979) "A better way to construct the sunflower head", Mathematical Biosciences 44(3-4)
Then each parameter is annotated, including which ones are mathematics and which are only rendering choices — a distinction the app is explicit about, because conflating them is how people come away thinking they understand a formula they don't.
3 · Code. The real generator module, loaded lazily from source, not a rewritten teaching version. That same phyllotaxis document above corresponds to this, in full:
const maxR = Math.min(size.w, size.h) * 0.47;
const scale = maxR / Math.pow(points - 1, exp);
for (let n = 0; n < points; n++) {
const r = scale * Math.pow(n, exp);
const a = n * angleRad;
children.push(el('circle', {
cx: cx + r * Math.cos(a),
cy: cy + r * Math.sin(a),
r: p['dotMin']! + n * p['dotGrow']!,
fill: accent ? 'accent' : 'ink',
}));
}
Forty lines, no framework, no hidden library doing the interesting part. That is the point: the gap between the equation and the picture should be short enough to read in one sitting.
Every formula, explanation and citation in the catalogue is collected in docs/patterns.md — generated from the live registry and the same content the app serves, so it cannot drift.
Points & Meshes (7) — Phyllotaxis · Stipple Field · Delaunay Mesh · Voronoi Cells · Apollonian Circles · Möbius Flow · Node Garden
Curves (13) — Maurer Rose · Harmonograph · Times-Table Chords · Concentric Bands · Rose Lattice · Helix Ladder · Elliptic Billiard · Mystery Curve · Curlicue Fractal · Guilloché Rosette · Lissajous Knot · Hyperbolic Weave · Villarceau Ribbons
Fields (9) — Flow Field · Coulomb Field · Moiré Weave · Warped Fabric · Converging Chirp · Line Field · Interference · Contour Terraces · Whorl Bands
Tilings (6) — Truchet Arcs · Hitomezashi · Girih Stars · Ribbon Interlace · Bauhaus Tiles · Ring Scales
Isometric (4) — Voxel Form · Iso Weave · Nested Shafts · Tumbling Blocks
Growth (1) — Differential Growth
All 40, with the formula, explanation, parameters and citation for each, in docs/patterns.md. Sources run from Vogel and Descartes to Hankin, Truchet, Seaton, Jobard & Lefer, Quílez, Newell and Müller-Brockmann.
These are constraints, not accidents:
Math.random, no Date. All randomness derives from a seeded mulberry32 PRNG, split per subsystem so two random streams inside one pattern never interfere. Same URL ⇒ same SVG, always. The test suite snapshots every pattern's output to enforce it.ink / paper / accent tokens; the palette is resolved at render time. That is what lets any palette — ink on near-black, ink on paper white — apply to every pattern without touching a single generator.Export gives you the artwork. The composer gives you the sheet: the pattern set into a designed poster with a title block, its one-sentence description, a parameter table and a single accent mark.
It is not an editor. A layout is data, not code — a record naming one mode per region (artwork field, title block, data block, accent mark) plus a split point, margins and a legal aspect range. One renderer resolves any such record; a validator holds every compositional rule in one predicate. Adding a ninth layout is a record in src/compose/skeletons.ts and no other file, and nothing outside that file may branch on a layout's id.
Everything lands in the URL like the rest of the app, so a composed poster reproduces from its link.
Full design: docs/poster-composer.md.
Live.
Take a pattern you have tuned, feed it audio — a dropped file or the microphone — and it moves with the sound. The live screen is the product; movie export is a capture of the same pipeline.
bass, mid, high, level, bright (spectral centroid), flux — each auto-gained per band so a quiet voice memo modulates as fully as a mastered track, then smoothed by an envelope follower. Raw FFT frames never touch a parameter; the envelopes are what make motion musical instead of jittery.SvgNode tree to canvas2d, checked against the SVG output by a per-pattern pixel diff. The poster path stays pure SVG.MediaRecorder first, falling back to WebM on browsers that will not record H.264/AAC; a deterministic WebCodecs offline encoder — same audio + same URL ⇒ byte-identical MP4, faster than realtime — is the next phase.One rule bends here and only here: colour and gradients are permitted on the animated stage, with spectral centroid driving hue and level driving chroma in OKLCH, so silence decays back to monochrome. The poster path is untouched — flat colours, no gradients, monochrome by default. A moving screen and a printed sheet are different media.
Full design: docs/audio-visualizer.md.
npm install
npm run dev
| Command | What it does |
|---|---|
npm run dev | Vite dev server (localhost:5173) |
npm test | Full Vitest suite, including deterministic pattern snapshots |
npm run thumbs | Regenerate public/thumbs/*.svg gallery thumbnails |
npm run build | Type-check, rebuild thumbnails, bundle to dist/ |
npm run preview | Serve the production build locally |
No environment variables, no services, no API keys. npm run build output is a static folder — deployed here on Netlify.
Every pattern is covered by a shared test harness that checks determinism, snapshots the output, sweeps each parameter to its extremes hunting for NaN/Infinity, and enforces an element budget.
src/
core/ prng · url-state · svg builder · noise · geometry · oklch · persist · saved
patterns/ registry + one module per pattern (36) + presets, randomize
poster/ formats · palettes · export (SVG / PNG)
compose/ poster composer — units · colorways · regions · skeletons · variants · render
ui/ gallery · showcase · playground · poster · animate · saved · about
nav · footer · controls · modal · tabs · thumb · star · share · toast
i18n/ EN/ES tables: chrome strings, pattern names, parameter labels
content/ explain/<pattern>.<en|es>.md — formula, explanation, citation
blurbs.ts — the one-line EN/ES description each poster prints
showcase.ts — the curated gallery: designs, posters, videos
audio/ dsp · features · onsets (analysis layer for the animated stage)
workers/ off-thread generation for heavy patterns
scripts/ build-thumbs.ts (prebuild step)
tests/ Vitest — core, patterns (snapshotted), poster, compose, ui, audio, anim
docs/ architecture, patterns, URL schema, audio visualizer, specs and plans
flowshape was inspired by bookofshapes.com, which served as the reference and quality guide throughout: it set the craft standard this project aims at — hairline strokes, strict monochrome discipline, committed compositional registers, and real occlusion instead of alpha blending.
flowshape is an independent implementation. It shares no code with that site; the pattern set, the parameter UI, the bilingual maths explanations, the URL-as-state model and the poster export pipeline are its own.
Individual patterns cite their own mathematical sources inside src/content/explain/.
Jose "Jossi" Fresco Benaim — ORCID 0009-0000-2026-0836 · jossifresco.com
If you use flowshape in published work, see CITATION.cff.
MIT © 2026 Jose "Jossi" Fresco Benaim.
Posters you generate are yours — the licence covers this software, not your output.