TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
ShiftPane는 전화기나 태블릿을 정확히 같은 크기의 두 번째 모니터로 바꾸고, 옆에 실시간 위젯 보드를 제공합니다
ShiftPane turns a phone or tablet into a second monitor sized exactly to it, with a live widget board beside it. Documentation and the widget marketplace.
생산성TypeScript · MDXGitHub @kwiruu온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗The website for ShiftPane: its documentation, and the widget gallery people publish to and install from. The plan it follows is marketplace-plan.md.
It looks like the Dev Pane site on purpose: the same tokens, type, pills, definition cards and motion, described in apps/web/DESIGN.md.
| Plan milestone | State |
|---|---|
| W1, docs site | Landing page and 20 docs pages, written from the ShiftPane README and the plan. Pages about features the app doesn't have yet say so. |
| W2, read-only gallery | Gallery home, search, widget pages with live previews, author pages. The six first-party widgets in first-party/ are published through the API, which signs index.json and stores packages in Vercel Blob. |
| W3, uploads and review | GitHub sign-in, uploads with the automated checks, the author dashboard, the review queue with approve and reject, yanking, reports and takedowns, on the site and the API. |
| Deploy | Live: the site at shiftpane.vercel.app (Vercel project shiftpane, Blob store shiftpane-registry), the API on the Heroku app shiftpane-api with Postgres. See Deploying. |
Requirements: Node 22.12+ and pnpm 10 (corepack enable).
pnpm install
pnpm dev # the site on http://localhost:3000, the API on http://localhost:8787
The site shows the seed (apps/web/src/lib/registry/seed.ts) unless SHIFTPANE_API_ORIGIN is set.
To run it against the local API, publish the first-party widgets once, then start both:
pnpm --filter @shiftpane/api first-party # PGlite allows one process: run it with the API stopped
SHIFTPANE_API_ORIGIN=http://localhost:8787 pnpm dev
The API keeps its database (PGlite) and files under apps/api/.data; delete the folder to start over.
Trying it as different people. Run against the local API as above and the sign-in prompts offer
a local test account under the GitHub button: type any login and pick a role (author, reviewer or
admin). Upload as alice (the manifest's author has to be alice), sign out, sign in as keiru
with the admin role, approve it at /admin, then sign back in as alice to see it live on
/dashboard. GitHub sign-in works locally too once GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET
are set for the API, from an OAuth app whose callback is
http://localhost:3000/api/v1/auth/github/callback. Test accounts exist only while the API runs
outside production for a site on localhost.
| Command | What it does |
|---|---|
pnpm dev | The site and the API with reload |
pnpm build | Production builds: the site prerenders every page, the API bundles into apps/api/dist |
pnpm lint / pnpm format | Biome over the whole repo, without and with fixes |
pnpm typecheck | Route types, then tsc, in every package |
pnpm test | Vitest; the API's tests run the whole upload-to-index flow on PGlite |
pnpm --filter @shiftpane/db generate | A migration for each change to packages/db/src/schema.ts |
apps/
web/ Next.js 16 on Vercel: landing, docs, gallery, upload, dashboard, review
DESIGN.md The design system: tokens (YAML) and rules (prose)
src/app/ Routes
src/content/docs/ One .mdx file per docs page; the sidebar order is src/lib/docs.ts
src/components/
site/ Header, footer, cursor chip, code blocks, definition cards, docs navigation
home/ The landing page: hero devices, widget showcase, split view, spec cards
widgets/ The preview renderer: view.json + sample.json drawn like the phone
market/ Gallery tiles, search, permissions, source viewer, status badges
account/ Sign-in, the upload panel, the dashboard and the review pages
content/ Blocks the docs and READMEs render with
ui/ shadcn components, restyled to DESIGN.md
src/lib/api.ts The API from the browser: fetch helpers, the signed-in account, types
src/lib/registry/ The gallery (gallery.ts: the API, or the seed) and helpers over it
api/ Hono on Heroku: sign-in, uploads, checks, review, publishing the index
scripts/ build.ts bundles it; deploy.ts ships the bundle to Heroku
packages/
format/ The app's widget format (@shiftpane/widget-sdk), plus the gallery's checks and types
checks/ Opens an uploaded zip and runs the automated checks
index/ Builds and Ed25519-signs index.json and revoked.json; keys.ts has the public key
storage/ The registry's public files: the filesystem locally, Vercel Blob in production
db/ Drizzle schema and migrations; Postgres in production, PGlite locally
first-party/ The first-party widgets as package folders, and how the gallery shows them
vendor/shiftpane/ The app's widget-sdk, protocol, layout, board and icons, copied by pnpm sync:shiftpane
API (Heroku). One Basic dyno and Heroku Postgres Essential-0, $12 a month, covered by the Student Pack credit. Anything more is charged to the card on the account, so keep it to those two.
HEROKU_API_KEY=… HEROKU_APP=… pnpm --filter @shiftpane/api deploy:heroku
That bundles the API, uploads it with the migrations and first-party/ through Heroku's Build API,
and Heroku's release phase runs the migrations before the new version starts. After adding or
changing a first-party widget (raise its version), run node dist/publish-first-party.js on a
one-off dyno. To take a widget down without signing in to /admin, run
node dist/yank-widget.js <id> "<reason>" the same way: the app shows the reason to anyone who has it.
| Config var | What it is |
|---|---|
DATABASE_URL | Set by Heroku Postgres |
NODE_ENV | production |
SITE_ORIGIN | The site's origin. Sign-in returns there, and cookie-signed writes must come from it |
REGISTRY_URL | The site's origin + /registry: the base of every package URL in the index |
BLOB_READ_WRITE_TOKEN | The Vercel Blob store's read-write token |
SIGNING_KEY | The Ed25519 private key that signs the index. Its public half is packages/index/src/keys.ts |
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET | The GitHub OAuth app. Sign-in answers 503 until both are set |
ADMIN_LOGINS | GitHub logins that become admins when they sign in, comma-separated |
Site (Vercel). The project's root directory is apps/web.
| Environment variable | What it is |
|---|---|
NEXT_PUBLIC_SITE_URL | The site's address. Canonical URLs, the sitemap, robots.txt and the JSON-LD are built from it; on Vercel it falls back to the production URL |
SHIFTPANE_API_ORIGIN | The Heroku app's URL. The site reads the gallery from it and proxies /api/* to it |
SHIFTPANE_REGISTRY_ORIGIN | The Blob store's public URL. The site proxies /registry/* to it |
Before going public, read the privacy and content policy pages as the operator: they describe what the plan intends, and you're the one making those promises.