Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
aradotso avatar

Flipoff Split Flap Display

  • 818 installs
  • 66 repo stars
  • Updated July 9, 2026
  • aradotso/trending-skills

flipoff-split-flap-display is a frontend skill that guides developers through building, customizing, and embedding the FlipOff split-flap airport display emulator on websites, dashboards, and TV browsers.

About

flipoff-split-flap-display is an expert agent skill for the FlipOff split-flap display emulator—a free, offline-capable web app that turns any browser or TV into a retro airport departure board. The skill covers embedding the emulator on landing pages and internal dashboards, customizing messages and quotes, adjusting grid size and colors, configuring sound and flip animations, and adding keyboard controls. Developers reach for flipoff-split-flap-display when they want a distinctive retro UI element without building split-flap physics, timing, and styling from scratch.

  • Pure vanilla HTML/CSS/JS — zero dependencies or build steps
  • Authentic mechanical scramble animations with clacking sound effects
  • Customizable messages, quotes, grid size, colors, and keyboard controls
  • Works offline and can turn any browser or TV into a full-screen flip board
  • Single-file index.html that opens instantly or runs via local Python server

Flipoff Split Flap Display by the numbers

  • 818 all-time installs (skills.sh)
  • +7 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #432 of 2,277 Frontend Development skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/aradotso/trending-skills --skill flipoff-split-flap-display

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs818
repo stars66
Security audit2 / 3 scanners passed
Last updatedJuly 9, 2026
Repositoryaradotso/trending-skills

How do you add a split-flap display to a website?

Quickly add a retro split-flap airport display to any website, landing page, or internal dashboard.

Who is it for?

Frontend developers who want a retro airport-style ticker on marketing pages, dashboards, or kiosk/TV displays without custom animation code.

Skip if: Projects that need a production data ticker fed by a real-time API backend rather than a self-contained browser emulator.

When should I use this skill?

The user asks to add a split-flap display, embed FlipOff, customize flip board colors or messages, or turn a TV into a retro departure board.

What you get

An embedded FlipOff split-flap board with customized messages, grid layout, colors, animations, and optional keyboard interaction.

  • Embedded split-flap display component
  • Customized flip-board styling and messages

Files

SKILL.mdMarkdownGitHub ↗

FlipOff Split-Flap Display Emulator

Skill by ara.so — Daily 2026 Skills collection.

FlipOff is a pure vanilla HTML/CSS/JS web app that emulates classic mechanical split-flap (flip-board) airport displays. No frameworks, no npm, no build step — open index.html and you have a full-screen retro display with authentic scramble animations and clacking sounds.

---

Installation

git clone https://github.com/magnum6actual/flipoff.git
cd flipoff

# Option 1: Open directly
open index.html

# Option 2: Serve locally (recommended for audio)
python3 -m http.server 8080
# Visit http://localhost:8080
Audio note: Browsers block autoplay. The user must click once to enable the Web Audio API context. After that, sound plays automatically on each message transition.

---

File Structure

flipoff/
  index.html               — Single-page app entry point
  css/
    reset.css              — CSS reset
    layout.css             — Header, hero, page layout
    board.css              — Board container and accent bars
    tile.css               — Tile styling and 3D flip animation
    responsive.css         — Media queries (mobile → 4K)
  js/
    main.js                — Entry point, wires everything together
    Board.js               — Grid manager, transition orchestration
    Tile.js                — Per-tile animation logic
    SoundEngine.js         — Web Audio API playback
    MessageRotator.js      — Auto-rotate timer
    KeyboardController.js  — Keyboard shortcut handling
    constants.js           — All configuration lives here
    flapAudio.js           — Base64-encoded audio data

---

Key Configuration — js/constants.js

Everything you'd want to change lives in one file:

// js/constants.js (representative structure)

export const GRID_COLS = 26;        // Characters per row
export const GRID_ROWS = 8;         // Number of rows

export const SCRAMBLE_DURATION = 600;  // ms each tile scrambles before settling
export const STAGGER_DELAY = 18;       // ms between each tile starting its scramble
export const AUTO_ROTATE_INTERVAL = 8000; // ms between auto-advancing messages

