Pixel-perfect skeleton loading screens, extracted from your real UI. No manual measurement, no hand-tuned placeholders. Works with React, Preact, Vue, Svelte 5, Angular, and React Native. import { Skeleton } from 'boneyard-js/react'
Pixel-perfect skeleton loading screens, extracted from your real UI. No manual measurement, no hand-tuned placeholders.
Works with React, Preact, Vue, Svelte 5, Angular, and React Native.
npm install boneyard-js
import { Skeleton } from 'boneyard-js/react'
function BlogPage() {
const { data, isLoading } = useFetch('/api/post')
return (
<Skeleton name="blog-card" loading={isLoading}>
{data && <BlogCard data={data} />}
</Skeleton>
)
}
<script setup>
import Skeleton from 'boneyard-js/vue'
import './bones/registry'
const loading = ref(true)
</script>
<template>
<Skeleton name="card" :loading="loading">
<Card />
</Skeleton>
</template>
<script>
import Skeleton from 'boneyard-js/svelte'
import '$lib/bones/registry'
let loading = true
</script>
<Skeleton name="card" {loading}>
<Card />
</Skeleton>
import { Skeleton } from 'boneyard-js/preact'
function BlogPage() {
const { data, isLoading } = useFetch('/api/post')
return (
<Skeleton name="blog-card" loading={isLoading}>
{data && <BlogCard data={data} />}
</Skeleton>
)
}
import { SkeletonComponent } from 'boneyard-js/angular'
@Component({
imports: [SkeletonComponent],
template: `
<boneyard-skeleton name="card" [loading]="isLoading">
<app-card />
</boneyard-skeleton>
`
})
import { Skeleton } from 'boneyard-js/native'
<Skeleton name="profile-card" loading={isLoading}>
<ProfileCard />
</Skeleton>
npx boneyard-js build --native --out ./bones
# Open your app on device — bones capture automatically
Dynamic Type: Generate bones at default font scale. Boneyard automatically scales bone positions at runtime to match the user's text size setting.
# CLI — works with any framework
npx boneyard-js build
# Watch mode — re-captures on HMR changes
npx boneyard-js build --watch
# React Native — scans from device
npx boneyard-js build --native
Then import the registry once in your app entry:
import './bones/registry'
For Vite-based projects (React, Preact, Vue, Svelte), use the plugin instead of the CLI — no second terminal needed:
// vite.config.ts
import { boneyardPlugin } from 'boneyard-js/vite'
export default defineConfig({
plugins: [boneyardPlugin()]
})
Bones are captured automatically when the dev server starts and re-captured on every HMR update.
Web: The CLI (or Vite plugin) opens a headless browser, visits your app, finds every <Skeleton name="...">, and snapshots their layout at multiple breakpoints.
React Native: The <Skeleton> component auto-scans in dev mode when the CLI is running. It walks the fiber tree, measures views via UIManager, and sends bone data to the CLI. Zero overhead in production.
All frameworks output the same .bones.json format — cross-platform compatible.
| Flag | Default | Description |
|------|---------|-------------|
| [url] | auto-detected | URL to visit |
| --breakpoints | 375,768,1280 | Viewport widths, comma-separated |
| --wait | 800 | ms to wait after page load |
| --out | ./src/bones | Output directory |
| --force | — | Skip incremental cache |
| --watch | — | Re-capture on HMR changes |
| --native | — | React Native device scanning |
| --no-scan | — | Skip filesystem route scanning |
| --cdp | — | Connect to existing Chrome via debug port |
| --env-file | — | Load env vars from file |
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| loading | boolean | — | Show skeleton or real content |
| name | string | — | Unique name (generates name.bones.json) |
| color | string | rgba(0,0,0,0.08) | Bone fill color |
| darkColor | string | rgba(255,255,255,0.06) | Bone color in dark mode |
| animate | 'pulse' | 'shimmer' | 'solid' | 'pulse' | Animation style |
| stagger | number | boolean | false | Stagger delay between bones in ms (true = 80ms) |
| transition | number | boolean | false | Fade out duration when loading ends (true = 300ms) |
| boneClass | string | — | CSS class applied to each bone element |
| fixture | ReactNode / Snippet / Slot | — | Mock content for CLI capture (dev only) |
| initialBones | ResponsiveBones | — | Pass bones directly (overrides registry) |
| fallback | ReactNode / Snippet / Slot | — | Shown when loading but no bones available |
{
"breakpoints": [375, 768, 1280],
"out": "./src/bones",
"wait": 800,
"color": "#e5e5e5",
"animate": "pulse"
}
Save as boneyard.config.json. Per-component props override config values.
| Import | Use |
|--------|-----|
| boneyard-js | snapshotBones, renderBones, computeLayout |
| boneyard-js/react | React <Skeleton> |
| boneyard-js/preact | Preact <Skeleton> (no compat needed) |
| boneyard-js/vue | Vue <Skeleton> |
| boneyard-js/svelte | Svelte <Skeleton> |
| boneyard-js/angular | Angular <boneyard-skeleton> |
| boneyard-js/native | React Native <Skeleton> |
| boneyard-js/vite | Vite plugin boneyardPlugin() |
MIT
Boneyard Shawl Tutorial
Stephen West · 309K views
Brandon's Cult Movie Reviews: THE BONEYARD
Brandon Tenold · 159K views
Parkway Drive Boneyards Guitar Lesson + Tutorial feat. @JamieSlays
Marty Music · 22K views
“Their doc linked at the bottom actually has a pretty nice example. https://boneyard.vercel.app/how-it-works”
“Boneyard files: Douglas A-3 Skywarrior – the atomic bomber that became a desert ghost - msn.com — msn.com”
“KC-135 Pulled Out of Boneyard Weeks After Another Crashed in Iraq - Air & Space Forces Magazine — Air & Space Forces Magazine”
“Boneyard Files: Douglas B-66 Destroyer – The Fragile Giant of the Tactical Air Command - Vintage Aviation News — Vintage Aviation News”
Web
Author: lewis <sudolewis@gmail.com> License: MIT 中文文档: README.zh-CN.md Press S on any deck to pop open a dedicated presenter window with four draggable, resizable magnetic cards: current slide, next slide preview, speaker script (逐字稿), and timer. Two windows stay in sync via BroadcastChannel. Why previews are pixel-perfect: each card is an that loads the same deck HTML with a ?preview=N query param. The runtime detects this and renders only slide N with no chrome — so the preview uses the same CSS, theme, fonts and viewport as the audience view. Colors and layout are guaranteed identical.
Web
The JavaScript / TypeScript SDK for building Astrid capsules. Companion to sdk-rust. Same WIT contract, same wasip2 Component Model output, same .capsule archive format — your kernel can't tell which language built the binary. Where the Rust SDK feels like writing against std, this one feels like writing against node:fs/promises / WHATWG / Node's EventEmitter. Same host ABI, idiom translated. [package] name = "my-capsule" version = "0.1.0"
Web
dontbesilent 商业诊断工具箱。从 12,307 条推文中提炼方法论,做成 21 个 Agent skill。 可在 Claude Code、Codex、Cursor、Trae Solo 等任意支持 skill / system prompt 的 Agent 上使用。 v2.14.1 更新:修复 /dbs-content-system 发布包缺少 scaffold/root/AGENTS.md、CLAUDE.md、SOURCEOFTRUTH.md 的问题。v2.14.0 新增了正式版内容结构化系统,本版本补齐初始化脚本依赖的根级脚手架文件。
Web
Try an idea, measure it, keep what works, discard what doesn't, repeat forever. An extension for pi — an AI coding agent that runs in your terminal. pi-autoresearch gives pi the tools and workflow to run autonomous optimization loops: try an idea, benchmark it, keep improvements, revert regressions, repeat. Inspired by karpathy/autoresearch. Works for any optimization target: test speed, bundle size, LLM training, build times, Lighthouse scores.