ShellRS
ShellRS is a free, open-source SSH client written in Rust: host management, terminals, WinSCP-style SFTP and port forwarding in one GPU-rendered window, for macOS, Windows and Linux.
Create and manage item packs, import and export CSV data
AI summary · website content
Developer toolsHTML · PLpgSQLGitHub @shararaxOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗ทุกการแก้ไขบันทึกลงฐานข้อมูล Supabase ทันที ทุกคนเห็นข้อมูลเดียวกันแบบสด ๆ เข้าใช้ด้วย ชื่อผู้ใช้ + รหัสผ่าน ที่ผู้ดูแลสร้างให้ (ไม่ใช้ Magic link) แพ็กหนึ่งแก้ได้ทีละคน คนแรกที่เปิดแพ็กจะถือสิทธิ์แก้ไว้ คนอื่นเห็นว่า “🔒 ชื่อ กำลังแก้แพ็กนี้อยู่” และดูได้อย่างเดียว จนกว่าคนแรกจะออกจากแพ็กนั้น
index.html หน้าเว็บ (ไฟล์เดียวกับ tosm-pack-builder.html + บรรทัดโหลด /config.js)
api/config.js ส่งค่าเชื่อมต่อ Supabase ให้หน้าเว็บ (/config.js)
api/admin-users.js สร้างบัญชี / รีเซ็ตรหัสผ่าน / เปลี่ยนสิทธิ์ (เฉพาะ admin)
supabase/schema.sql ตาราง + RLS + ระบบล็อกแพ็ก (รันครั้งเดียว รันซ้ำได้)
vercel.json, package.json
supabase/schema.sql → Runselect * from public.rls_audit(); → ต้องได้ 0 แถว
(ถ้ามีแถวขึ้น แปลว่ามีตารางที่ยังไม่เปิด RLS หรือเปิดให้ anon ใช้ได้)Supabase → Authentication → Sign In / Providers
[email protected] (ชื่อผู้ใช้ตามด้วย @tosm.local)update public.profiles set role = 'admin', active = true, display_name = 'SK' where username = 'sk';
คนต่อไปสร้างจากในเว็บได้เลย (ตั้งค่า → จัดการผู้ใช้)select value from private.app_config where key = 'app_client_key';
คัดลอกค่าที่ได้ไว้ใส่ใน Vercel ขั้นถัดไป
npx vercel ในโฟลเดอร์นี้)
Framework Preset: Other · ไม่ต้องมี Build command| ชื่อ | ค่า |
|---|---|
SUPABASE_URL | https://slmxqrjttummvgfhmfnd.supabase.co |
SUPABASE_PUBLISHABLE_KEY | sb_publishable_ksgczLdB9vYu6Q-QISTPkg_p40z-uER |
APP_CLIENT_KEY | ไม่ต้องใส่แล้ว (หน้าเว็บรับรหัสนี้จากฐานข้อมูลหลังล็อกอิน) |
SUPABASE_SERVICE_ROLE_KEY | Supabase → Project Settings → API Keys → Secret key (sb_secret_…) |
LOGIN_DOMAIN | ไม่ต้องใส่ (ค่าเริ่มต้น tosm.local) |
⚠ Secret key / service_role ใส่ที่ Vercel เท่านั้น ห้ามใส่ในหน้าเว็บ ห้ามส่งในแชท ห้าม commit ขึ้น GitHub ถ้าเผลอหลุด ให้กด Revoke/Roll ที่ Supabase แล้วใส่อันใหม่
sk และรหัสผ่านจากขั้นที่ 3สิทธิ์: ผู้ดูแล (ทุกอย่าง + จัดการผู้ใช้) · แก้ไขได้ · ดูอย่างเดียว ปิดบัญชี = เข้าสู่ระบบไม่ได้ทันที และปล่อยแพ็กที่เขาถืออยู่
| ชั้น | ป้องกันอะไร |
|---|---|
anon ไม่มีสิทธิ์ใด ๆ ในทุกตาราง | ใครถือแค่ publishable key แต่ไม่ได้ล็อกอิน อ่าน/เขียนอะไรไม่ได้เลย |
| RLS เปิดทุกตาราง | อ่านได้เฉพาะบัญชีที่เปิดใช้งาน · เขียนได้เฉพาะสิทธิ์ ผู้ดูแล/แก้ไขได้ |
Header x-app-client | การเขียนต้องส่งรหัส App Client มาด้วย สคริปต์ภายนอกที่เอา key ไปยิงตรงจะเขียนไม่ได้ |
ตาราง profiles, edit_locks, change_log | แก้จากหน้าเว็บตรง ๆ ไม่ได้ ต้องผ่านฟังก์ชันหรือ API ผู้ดูแล |
| Event trigger | ตารางใหม่ที่สร้างทีหลังจะถูกเปิด RLS อัตโนมัติ |
rls_audit() | ตรวจได้ทุกเมื่อ ต้องได้ 0 แถว |
change_log | บันทึกว่าใครสร้าง/แก้/ลบแพ็กและโฟลเดอร์ เมื่อไร |
หมายเหตุ: รหัส App Client อยู่ในหน้าเว็บ คนที่ล็อกอินแล้วเปิดดูโค้ดจะเห็นได้ จึงเป็นด่านเสริม ด่านหลักจริง ๆ คือ ต้องล็อกอิน + RLS ถ้าอยากเปลี่ยนรหัส:
update private.app_config set value = '…' where key = 'app_client_key';แล้วแก้APP_CLIENT_KEYใน Vercel ให้ตรงกัน
| ตาราง | เก็บอะไร |
|---|---|
profiles | ผู้ใช้: username, ชื่อที่แสดง, สิทธิ์, เปิด/ปิดใช้งาน |
folders | โฟลเดอร์โปรโมชัน: ชื่อ, สี, ลำดับแพ็ก |
packs | แพ็ก: ชื่อ, Fixed/Random, ราคา, Limit, วันเวลาขาย, Reset, หมวด Aztek, Type, โบนัส GSP/EXP, แนวคิด, รูป, ยอดขายจริง |
pack_items | ไอเทมในแพ็ก: Item ID, ชื่อ, จำนวน, TP, TP in-game, โอกาส %, ได้แน่นอน, ไอเทมนอกลิสต์, ลำดับ |
item_values | TP ที่จำไว้ต่อไอเทม (เติมให้อัตโนมัติครั้งต่อไป) |
app_settings | อัตรา TP→THB, Seed ต่อ THB, ชื่อหมวด Aztek |
edit_locks | ใครกำลังแก้แพ็กไหน หมดอายุเมื่อไร |
change_log | ประวัติการแก้ไข |
รายการไอเทม (คลังไอเทม) ยังโหลดจาก Google Sheet ผ่าน Apps Script URL เหมือนเดิม (ตั้งค่า → Apps Script URL)
แทนที่ index.html ด้วยไฟล์ใหม่ แล้ว push/redeploy · ถ้า schema.sql มีการแก้ ให้รันใน SQL Editor ซ้ำได้เลย (ข้อมูลเดิมไม่หาย)
มีแค่ supabaseUrl, publishable key และ loginDomain ใน /config.js ซึ่งจำเป็นสำหรับการล็อกอินเอง
และเปิดอะไรไม่ได้ถ้าไม่มีบัญชี (RLS ทุกตาราง, anon ไม่มีสิทธิ์ใด ๆ)
ส่วนนี้ส่งให้ หลังล็อกอินเท่านั้น ผ่าน public.client_config() (เฉพาะบัญชีที่เปิดใช้งาน):
private.app_config.app_client_key)private.app_config.items_api, รหัส items_key ถ้าตั้ง ACCESS_KEY ในสคริปต์)เปลี่ยน URL ของรายการไอเทม: update private.app_config set value = 'https://script.google.com/macros/s/…/exec' where key = 'items_api';
ตอนออกจากระบบ เบราว์เซอร์ไม่เก็บข้อมูลโฟลเดอร์หรือรายการไอเทมไว้