export const SCRAMBLE_COLORS = [
  '#FF6B35', '#F7C59F', '#EFEFD0',
  '#004E89', '#1A936F', '#C6E0F5'
];

export const ACCENT_COLORS = ['#FF6B35', '#004E89', '#1A936F'];

export const MESSAGES = [
  "HAVE A NICE DAY",
  "ALL FLIGHTS ON TIME",
  "WELCOME TO THE FUTURE",
  // Add your own here
];

---

Adding Custom Messages

Edit MESSAGES in js/constants.js. Each message is a plain string. The board wraps text across the grid automatically.

export const MESSAGES = [
  "DEPARTING GATE 7",
  "YOUR COFFEE IS READY",
  "BUILD THINGS THAT MATTER",
  "FLIGHT AA 404 NOT FOUND",    // max GRID_COLS * GRID_ROWS chars
];

Padding rules: Messages shorter than the grid are padded with spaces. Messages longer than the grid are truncated. Keep messages at or under GRID_COLS × GRID_ROWS characters.

---

Changing Grid Size

// Compact 16×4 ticker-style board
export const GRID_COLS = 16;
export const GRID_ROWS = 4;

// Wide cinema board
export const GRID_COLS = 40;
export const GRID_ROWS = 6;

// Tall info kiosk
export const GRID_COLS = 20;
export const GRID_ROWS = 12;

After changing grid dimensions, tiles re-render automatically on next page load.

---

Keyboard Shortcuts

KeyAction
Enter / SpaceNext message
Arrow LeftPrevious message
Arrow RightNext message
FToggle fullscreen
MToggle mute
EscapeExit fullscreen

---

Programmatic API

Board

// Board.js exposes a class you can instantiate directly
import Board from './js/Board.js';

const board = new Board(document.getElementById('board-container'));

// Display a specific string
board.setMessage('GATE CHANGE B12');

// Advance to next message in the rotation
board.next();

// Go back
board.previous();

MessageRotator

import MessageRotator from './js/MessageRotator.js';

const rotator = new MessageRotator(board, messages, AUTO_ROTATE_INTERVAL);

rotator.start();   // begin auto-advancing
rotator.stop();    // pause rotation
rotator.next();    // manual advance
rotator.previous(); // manual back

SoundEngine

import SoundEngine from './js/SoundEngine.js';

const sound = new SoundEngine();

// Must call after a user gesture (click/keypress)
await sound.init();

sound.play();    // play the flap transition sound
sound.mute();    // silence
sound.unmute();
sound.toggle();  // flip mute state

KeyboardController

import KeyboardController from './js/KeyboardController.js';

const kb = new KeyboardController({
  onNext:       () => rotator.next(),
  onPrevious:   () => rotator.previous(),
  onFullscreen: () => toggleFullscreen(),
  onMute:       () => sound.toggle(),
});

kb.attach();   // start listening
kb.detach();   // stop listening

---

Embedding FlipOff in Another Page

As an iframe

<iframe
  src="/flipoff/index.html"
  width="1280"
  height="400"
  style="border:none; background:#000;"
  allowfullscreen
></iframe>

Inline embed (pull in just the board)

<!-- In your page -->
<div id="flip-board"></div>

<script type="module">
  import Board from '/flipoff/js/Board.js';
  import SoundEngine from '/flipoff/js/SoundEngine.js';
  import { MESSAGES, AUTO_ROTATE_INTERVAL } from '/flipoff/js/constants.js';

  const board = new Board(document.getElementById('flip-board'));
  const sound = new SoundEngine();

  let idx = 0;
  board.setMessage(MESSAGES[idx]);

  document.addEventListener('click', async () => {
    await sound.init();
  }, { once: true });

  setInterval(() => {
    idx = (idx + 1) % MESSAGES.length;
    board.setMessage(MESSAGES[idx]);
    sound.play();
  }, AUTO_ROTATE_INTERVAL);
</script>

---

Custom Color Themes

