Dates that just work.

Built for AI. Built for humans. Own your code.

Stop fighting timezones. Stop memorizing format tokens. Pull only the functions you need directly into your codebase.

AI-OptimizedServer/Client SyncZero DepsOwn Your Code

Size up your dates.

Like Tailwind for dates — simple properties, consistent output. No format strings to remember.

whenny(date).xs       // "2/6"
whenny(date).sm       // "Feb 6"
whenny(date).md       // "Feb 6, 2026"
whenny(date).lg       // "February 6th, 2026"
whenny(date).xl       // "Friday, February 6th, 2026"

whenny(date).clock    // "7:03 AM"
whenny(date).sortable // "2026-02-06"
.xs

2/6

.sm

Feb 6

.md

Feb 6, 2026

.lg

February 6th, 2026

Why Whenny?

AI-First Design

Clean, predictable API optimized for AI code generation. Every function does one thing well.

Own Your Code

shadcn-style install. Pull functions directly into your codebase. No dependency lock-in.

Server/Client Sync

Transfer Protocol preserves timezone context. One point in time, displayed correctly everywhere.

Size-Based Styles

Format dates like sizing — .xs .sm .md .lg .xl. Consistent output, zero thinking.

Smart Defaults

Context-aware formatting. 'just now', '5 min ago', 'Yesterday at 3pm' - automatic.

MCP Server

Expose all functions to AI assistants. Let AI pick the right date utilities for you.

Dead Simple API

Every function is predictable. Every output is useful.

Smart Formatting

whenny(date).smart()
nowjust now
5m ago5 minutes ago
yesterdayYesterday at 3:45 PM

Duration

duration(seconds)
36611h 1m 1s
.timer()01:01:01
.human()about 1 hour

Business Days

calendar.addBusinessDays(date, 5)
Mon + 5Next Monday
isBusinessDaytrue/false
nextBusinessDayNext working day

React Hooks

LIVE
useRelativeTime(date)
auto-updates
useCountdown3d 5h 30m 15s

Pull only what you need.

Like shadcn/ui - copy code directly into your project. Full ownership, full control.

# Initialize whenny in your project

# Add only the modules you need

# Or grab everything

Click any module to copy its install command:

Server and client, finally in sync.

The Transfer Protocol carries timezone context across the wire. Store UTC, display local. Automatically.

Server
// Store UTC, preserve origin
const payload = createTransfer(date, {
  timezone: 'America/New_York'
})
// { iso, originZone, originOffset }
Client
// Display in user's local time
const event = fromTransfer(payload)
whenny(event.date).smart()
// "3:00 PM" (auto-converted)

Ready to simplify dates?

Start with the CLI or install the package. Your choice.