Doop
Doop: 오픈소스 멀티플레이어 디자인 캔버스 및 AI 에이전트용 MCP
브라우저에서 사이버펑크 스타일 채팅 스크린샷을 만들고 글리치 효과·맞춤 연락처·PNG 내보내기로 인게임 핸드아웃 제작에 활용합니다
Build cyberpunk-styled chat screenshots in your browser. Glitch FX, custom contacts, PNG export — perfect for Shadowrun / Cyberpunk RED / 2020 game masters making in-character handouts. 8 languages, n
디자인HTML · JavaScriptGitHub @CyberDelaai온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A tool to make a cyberpunk-like messenger dialogs
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A single-page web app for composing cyberpunk-styled dialog screenshots (netrunner UI vibe). No backend, no build step. Open index.html in any modern browser.
Inspired by Commlink-Thread.
FILE TRANSFERRED.contactId. Editing the contact propagates name/avatar to every linked message in the preview and PNG export. Clone-of-a-clone keeps the chain even without a contact. Visible // NO CONTACT badge in red on rows that aren't linked.EXAMPLE_* snapshots are seeded for every supported locale. Toggle to hide examples once you've found your own rhythm.commlink_dialog_<epoch-ms>.png.localStorage keeps state, contacts, snapshots, language, UI open-state. Images (bg + bgOriginal + body images + their *Original recrop sources) live in IndexedDB, content-addressed by SHA-256 so identical images dedupe automatically across messages and snapshots.Just open the file:
xdg-open index.html # Linux
open index.html # macOS
start index.html # Windows
No server needed — all dependencies are either inlined (fonts as base64) or loaded from CDN (augmented-ui, html-to-image, qrcode-generator).
If you'd rather use a local server:
python3 -m http.server
# then visit http://localhost:8000
.
├── index.html ← markup + inline JS, inlined @font-face base64 fonts
├── css/
│ ├── base.css ← root vars, layout, panels, fields, buttons, swatches, toast, lang select
│ ├── messages.css ← message editor rows + dialog frame + preview rendering + signal bars
│ ├── config.css ← snapshots panel + slot list
│ └── contacts.css ← collapsible sidebars (contacts / snapshots / donate) + contact editor
└── js/
├── i18n.js ← translation dictionary for all 8 supported locales
├── storage.js ← localStorage + IndexedDB image store
├── state.js ← defaultState, loadState/saveState, helpers, migrations
├── render.js ← renderPreview, renderMessagesEditor, syncForm
├── snapshots.js ← snapshot CRUD + bundled EXAMPLE_* seeding
├── contacts.js ← contact CRUD + inline edit
├── crop.js ← image crop modal (openCrop/doCrop + drag handlers)
├── png-export.js ← html-to-image PNG export
├── json-io.js ← state + contacts JSON export/import
└── effects.js ← tag-glitch animation + version-hover morph
index.html's <style id="font-face-inline"> block so html-to-image picks them up reliably without any cross-origin fetch (necessary for clean PNG export on file://). CJK glyphs fall back to system fonts (Hiragino / Yu Gothic / PingFang / Noto Sans CJK).foreignObject so the browser does the actual rendering (correctly handling clip-path, gradients, box-shadow). The glitch SVG filter is temporarily cloned into the captured tree so its url(#glitch-slices) reference resolves; the export captures .stage-wrap so the floating signal-bars sibling is included, then crops off the .stage-meta header.{var} interpolation; English fallback when a key is missing in another locale. Glitch animation reads the tag string fresh on each cycle so language changes apply on the next glitch.idb:<hash> ref; snapshots store the same ref → no copy on save. A reference-count GC runs after destructive ops (image clear, JSON import, snapshot delete) to remove orphaned blobs.localStorage because cookies don't work reliably on file:// URLs.APP_VERSION constant near the top of the script in index.html follows X.Y.Z:
The header tag shows the version after the locale-aware app name (e.g. DIALOG CONSTRUCTOR // v1.2.12). The tag occasionally glitches to DIALOG FORGER and back.
localStorage
commlink:state — current dialog (messages, choices, meta, accent, FX). Image fields are idb:<hash> refs.commlink:snapshots — { name: snapshot } map. Image fields are refs (same hash space as state).commlink:contacts — [ { id, name, avatar } ]. Avatars stay as base64 here (they're already 128×128 WEBP and small).commlink:bgOriginal — recrop source ref for the background.commlink:lang — current locale code.commlink:openPanel — currently open side panel (contacts / snapshots / '').commlink:seeded — version stamp so the bundled EXAMPLE_* snapshots refresh after a schema bump.commlink:showExamples — '1' / '0' for the SHOW EXAMPLES toggle in the snapshots panel.IndexedDB
commlink-images, store images: { key: sha256hex, value: Blob }. Used for bg, bgOriginal, and message body images (current + recrop source).If you find these tools useful, you can support development here: boosty.to/cyberdelaai/donate
MIT © 2026 CyberDelaai