// js/constants.js — dark blue terminal theme
export const SCRAMBLE_COLORS = [
  '#0D1B2A', '#1B2838', '#00FF41',
  '#003459', '#007EA7', '#00A8E8'
];

export const ACCENT_COLORS = ['#00FF41', '#007EA7', '#00A8E8'];
/* css/board.css — override tile background */
.tile {
  background-color: #0D1B2A;
  color: #00FF41;
  border-color: #003459;
}

---

Common Patterns

Show real-time data (e.g., a flight API)

import Board from './js/Board.js';
import SoundEngine from './js/SoundEngine.js';

const board = new Board(document.getElementById('board'));
const sound = new SoundEngine();

async function fetchAndDisplay() {
  const res = await fetch('/api/departures');
  const data = await res.json();
  const message = `${data.flight}  ${data.destination}  ${data.gate}`;
  board.setMessage(message.toUpperCase());
  sound.play();
}

document.addEventListener('click', () => sound.init(), { once: true });
setInterval(fetchAndDisplay, 30_000);
fetchAndDisplay();

Cycle through a custom message list

const promos = [
  "SALE ENDS SUNDAY",
  "FREE SHIPPING OVER $50",
  "NEW ARRIVALS THIS WEEK",
];

let i = 0;
setInterval(() => {
  board.setMessage(promos[i % promos.length]);
  sound.play();
  i++;
}, 5000);

React/Vue wrapper (import as a module)

// FlipBoard.jsx
import { useEffect, useRef } from 'react';
import Board from '../flipoff/js/Board.js';
import { MESSAGES } from '../flipoff/js/constants.js';

export default function FlipBoard({ messages = MESSAGES, interval = 8000 }) {
  const containerRef = useRef(null);
  const boardRef = useRef(null);

  useEffect(() => {
    boardRef.current = new Board(containerRef.current);
    let idx = 0;
    boardRef.current.setMessage(messages[idx]);

    const timer = setInterval(() => {
      idx = (idx + 1) % messages.length;
      boardRef.current.setMessage(messages[idx]);
    }, interval);

    return () => clearInterval(timer);
  }, []);

  return <div ref={containerRef} className="flip-board-container" />;
}

---

Troubleshooting

ProblemFix
No soundUser must click/interact first; Web Audio requires a user gesture
Sound works locally but not deployedEnsure flapAudio.js (base64) is served; check MIME types
Tiles don't animateVerify CSS tile.css is loaded; check for JS console errors
Grid overflows on small screensReduce GRID_COLS/GRID_ROWS in constants.js or add CSS overflow: hidden
Fullscreen not workingF key calls requestFullscreen() — some browsers require the page to be focused
Messages cut offString length exceeds GRID_COLS × GRID_ROWS; shorten or increase grid size
Audio blocked by CSPAdd media-src 'self' blob: data: to your Content-Security-Policy
CORS error loading modulesServe with a local server (python3 -m http.server), not file://

---

Tips for TV / Kiosk Deployment

# Serve with a simple static server
npx serve .              # Node
python3 -m http.server   # Python

# Auto-launch fullscreen in Chromium kiosk mode
chromium-browser --kiosk --app=http://localhost:8080

# Hide cursor after idle (add to index.html)
document.addEventListener('mousemove', () => {
  document.body.style.cursor = 'default';
  clearTimeout(window._cursorTimer);
  window._cursorTimer = setTimeout(() => {
    document.body.style.cursor = 'none';
  }, 3000);
});

Related skills

How it compares

Pick flipoff-split-flap-display when you want a ready-made retro board emulator to embed—not when building bespoke data-visualization charts.

FAQ

What is FlipOff split-flap display?

FlipOff is a free, offline-capable web emulator that renders a retro airport split-flap departure board in any browser or TV. The flipoff-split-flap-display skill teaches embedding and customizing that emulator on sites and dashboards.

Can FlipOff run without an internet connection?

FlipOff is described as offline-capable, so flipoff-split-flap-display supports deployments where the split-flap board runs locally in the browser without relying on continuous network access.

Is Flipoff Split Flap Display safe to install?

skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.