CrazyGLCrazyGLHomeExploreGitHubBrowse heroesLoading hero…← Back to gallery@crazygl/bad-handwriting

Bad Handwriting

A heading scribbled like a real human — wobbly per-letter rotation, baseline jitter, varied ink weight, with an underline scribbled in as the line lands.

ReactFont#handwriting#scribble#wobble#typography

Usage

import BadHandwriting from '@crazygl/hero-bad-handwriting';

export default function Hero() {
  return (
    <BadHandwriting
      heading="we ship like nobody is watching"
      subheading="(but everybody is)"
      wobbleAmount={8}
      textColor="#ffffff"
    />
  );
}

Customise

  • Contentheading, subheading.
  • WobblewobbleAmount (per-letter rotation), baselineJitter (vertical/horizontal offset), weightJitter (ink-weight variance), underline (toggle the scribbled underline).
  • TypographytextColor, fontSize, headingFontFamily (Google font, default Caveat), headingFontWeight (base weight).
  • BackdroptransparentBackground, bgColor, paperGrain overlay.

Best for

  • Playful, human brand voices and indie product landings.
  • Personal portfolios and blogs wanting a hand-drawn note feel.
  • Launch announcements or quote callouts that need warmth over polish.
01 · Install the package

One command, zero config.

npm install @crazygl/hero-bad-handwriting
02 · Render the component

Import once, drop it in.

The component takes the same props you see in the live customizer on the right — every default ships poster-quality.

hero.tsx
import BadHandwriting from '@crazygl/hero-bad-handwriting';

export default function Landing() {
  return (
    <BadHandwriting />
  );
}
03 · Use it in a page

SSR-safe by default.

The wrapper renders static HTML on the server and only initialises the canvas after hydration, so search engines see your copy.

page.tsx
// app/page.tsx — works in SSR-first frameworks (Next, Remix, Astro, etc.)
'use client';

import BadHandwriting from '@crazygl/hero-bad-handwriting';

export default function Page() {
  return (
    <section>
      <BadHandwriting
        heading="Say hi."
        subheading="Your new hero."
      />
      <article>
        <h2>Welcome</h2>
        <p>Your content keeps its own voice below the hero.</p>
      </article>
    </section>
  );
}
You might also like

Similar heroes

Animated Flow Text

Each word rides its own sine wave with a per-letter phase offset — the line reads like a banner caught in a slow current.

Gradient Text

Heading filled with a slowly drifting multi-stop linear gradient — three configurable colours, customizable angle, optional animation.

Text Reveal

Heading wiped in from a single direction via a hard clip-path mask, with a small per-letter delay — the foundational reveal everyone needs.

Rotate Text FX

Each letter rotates independently with offset phase. Trigger the rotation as a one-shot entrance on load, or let it spin forever.

Scroll Text FX

Each letter scales, rotates and brightens as it passes the scroll midpoint — an editorial mid-line emphasis effect.

Text Hover Reveal

Each item shows a default heading; on hover the heading scrolls up and a secondary line scrolls in from below — list-of-services interaction.
Live customizer

Bad Handwriting

Per-letter rotation (deg)8Baseline jitter (px)4pxWeight jitter200Underline scribbleInk colourFont size96pxFontBase weight500Transparent backgroundBackgroundPaper grain overlay
CrazyGL · crazygl.comProgrammable hero sections for real websites.