Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
1dcb187
feat(Backend): allow custom connection IDs and drop confusable charac…
xinshoutw Aug 12, 2026
a701745
feat(Backend): publish sessions to a live public lobby
xinshoutw Aug 12, 2026
b9bc6c3
feat(Frontend): wire the API client to the new session endpoints
xinshoutw Aug 12, 2026
59c437e
feat(Frontend): add custom IDs, a remembered name and the public lobby
xinshoutw Aug 12, 2026
ab4cadd
feat(Frontend): add a visibility lock beside the QR button
xinshoutw Aug 12, 2026
c47f136
feat(Frontend): upload files dropped anywhere on the session page
xinshoutw Aug 12, 2026
38c2882
feat(Frontend): show thumbnails for uploaded images
xinshoutw Aug 12, 2026
2418e79
fix(Frontend): return to the dashboard silently when a connection dies
xinshoutw Aug 12, 2026
a3a3905
fix(Frontend): only leave a session when the server rejects it
xinshoutw Aug 12, 2026
292d2d2
test(Backend): cover live lobby pushes over the WebSocket
xinshoutw Aug 12, 2026
e7bed84
fix(Frontend): keep the lobby list from breaking the entry page
xinshoutw Aug 12, 2026
b140c49
fix(Frontend): correct two defects found while driving the UI
xinshoutw Aug 12, 2026
4402d47
refactor(Backend): label lobby rooms with the creator's name
xinshoutw Aug 12, 2026
9d7ce26
chore: bump version to 2.1.0 and document the new features
xinshoutw Aug 12, 2026
3f1c2b9
feat(Backend): restrict confusable characters to generated IDs only
xinshoutw Aug 12, 2026
29a1696
feat(Frontend): rework the entry form and trim the lobby row
xinshoutw Aug 12, 2026
8667461
feat(Frontend): make the connection ID field lock out the IME
xinshoutw Aug 12, 2026
13c2d0e
docs: correct the connection ID rules in both READMEs
xinshoutw Aug 12, 2026
47fba2f
docs: clear the known bug about destroy not returning home
xinshoutw Aug 12, 2026
e09e19c
chore: sync uv.lock with the 2.1.0 version bump
xinshoutw Aug 12, 2026
853f4b5
fix(Frontend): opt the connection ID field out of more password managers
xinshoutw Aug 12, 2026
8607ecd
fix(Backend): stop the WebSocket keepalive from refreshing session id…
xinshoutw Aug 12, 2026
6530889
feat(Frontend): make the URL the source of truth for the open connection
xinshoutw Aug 12, 2026
7370605
fix(Backend): let the publication die with the host who granted it
xinshoutw Aug 12, 2026
8f1eafc
fix(Backend): stamp lobby times, reserve the lobby route, tidy names
xinshoutw Aug 12, 2026
d9d34a7
fix(Frontend): act on the server's verdict, and let go of the drop ov…
xinshoutw Aug 12, 2026
206f439
fix(Frontend): load image previews only when they come into view
xinshoutw Aug 12, 2026
42014b0
fix(Nginx): give the public lobby its own connection budget
xinshoutw Aug 12, 2026
6c291c8
fix(Frontend): keep the stored session reachable and named
xinshoutw Aug 12, 2026
17a8279
feat(Frontend): animate the moments the page changes shape
xinshoutw Aug 12, 2026
1c48378
feat(Frontend): let a paste land where a drop would
xinshoutw Aug 12, 2026
e9d7d91
chore: update devDependencies and dependencies to latest versions
SamWang8891 Jul 23, 2026
286ee60
fix(Frontend): pin eslint to 9 so the image builds again
xinshoutw Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# Clippy

<img src="https://img.shields.io/badge/Version-v2.0.1-green">
<img src="https://img.shields.io/badge/Version-v2.1.0-green">

A web-based application that allows users to share text and files in real-time through secure, encrypted sessions.

Expand Down Expand Up @@ -33,21 +33,23 @@ A web-based application that allows users to share text and files in real-time t

Tired of sharing text / files across different computers? Try this clippy!

