Marcus V.
Curving abstract shapes with an orange and blue gradient

RIFT: Building a Pixel-Glass Design System for File Transfer

Published

When Gaming Meets Productivity

File transfer tools are boring. WeTransfer, Dropbox, Google Drive — they all look the same. Clean, minimal, forgettable. When I set out to build RIFT, I wanted something different. Something that would make the mundane act of sending files feel meaningful.

The inspiration came from an unexpected place: Diablo. Not the gameplay, but the interface. Those dithered gradients, the squared elements, the sense of weight and permanence. What if a productivity tool felt like equipping legendary gear?

RIFT screenshot 1 - Replace with actual screenshot

RIFT isn't just a file transfer platform — it's an experiment in bringing gaming aesthetics to everyday software. And it turns out, that experiment taught me more about design than I expected.

The Pixel-Glass Aesthetic

The core visual language of RIFT is what I call 'pixel-glass' — a combination of dithered textures, sharp edges, and translucent surfaces. No border-radius anywhere. Every element has presence and weight.

css
/* The core design tokens - squared everything */
:root {
  --radius: 0;
  --border-width: 1px;

  /* Dithered gradient via CSS pattern */
  --gradient-dither: repeating-linear-gradient(
    0deg,
    transparent,
    transparent 2px,
    rgba(255,255,255,0.03) 2px,
    rgba(255,255,255,0.03) 4px
  );
}

.card {
  border-radius: var(--radius);
  background: linear-gradient(180deg, #1a1a2e 0%, #0f0f1a 100%);
  background-blend-mode: overlay;
}

The dithered gradients were the hardest part to get right. Most gradient implementations in CSS are smooth, but that smoothness is exactly what I didn't want. I experimented with SVG filters, canvas rendering, and CSS patterns before landing on a combination that performed well while maintaining the aesthetic.

RIFT screenshot 2 - Replace with actual screenshot

Design constraint: No border-radius. Squared corners only. This single rule defined the entire design language.

Gaming Terminology as UX

File transfers become 'Rifts' — dimensional portals through which data travels. Files are 'Shards' because nothing in gaming is ever just a file. Creating a transfer is 'Channeling a Rift.' Downloading is 'Looting.' Previewing files is 'Identifying Items.'

typescript
// Gaming terminology mapping
const terminology = {
  'create-transfer': 'Channel Rift',
  'upload-file': 'Imbue Shard',
  'finalize': 'Seal Rift',
  'access-link': 'Traverse Rift',
  'download': 'Loot',
  'preview': 'Identify Item',
  'delete': 'Banish',
  'expire': 'Rift Collapse',
} as const

// Used throughout the UI
<Button onClick={createTransfer}>
  {t('channel-rift')} {/* "Rift öffnen" in German */}
</Button>

This isn't just flavor text. The terminology creates a consistent mental model. When you 'Channel a Rift,' you're doing something intentional, almost ritualistic. The upload progress bar becomes a channeling indicator. The completion state feels like an achievement.

RIFT screenshot 3 - Replace with actual screenshot

User Tiers as Character Classes

RIFT offers three tiers: Free, Pro, and Enterprise. But in the interface, these feel more like character classes than pricing plans. Each tier unlocks capabilities, visualized through progressively more elaborate UI treatments.

  • Free: Clean, functional UI - the "Wanderer" experience
  • Pro: Visual flourishes, particle effects, enhanced gradients - "Champion" tier
  • Enterprise: Full design system expression, admin controls - "Archon" level
RIFT screenshot 4 - Replace with actual screenshot

The tier upgrade flow is designed to feel like character progression. You're not buying features; you're ascending to a new level. The confirmation animation reinforces this — it's not a simple checkmark but a ritualistic reveal.

Security Features as Game Mechanics

Security isn't just a feature in RIFT — it's part of the narrative. Password protection becomes 'Warding the Rift.' Email whitelisting is 'Binding to worthy recipients.' Expiration is the 'Rift closing' as dimensional energy depletes.

typescript
// Security configuration with gaming terminology
interface RiftProtection {
  ward?: string              // password
  boundRecipients?: string[] // email whitelist
  dimensionalDecay: number   // expiration in days
  traversalLog: boolean      // download tracking
}

// UI presents this as mystical configuration
<ProtectionPanel>
  <WardInput placeholder="Set a ward phrase..." />
  <RecipientBinding emails={recipients} />
  <DecaySlider min={1} max={30} label="Dimensional stability" />
</ProtectionPanel>
RIFT screenshot 5 - Replace with actual screenshot

Download tracking provides 'Rift traversal logs' — who accessed what, when, and from where. This information is presented in a timeline format that feels like reviewing an adventure log rather than reading analytics.

Technical Foundation

Behind the aesthetic is serious engineering. Next.js 16 with Turbopack provides blazing fast development. Supabase handles authentication, database, and storage with chunked upload support for those 20GB files.

The chunked upload system was essential. Large files are split into manageable pieces, uploaded in parallel, and reassembled server-side. Progress indication shows both per-chunk and overall progress, with the gaming aesthetic turning upload into a satisfying visual experience.

Framer Motion powers the animations — from subtle hovers to dramatic state transitions. Every animation follows gaming conventions: quick attacks (fast in), lingering effects (ease out), and satisfying impacts (elastic easing on completion).

Lessons in Themed Design

Building RIFT taught me that theme isn't just decoration — it's structure. When you commit to a theme deeply enough, it starts making design decisions for you. Should this button be rounded or squared? The theme answers: squared. Should this loading indicator spin or pulse? The theme answers: it channels energy.

RIFT screenshot 6 - Replace with actual screenshot

Consistency is everything. Every element needs to feel like it belongs in the same world. This means developing a visual vocabulary and applying it ruthlessly. Elements that break the theme aren't just aesthetically wrong — they break immersion.

The most surprising discovery: themed interfaces can be more usable than generic ones. The gaming terminology creates a shared language between the interface and its users. Actions have names that stick. Users remember 'Channel a Rift' better than 'Create Transfer.'

Reception and Iteration

RIFT has found its audience among developers, gamers, and designers who appreciate the unconventional approach. The feedback has been validating — people send files through RIFT specifically because the experience is memorable.

The broader lesson: software doesn't have to look like software. It can look like anything that serves its users. For RIFT, looking like a game serves users who want file transfer to be less boring — and it turns out, there are more of those users than I expected.