Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Pokemon card collection tracker for a group of collectors. Each person signs up, marks what they own, records condition, edition and price paid, and flags cards they want or will trade. Groups join through an invite link and get trade matches and a completion board. Anyone can share a read-only binder link.
Every English WotC-era set - 18 sets, 1,789 cards - grouped by era in the switcher:README 전문 보기 ↗Pokemon card collection tracker for a group of collectors. Each person signs up, marks what they own, records condition, edition and price paid, and flags cards they want or will trade. Groups join through an invite link and get trade matches and a completion board. Anyone can share a read-only binder link.
Every English WotC-era set - 18 sets, 1,789 cards - grouped by era in the switcher:
The card lists are hardcoded in index.html - no catalog API at runtime. The first seven sets were entered by hand; the other eleven were generated from the PokemonTCG/pokemon-tcg-data dataset in September 2026. Aquapolis and Skyridge print their holos as H1-H32; those are stored as numbers 151-182 so keys and sorting stay numeric, and keep the printed number in label.
To add a set: one card array, one SETS entry, and its id in ERAS.
Every card has two copies in img/<set>/, named by zero-padded card number: AVIF [quality 55] for browsers that support it and WebP [quality 80] as the fallback, served through a <picture> element. Both are 400px wide [Gym Heroes, Gym Challenge and Neo Genesis stay at their native 240px, never upscaled]. The AVIF set is 38.4MB against 62.5MB for WebP - 38% less, with no visible difference at card size.
Only the set on screen loads, and within it only the cards near the viewport. Opening the site on a phone pulls about 16 card images.
base/, jungle/, ...] as the source of truth. .vercelignore keeps them out of the deploy.images.pokemontcg.io/<set>/<number>_hires.png]. No originals are kept - that URL is the source.img/ folder: WebP quality=80, method=6, AVIF quality=55, speed=6.img/ with a one-year immutable cache [vercel.json], and the service worker caches viewed images the same way. If an image ever changes, write the new files under a new folder name and repoint imgPath - overwriting in place leaves browsers on the old copy for a year.Single static index.html - no build step. Supabase for auth and cloud sync. server.js is a small local dev server.
vendor/supabase-js-2.116.0.js [the UMD build from npm], loaded at the end of <body>. A new release can't reach the live app untested. To upgrade, download the new version under its own file name, change the <script> tag, and change LIBRARY in sw.js.sw.js makes the app work offline. The page is served from cache and refreshed in the background, so a deploy shows up on the open after next. Images and the library are cache-first, and only what someone has viewed is cached. Supabase requests are never cached - the app's own sync queue handles offline edits. Offline with an expired token, the app opens from the session stored on the device. To switch the worker off, deploy a sw.js that calls self.registration.unregister().preconnect hint in <head> opens the Supabase connection while the page loads.manifest.webmanifest and icons/ let phones add it to the home screen and open it full screen. The icon and favicon are Crystamber's own mark - a faceted amber gem drawn with Pillow - with no Pokemon branding. A fan-made disclaimer sits at the bottom of every page, shared binders included.node server.js
Serves on port 3000, including /?u= binder and /?join= invite links.
Email and password through Supabase Auth. The username is passed as signup metadata and a trigger on auth.users copies it into profiles. "Confirm email" must stay off in the Supabase dashboard - the built-in mailer only sends a few emails an hour, so a group signing up together would stall.
Schema lives in supabase/migrations/.
profiles - username, whether the binder is public, and my_sets [the sets they collect - null until they choose, which is when the app asks]. Usernames are readable by anyone so binder links resolve. The only columns a user can change are binder_public and my_sets.user_sets - one row per (user_id, set_id): owned, conditions, prices, card_editions, wants, for_trade. Owner-only RLS.groups, group_members - created only through the create_group and join_group functions.user_sets directly - get_binder and group_collections are security definer functions that never select the prices column.collection_sets is the old single-user table, kept as a frozen backup. The Supabase keepalive workflow still pings it.The Supabase URL and publishable key are inline in index.html. Publishable keys are client-side by design - RLS and the function grants are what protect the data.
One row per set, not one blob for everything. Editing Jungle writes the Jungle row and nothing else, so a failed or half-built write can't take the other sets down with it.
rev and updated_at are server-managed by a before update trigger, so the client can't forge them.localStorage keys are namespaced by user [u:<userId>:<key>], so two people on one phone never see each other's cards.crystamberRevs_v1. On load it adopts a cloud row only when cloud.rev > seen.rev. Equal rev means this device wrote the current state, so it leaves it alone.Hosted on Vercel as the crystamber project. .vercelignore keeps server.js, collection.json, the migrations and the original scans out of the deploy. .vercel/ is gitignored, so run vercel link to reconnect a fresh clone.
vercel.json sets the cache headers: img/ and vendor/ are immutable for a year, and sw.js is no-cache so a new worker is picked up on the next visit.