- **Session-based sharing**: Create or join sessions using short, custom-length IDs
- **Session-based sharing**: Create or join sessions using short, custom-length IDs. Server-minted IDs leave out `i`, `o`, `e`, `0` and `1`, so an ID survives being read aloud or copied by eye; name your own and any of `a-z0-9` is fair game. The ID field is a password input so the OS drops out of a Chinese IME on focus — the value stays visible
- **Public Clippys**: Hosts can unlock a session with the padlock beside the QR code to list it on the entry page. The five newest published sessions appear there with name, ID, creation time and last update, and they appear and disappear live over a WebSocket. Everything is private until someone deliberately unlocks it
- **Encrypted payloads**: Each session uses a 256-bit AES-GCM key derived client-side from the connection ID (SHA-256 KDF). All block content is encrypted before it leaves the browser, so the backend only ever sees ciphertext. The server issues the ID and could derive the key too — this is encrypted-at-rest and on-the-wire, not strict end-to-end against a malicious server
- **Real-time collaboration**: See blocks appear instantly when other users create them
- **File uploads**: Support for small file uploads
- **File uploads**: Support for small file uploads. Drop one or several files anywhere on the session page and they upload straight away — no need to open the composer first
- **Image previews**: Uploaded images are decrypted in the browser and shown as thumbnails
- **Curl upload**: Upload text or files from the terminal — host can enable/disable per session
```bash
curl -d 'hello' https://your-host/u/SESSION_ID
curl -F f=@file.txt https://your-host/u/SESSION_ID
```
- **Raw links**: Generate public short links to share decrypted text or files with anyone (e.g. `https://your-host/r/SESSION_ID/CODE`)
- **User management**:
- Custom or random user names
- Custom or random user names, remembered in local storage between visits
- Host can transfer host rights to other users
- Host can control whether new users can join
- **Session persistence**: Sessions remain active until destroyed by host or after 1 hour of inactivity
- **Session persistence**: Sessions remain active until destroyed by host or after 1 hour of inactivity. When one expires or is destroyed, the tab returns to the dashboard on its own instead of stopping at a warning
- **Block system**: Add and delete text or file blocks, similar to Jupyter notebooks

---
Expand Down Expand Up @@ -129,7 +131,7 @@ docker run -p 8080:80 --env-file backend/.env clippy

### Known Bugs 🐛

- Destroying the session might not directly take you back to homepage.
- None right now.

---

Expand Down
14 changes: 8 additions & 6 deletions README.zh-TW.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# Clippy

<img src="https://img.shields.io/badge/Version-v2.0.1-green">
<img src="https://img.shields.io/badge/Version-v2.1.0-green">

一個讓使用者能透過安全、加密的的方式,即時分享文字與檔案的網頁應用程式。

Expand Down Expand Up @@ -33,21 +33,23 @@

厭倦了在不同電腦間傳輸文字或檔案嗎?試試這個剪貼工具!

- **基於連線階段 (Session) 的分享**:使用克制化長度的 ID 建立/加入連線。
- **基於連線階段 (Session) 的分享**:使用克制化長度的 ID 建立/加入連線,可自行指定 ID 或交由伺服器產生。伺服器自動產生的 ID 不會出現 `i`、`o`、`e`、`0`、`1`,避免唸出來或用眼睛抄寫時認錯;自行指定則 `a-z0-9` 皆可使用。ID 欄位為密碼輸入框,讓作業系統在聚焦時自動切離中文輸入法,但輸入內容仍然可見。
- **公開 Clippy**:主持人可按下 QR Code 旁的鎖頭,把連線列在首頁上。首頁會顯示最新的 5 個公開連線,包含名稱、ID、建立時間與最後更新時間,並透過 WebSocket 即時顯示與隱藏。未經主持人解鎖前一律為私人連線。
- **加密傳輸**:每個連線階段使用一把由連線 ID 透過 SHA-256 衍生的 256 位元 AES-GCM 金鑰,所有文字與檔案在離開瀏覽器前皆會在用戶端加密;伺服器僅儲存密文(伺服器同時持有 ID,因此並非嚴格的端對端加密)。
- **即時協作**:當其他使用者建立區塊時,您能立即看到它們出現。
- **檔案上傳**:支援小檔案上傳。
- **檔案上傳**:支援小檔案上傳。也可以直接把一個或多個檔案拖曳到連線頁面的任一處,不必先開啟新增區塊就會自動上傳。
- **圖片預覽**:上傳的圖片會在瀏覽器中解密並顯示縮圖。
- **Curl 上傳**:透過終端機上傳文字或檔案,主持人可針對每個連線啟用/停用此功能。
```bash
curl -d 'hello' https://your-host/u/SESSION_ID
curl -F f=@file.txt https://your-host/u/SESSION_ID
```
- **Raw 連結**:產生公開短連結,與任何人分享解密後的文字或檔案(例如 `https://your-host/r/SESSION_ID/CODE`)
- **使用者管理**:
- 自訂或隨機使用者名稱
- 自訂或隨機使用者名稱,名稱會記錄在 local storage 中並於下次沿用
- 主持人 (Host) 可轉移權限給其他使用者
- 主持人可控制是否允許新使用者加入
- **連線持久性**:連線將保持啟用,直到主持人銷毀或閒置 1 小時後自動結束。
- **連線持久性**:連線將保持啟用,直到主持人銷毀或閒置 1 小時後自動結束。連線過期或被銷毀時,頁面會直接返回首頁,不再停在警告視窗上。
- **區塊系統**:新增與刪除文字或檔案區塊,操作方式類似 Jupyter notebooks。

---
Expand Down Expand Up @@ -129,7 +131,7 @@ docker run -p 8080:80 --env-file backend/.env clippy

### 已知的bug 🐛

- 銷毀連線階段後,可能無法直接導回首頁
- 目前沒有

---

Expand Down
Loading
Loading