From f92162b3bb2ead5f54eb62a964cc92c5d8e835b6 Mon Sep 17 00:00:00 2001 From: AAA <35992542+TNTcraftHIM@users.noreply.github.com> Date: Sat, 12 Sep 2026 22:09:12 +0800 Subject: [PATCH] feat: launch Piik with a unified interface and public website MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Piik now has one public presentation and a coordinated App/Server release path. This phase unifies the room UI, rewrites the bilingual README and guides, adds a static website with an inline product film, and prepares matching GitHub/Gitee packages and update links. The film uses the current homepage and shared product controls on one seekable timeline. Runtime fixes preserve presentation when the App opens a room, normalize Site origins, and keep capture and media-recovery status in the television indicator. New visits use Chinese for a Chinese system language and English otherwise; explicit language and visual-mode choices remain available. An optional site passphrase controls site entry, while room authorization remains enforced. GitHub is the release authority. Gitee mirrors verified packages and provides update metadata when GitHub is unavailable. Reviewed PR release notes become the GitHub Release description. The separate public demo uses P2P only, with HTTPS and STUN verified. Validation: 756 Web tests, TypeScript and production build; Go core tests, formatting, vet and available target builds; bounded Windows capture and App/Site interoperability; browser film checks, audible playback and narrow layouts; anonymous Gitee Windows-package download, checksum and launcher/update-link checks. Public demo acceptance covers authenticated WebSocket signaling, synthetic P2P video and room cleanup on one network. macOS/Linux physical capture and the wider device/network/endurance matrix remain explicitly deferred. Publication builds every package from the merged source SHA. The repository is public, main protection is active, and Pages is configured for piik.tv. CI/publisher and Pages deployment records own publication results. ## Release notes ### 中文 Piik 是免费开源的屏幕共享工具。开个房间,发出邀请,最多 20 位朋友就能用浏览器加入观看。 - 使用浏览器或 Piik App 分享游戏、窗口和整个屏幕。 - 优先建立直连;自托管站点可开启媒体转发作为备用线路。 - Piik App 支持本地房间、临时公网邀请和已有站点。 - Piik Server 内置网页界面、房间管理和连接服务,方便自行部署。 - 提供中英文界面与使用指南,以及 GitHub、Gitee 两条下载线路。 [官网](https://piik.tv) · [在线体验](https://demo.piik.tv) · [使用指南](https://github.com/TNTcraftHIM/Piik/blob/main/docs/guide/getting-started.zh-CN.md) · [自行部署](https://github.com/TNTcraftHIM/Piik/blob/main/docs/operations/self-hosting.zh-CN.md) · [Gitee 下载](https://gitee.com/TNTcraftHIM/Piik/releases) Windows App 和桌面浏览器是本次主要验证的平台。macOS 和 Linux 尚未经过实机测试,欢迎有设备的朋友测试并反馈。演示站和 App 公网邀请使用 P2P,受限网络下可能无法连接;自托管站点可开启媒体转发。 ### English Piik is free, open-source screen sharing for you and up to 20 viewers. Start a room, send an invitation, and your friends can join in a browser. - Share games, windows or a whole screen from your browser or Piik App. - Direct connections come first, with optional media forwarding on self-hosted sites. - Piik App supports local rooms, temporary public invitations and existing sites. - Piik Server includes the web interface, rooms and connection services for self-hosting. - English and Chinese interfaces and guides are available, with GitHub and Gitee downloads. [Website](https://piik.tv) · [Online demo](https://demo.piik.tv) · [User guide](https://github.com/TNTcraftHIM/Piik/blob/main/docs/guide/getting-started.md) · [Self-hosting](https://github.com/TNTcraftHIM/Piik/blob/main/docs/operations/self-hosting.md) · [Gitee downloads](https://gitee.com/TNTcraftHIM/Piik/releases) Windows App and desktop browsers are the primary validated paths. macOS and Linux have not yet been tested on physical devices; testing and feedback are welcome. The demo and App public invitations rely on P2P and may not connect on restrictive networks. Self-hosted sites can enable media forwarding. --- .env.example | 21 +- .gitattributes | 1 + .github/ISSUE_TEMPLATE/bug_report.md | 23 + .github/ISSUE_TEMPLATE/feature_request.md | 12 + .github/pull_request_template.md | 23 +- .github/workflows/repository-hygiene.yml | 96 +- .github/workflows/website.yml | 39 + AGENTS.md | 51 +- CLAUDE.md | 5 - CONTRIBUTING.md | 60 +- LICENSE.zh-CN.md | 22 - README.md | 166 ++-- README.zh-CN.md | 157 +-- cmd/piik-app/README.md | 52 +- cmd/piik-server/main.go | 50 +- cmd/piik-server/release.go | 332 ++++--- cmd/piik-server/release_test.go | 445 ++++----- deploy/check-release.sh | 8 +- ...ire.icu.conf.example => piik.conf.example} | 10 +- deploy/release-app.sh | 9 +- docs/README.md | 117 ++- docs/adr/0001-p2p-first-media-topology.md | 2 +- docs/adr/0009-optional-nat-prediction.md | 2 + docs/adr/0012-shared-go-backend-core.md | 17 +- docs/adr/0013-embedded-node-local-media.md | 1 + docs/assets/quickstart.svg | 63 ++ docs/assets/room-en-dark.png | Bin 0 -> 104025 bytes docs/assets/room-en-light.png | Bin 0 -> 103356 bytes docs/assets/room-zh-dark.png | Bin 0 -> 105046 bytes docs/assets/room-zh-light.png | Bin 0 -> 104394 bytes docs/deployment.md | 105 +- docs/design/media-status.md | 113 +++ docs/design/piik-brand.html | 239 ----- docs/design/public-introduction.md | 148 +++ docs/design/visual-language.md | 210 ++++ docs/guide/getting-started.md | 133 +++ docs/guide/getting-started.zh-CN.md | 122 +++ docs/maintenance.md | 131 ++- docs/operations/github.md | 94 ++ docs/operations/self-hosting.md | 269 ++---- docs/operations/self-hosting.zh-CN.md | 87 ++ docs/operations/service-management.md | 104 ++ docs/operations/website.md | 93 ++ docs/product/media-quality.md | 3 +- docs/product/presentation-lifecycle.md | 141 ++- docs/product/rooms-access.md | 9 +- docs/product/routing-transport.md | 7 +- docs/project-memory.md | 8 +- docs/reference/configuration.md | 61 +- docs/reference/engineering.md | 199 ++++ docs/reference/naming.md | 146 ++- docs/reference/versioning.md | 238 +++++ docs/research/agent-context-governance.md | 13 +- docs/research/backend-audit-1b01048.md | 106 -- .../research/cross-platform-client-runtime.md | 7 + docs/research/cross-restart-room-recovery.md | 4 +- docs/research/piik-rename-plan.md | 141 --- docs/research/server-consolidation.md | 5 +- docs/status.md | 45 +- docs/todo.md | 190 ++-- docs/verification-status.md | 28 +- go.mod | 1 + index.html | 16 +- internal/app/app.go | 14 +- internal/app/app_test.go | 55 ++ internal/app/config/config.go | 4 +- internal/app/config/config_test.go | 15 +- internal/app/console.go | 6 +- internal/app/console_test.go | 21 + internal/app/launcher/server.go | 5 +- internal/app/launcher/server_test.go | 33 +- internal/app/loopback/server_test.go | 2 +- internal/server/app/access.go | 16 +- internal/server/app/app.go | 12 +- internal/server/app/app_test.go | 50 +- internal/server/app/json.go | 9 +- internal/server/app/routes.go | 8 +- internal/server/app/static.go | 23 +- internal/server/config/config.go | 55 +- internal/server/config/config_test.go | 19 +- internal/server/config/ice.go | 12 +- internal/server/config/local.go | 20 +- internal/server/ordered/map.go | 13 +- internal/server/protocol/constants.go | 13 +- internal/server/protocol/contract_test.go | 27 + internal/server/protocol/server.go | 5 +- internal/server/protocol/types.go | 23 +- internal/server/room/doc.go | 100 +- internal/server/room/password.go | 3 +- internal/server/route/api.go | 29 +- internal/server/route/controller.go | 63 +- internal/server/route/debug.go | 28 +- internal/server/route/debug_test.go | 36 +- internal/server/route/doc.go | 15 +- internal/server/route/harness_test.go | 63 ++ internal/server/route/operation.go | 6 +- internal/server/signal/presence.go | 7 +- internal/server/signal/router.go | 18 +- internal/server/signal/router_pump.go | 1 - internal/server/signal/router_sfu.go | 1 - internal/server/signal/server.go | 42 +- internal/server/signal/server_test.go | 49 +- internal/server/signal/session.go | 15 +- package-lock.json | 121 ++- package.json | 9 +- scripts/access-privacy-gate.ts | 4 +- scripts/assemble-client.mjs | 12 +- scripts/build-website.mjs | 74 ++ scripts/check-docs.mjs | 15 - scripts/check-website-film.js | 501 ++++++++++ scripts/client-icons.mjs | 11 +- scripts/client-loopback-gate.ts | 17 +- scripts/client-package-targets.test.mjs | 25 - scripts/mirror-release.mjs | 105 ++ scripts/package-app-release.mjs | 9 +- scripts/package-client-candidate.mjs | 8 +- scripts/publish-release.mjs | 73 ++ scripts/release-artifacts.mjs | 49 + scripts/release-notes.mjs | 51 + scripts/release-version.mjs | 60 ++ scripts/required-project-paths.txt | 9 +- scripts/tsconfig.json | 39 + scripts/update-website-hero.mjs | 57 ++ site/assets/activities.js | 137 +++ site/assets/brand.css | 25 + site/assets/brand.js | 25 + site/assets/favicon.svg | 7 + site/assets/game.js | 69 ++ site/assets/games.js | 350 +++++++ site/assets/language.js | 22 + site/assets/living-room.svg | 258 +++++ site/assets/sketch.js | 65 ++ site/film/README.md | 114 +++ site/film/art.js | 597 ++++++++++++ site/film/assets/NOTICE.txt | 14 + site/film/assets/funkorama.mp3 | Bin 0 -> 1521938 bytes site/film/film.css | 109 +++ site/film/index.html | 75 ++ site/film/player.js | 250 +++++ site/film/score.js | 6 + site/film/ui/cursor.ts | 18 + site/film/ui/index.html | 12 + site/film/ui/main.tsx | 453 +++++++++ site/film/ui/ui.css | 30 + site/film/ui/website.ts | 47 + site/index.html | 903 ++++++++++++++++++ site/main.js | 127 +++ site/styles.css | 317 ++++++ src/client/App.tsx | 77 +- src/client/components/connection-details.ts | 21 - .../components/living/CaptureSourcePicker.tsx | 170 ++-- src/client/components/living/Comic.tsx | 517 +++++----- src/client/components/living/Couch.tsx | 176 ++-- src/client/components/living/Header.tsx | 40 +- src/client/components/living/HostMark.tsx | 36 + src/client/components/living/LauncherForm.tsx | 176 ++++ src/client/components/living/Metrics.tsx | 29 +- src/client/components/living/Pawn.tsx | 40 + src/client/components/living/PawnDetail.tsx | 69 +- .../components/living/PlaybackControls.tsx | 166 ++++ src/client/components/living/RoomChip.tsx | 20 +- src/client/components/living/RouteTree.tsx | 146 +-- src/client/components/living/Stage.tsx | 20 +- .../components/living/StatusIndicator.tsx | 31 + .../living/{ComicTooltip.tsx => Tooltip.tsx} | 174 ++-- .../components/living/ViewerOverview.tsx | 38 +- src/client/components/living/WelcomeLine.tsx | 62 ++ src/client/components/living/brand-mark.css | 170 ++++ .../components/living/comic-presentation.ts | 70 ++ .../components/living/hints/controls.tsx | 92 ++ src/client/components/living/hints/index.tsx | 93 +- .../components/living/hints/playback.tsx | 192 ++++ src/client/components/living/hints/set1.tsx | 91 +- src/client/components/living/hints/set2.tsx | 86 +- src/client/components/living/hints/set3.tsx | 130 +-- src/client/components/living/hints/set4.tsx | 227 ++--- .../components/living/participant-color.ts | 1 + .../components/living/participant-motion.ts | 41 + src/client/components/living/pawn.css | 22 + .../components/living/playback-controls.css | 46 + src/client/components/living/primitives.tsx | 72 +- .../components/living/status-indicator.css | 23 + .../living/use-picture-in-picture.ts | 66 ++ .../use-playback-controls-visibility.ts | 105 ++ src/client/lib/debug.ts | 3 + src/client/lib/display-name.ts | 2 +- src/client/lib/release-update.ts | 195 ++-- src/client/lib/session.ts | 28 + src/client/lib/use-element-width.ts | 20 + src/client/locales/en.ts | 77 +- src/client/locales/visual.ts | 3 + src/client/locales/zh.ts | 101 +- src/client/main.tsx | 3 - src/client/media/host-sfu-route.ts | 13 +- src/client/media/quality.ts | 29 +- src/client/media/viewer-audio.ts | 172 ++++ src/client/media/viewer-presentation.ts | 6 +- src/client/media/viewer-quality-evidence.ts | 3 + src/client/native/client.ts | 27 +- src/client/native/media-ingress.ts | 2 +- src/client/native/native-sender-peer.ts | 6 +- src/client/native/native-viewer-peer.ts | 2 +- src/client/native/wire.ts | 51 +- src/client/pages/AppLauncherPage.tsx | 247 ++--- src/client/pages/ControlsPreview.tsx | 150 +++ src/client/pages/HostPage.tsx | 525 ++++------ src/client/pages/JoinPage.tsx | 12 +- src/client/pages/OverlayPreviewPage.tsx | 8 +- src/client/pages/PeoplePreview.tsx | 102 ++ src/client/pages/PlaybackPreviewPage.tsx | 129 +++ src/client/pages/StatusPreviewPage.tsx | 193 ++++ src/client/pages/TooltipPreviewPage.tsx | 91 +- src/client/pages/ViewerPage.tsx | 370 ++----- src/client/pages/controls-preview.css | 38 + src/client/pages/host-page-notices.ts | 14 +- src/client/pages/status-preview-scenarios.ts | 131 +++ src/client/pages/status-preview.css | 84 ++ src/client/sfu/publisher.ts | 19 +- src/client/styles.css | 667 ++++--------- src/client/types.ts | 8 +- src/client/ui/animation.ts | 9 +- src/client/ui/copy.ts | 29 +- src/client/ui/icons.tsx | 31 +- src/client/ui/media-failure.ts | 46 + src/client/ui/media-status.ts | 198 ++++ src/client/ui/theme.ts | 18 +- src/client/ui/visual-kinds.ts | 106 ++ src/client/webrtc/host-peer.ts | 131 +-- src/client/webrtc/viewer-peer.ts | 17 +- src/shared/protocol.ts | 11 +- tsconfig.app.json => src/tsconfig.json | 4 +- tests/browser-debug.test.ts | 16 + tests/client-package-targets.test.ts | 38 + tests/client-state.test.ts | 48 +- tests/connection-details.test.ts | 37 - tests/copy.test.ts | 77 +- tests/fixtures/mirror-releases.json | 25 + tests/fixtures/wire-samples.json | 2 +- tests/host-page-notice.test.ts | 12 - tests/host-peer-tracks.test.ts | 119 +-- tests/host-quality-ownership.test.ts | 103 +- tests/media-failure.test.ts | 65 ++ tests/media-status.test.ts | 90 ++ tests/native-capture-selection.test.ts | 21 +- tests/native-client.test.ts | 99 +- tests/native-media-ingress.test.ts | 2 +- tests/participant-motion.test.ts | 23 + tests/protocol.test.ts | 20 + tests/publish-release.test.ts | 230 +++++ tests/quality.test.ts | 18 +- tests/release-automation.test.ts | 116 +++ tests/release-update.test.ts | 140 ++- tests/route-transition.test.ts | 37 + tests/route-tree.test.ts | 53 +- tests/theme.test.ts | 65 ++ tests/viewer-audio.test.ts | 186 ++++ tests/viewer-native-client-ownership.test.ts | 12 + tests/viewer-presentation.test.ts | 39 + tests/viewer-quality-evidence.test.ts | 21 + tsconfig.json | 4 +- tsconfig.tools.json | 34 - 261 files changed, 15305 insertions(+), 5328 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/website.yml delete mode 100644 CLAUDE.md delete mode 100644 LICENSE.zh-CN.md rename deploy/nginx/{share.bonfire.icu.conf.example => piik.conf.example} (88%) create mode 100644 docs/assets/quickstart.svg create mode 100644 docs/assets/room-en-dark.png create mode 100644 docs/assets/room-en-light.png create mode 100644 docs/assets/room-zh-dark.png create mode 100644 docs/assets/room-zh-light.png create mode 100644 docs/design/media-status.md delete mode 100644 docs/design/piik-brand.html create mode 100644 docs/design/public-introduction.md create mode 100644 docs/design/visual-language.md create mode 100644 docs/guide/getting-started.md create mode 100644 docs/guide/getting-started.zh-CN.md create mode 100644 docs/operations/github.md create mode 100644 docs/operations/self-hosting.zh-CN.md create mode 100644 docs/operations/service-management.md create mode 100644 docs/operations/website.md create mode 100644 docs/reference/engineering.md create mode 100644 docs/reference/versioning.md delete mode 100644 docs/research/backend-audit-1b01048.md delete mode 100644 docs/research/piik-rename-plan.md create mode 100644 scripts/build-website.mjs create mode 100644 scripts/check-website-film.js delete mode 100644 scripts/client-package-targets.test.mjs create mode 100644 scripts/mirror-release.mjs create mode 100644 scripts/publish-release.mjs create mode 100644 scripts/release-artifacts.mjs create mode 100644 scripts/release-notes.mjs create mode 100644 scripts/release-version.mjs create mode 100644 scripts/tsconfig.json create mode 100644 scripts/update-website-hero.mjs create mode 100644 site/assets/activities.js create mode 100644 site/assets/brand.css create mode 100644 site/assets/brand.js create mode 100644 site/assets/favicon.svg create mode 100644 site/assets/game.js create mode 100644 site/assets/games.js create mode 100644 site/assets/language.js create mode 100644 site/assets/living-room.svg create mode 100644 site/assets/sketch.js create mode 100644 site/film/README.md create mode 100644 site/film/art.js create mode 100644 site/film/assets/NOTICE.txt create mode 100644 site/film/assets/funkorama.mp3 create mode 100644 site/film/film.css create mode 100644 site/film/index.html create mode 100644 site/film/player.js create mode 100644 site/film/score.js create mode 100644 site/film/ui/cursor.ts create mode 100644 site/film/ui/index.html create mode 100644 site/film/ui/main.tsx create mode 100644 site/film/ui/ui.css create mode 100644 site/film/ui/website.ts create mode 100644 site/index.html create mode 100644 site/main.js create mode 100644 site/styles.css create mode 100644 src/client/components/living/HostMark.tsx create mode 100644 src/client/components/living/LauncherForm.tsx create mode 100644 src/client/components/living/Pawn.tsx create mode 100644 src/client/components/living/PlaybackControls.tsx create mode 100644 src/client/components/living/StatusIndicator.tsx rename src/client/components/living/{ComicTooltip.tsx => Tooltip.tsx} (65%) create mode 100644 src/client/components/living/WelcomeLine.tsx create mode 100644 src/client/components/living/brand-mark.css create mode 100644 src/client/components/living/comic-presentation.ts create mode 100644 src/client/components/living/hints/controls.tsx create mode 100644 src/client/components/living/hints/playback.tsx create mode 100644 src/client/components/living/participant-motion.ts create mode 100644 src/client/components/living/pawn.css create mode 100644 src/client/components/living/playback-controls.css create mode 100644 src/client/components/living/status-indicator.css create mode 100644 src/client/components/living/use-picture-in-picture.ts create mode 100644 src/client/components/living/use-playback-controls-visibility.ts create mode 100644 src/client/lib/use-element-width.ts create mode 100644 src/client/media/viewer-audio.ts create mode 100644 src/client/pages/ControlsPreview.tsx create mode 100644 src/client/pages/PeoplePreview.tsx create mode 100644 src/client/pages/PlaybackPreviewPage.tsx create mode 100644 src/client/pages/StatusPreviewPage.tsx create mode 100644 src/client/pages/controls-preview.css create mode 100644 src/client/pages/status-preview-scenarios.ts create mode 100644 src/client/pages/status-preview.css create mode 100644 src/client/ui/media-failure.ts create mode 100644 src/client/ui/media-status.ts create mode 100644 src/client/ui/visual-kinds.ts rename tsconfig.app.json => src/tsconfig.json (83%) create mode 100644 tests/client-package-targets.test.ts create mode 100644 tests/fixtures/mirror-releases.json create mode 100644 tests/media-failure.test.ts create mode 100644 tests/media-status.test.ts create mode 100644 tests/participant-motion.test.ts create mode 100644 tests/publish-release.test.ts create mode 100644 tests/release-automation.test.ts create mode 100644 tests/viewer-audio.test.ts delete mode 100644 tsconfig.tools.json diff --git a/.env.example b/.env.example index 8867ceb..3e7a5bc 100644 --- a/.env.example +++ b/.env.example @@ -6,8 +6,9 @@ PORT=8787 PUBLIC_BASE_URL=http://localhost:8787 # Include both the host browser origin and PUBLIC_BASE_URL when they differ. ALLOWED_ORIGINS=http://localhost:8787 -# Production-required site access secret. Local development/tests may leave it -# empty. A non-empty value must contain 8-128 visible ASCII bytes (0x21-0x7e). +# Optional site access password in every environment. Unset or empty allows +# entry without a site password; room ownership and invitations still apply. +# A non-empty value must contain 8-128 visible ASCII bytes (0x21-0x7e). SITE_ACCESS_PASSWORD= # Rooms persist in rooms.sqlite under the working directory by default (also # when blank). Set :memory: explicitly for process-memory rooms. Deployments @@ -23,7 +24,8 @@ ENDPOINT_MEDIA_COPY_CAPACITY=2 # PIIK_DEBUG=route # Optional in-process automatic SFU fallback. Set SFU_UDP_PORT=7882 to enable; -# unset or empty keeps it disabled. Local Client modes never create this listener. +# unset or empty disables it and fixes Privacy mode on for every room. +# STUN/signaling/P2P remain available. Local App modes never create this listener. # Ingress uses the 9000-room code capacity; egress uses that capacity times the # configured per-room Viewer admission. SFU_UDP_PORT= @@ -38,11 +40,12 @@ SFU_PUBLIC_IP= STUN_URLS= # Hosted STUN is in-process. With STUN_URLS configured, bind this IPv4 address # on UDP 3478 (also 3479/3480 below). It is independent of HTTP LISTEN_HOST. -# Local Client modes never create these listeners, even with public discovery. +# Local App modes never create these listeners, even with public discovery. STUN_LISTEN_HOST=0.0.0.0 -# Optional bounded NAT traversal support. When enabled, Hosts see a per-share -# switch that defaults on after all three local STUN listeners bind. Browser +# Optional bounded NAT traversal support. The per-share switch stays visible; +# it is locked off when disabled, and defaults on when enabled after all three +# local STUN listeners bind. Browser # P2P derives UDP 3479/3480 from the first STUN_URLS endpoint on UDP 3478. # Cloud security-group and host firewall rules must also allow these UDP ports. NAT_PREDICTION_ENABLED=false @@ -53,9 +56,11 @@ NAT_PREDICTION_ENABLED=false # PIIK_ENV=development # PORT=8788 -# Minimal production example (use independent untracked secrets): +# Production example (keep any chosen password in an untracked environment): # PIIK_ENV=production -# SITE_ACCESS_PASSWORD=replace-with-an-independent-access-key +# PUBLIC_BASE_URL=https://share.example.com +# ALLOWED_ORIGINS=https://share.example.com +# SITE_ACCESS_PASSWORD= # STUN_URLS=stun:stun.example.com:3478 # NAT_PREDICTION_ENABLED=true # Automatic SFU fallback (does not replace STUN above): diff --git a/.gitattributes b/.gitattributes index 77c86f4..446e711 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,6 +13,7 @@ *.ico binary *.jpg binary *.jpeg binary +*.mp3 binary *.png binary *.webp binary *.woff binary diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..127eeb6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,23 @@ +--- +name: Bug report / 问题反馈 +about: Report a reproducible problem / 反馈可复现的问题 +--- + +## Environment / 环境 + +- Piik version and build SHA / Piik 版本与构建 SHA: +- Browser, App, or Server / 使用端: +- OS and browser versions / 系统与浏览器版本: + +## Steps to reproduce / 复现步骤 + +1. + +## Expected and actual behavior / 预期与实际结果 + +- Expected / 预期: +- Actual / 实际: + +## Optional evidence / 可选证据 + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..f0ada69 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,12 @@ +--- +name: Feature request / 功能建议 +about: Describe a use case and desired outcome / 说明使用场景与期望结果 +--- + +## Problem or use case / 问题或场景 + + + +## Desired outcome / 期望结果 + + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 362d163..2b81a7d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,20 +1,17 @@ -## Summary + -Describe the problem and the outcome of this change. +## Problem and outcome / 问题与结果 -## Verification + -List automated tests, manual checks, environments, and meaningful measurements. +## Release notes -## Research And Decisions + -Link the relevant product owner, research note, issue, and ADR, or explain why none is needed. +## Verification / 验证 -## Checklist + -- [ ] The branch contains one coherent change and no unrelated churn. -- [ ] Required local tests and repository hygiene checks pass, and their exact evidence is listed above. -- [ ] Security, privacy, compatibility, and licensing effects were considered. -- [ ] Product owners, operational docs, ADRs, project memory, and status were updated only where their facts changed. -- [ ] Stale or conflicting memory and documentation were removed rather than preserved as a diary. -- [ ] No credentials, personal data, machine-specific paths, or required untracked artifacts are included. +## Impact / 影响 + + diff --git a/.github/workflows/repository-hygiene.yml b/.github/workflows/repository-hygiene.yml index 9b1cd4f..86cfeb2 100644 --- a/.github/workflows/repository-hygiene.yml +++ b/.github/workflows/repository-hygiene.yml @@ -11,13 +11,25 @@ on: required: false default: false type: boolean + candidate_version: + description: Optional candidate version (vMAJOR.MINOR.PATCH); never publishes + required: false + type: string permissions: contents: read +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: false + queue: max + jobs: validate: runs-on: ubuntu-latest + outputs: + version: ${{ steps.release.outputs.version }} + publish: ${{ steps.release.outputs.publish }} steps: - name: Check out repository uses: actions/checkout@v6 @@ -34,9 +46,26 @@ jobs: PIIK_BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }} - name: Install dependencies run: npm ci + - name: Determine release identity + id: release + env: + PIIK_BUILD_VERSION: ${{ github.event_name == 'workflow_dispatch' && inputs.candidate_version || '' }} + run: >- + node scripts/release-version.mjs + ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && vars.PIIK_RELEASES_ENABLED == 'true' && 'plan' || 'build' }} + --github-output + - name: Preview release notes + if: steps.release.outputs.publish == 'true' || inputs.candidate_version != '' + run: node scripts/release-notes.mjs "$PIIK_RELEASE_VERSION" "$GITHUB_SHA" --github-summary + env: + PIIK_RELEASE_VERSION: ${{ steps.release.outputs.version }} # The Go build embeds internal/server/webassets/dist, so Vite runs first. - name: Build the Browser client run: npm run build:client + env: + PIIK_BUILD_VERSION: ${{ steps.release.outputs.version }} + VITE_PIIK_VERSION: ${{ steps.release.outputs.version }} + VITE_PIIK_REVISION: ${{ github.sha }} - name: Cache Go toolchain uses: actions/cache@v4 with: @@ -49,15 +78,22 @@ jobs: cache-dependency-path: go.sum - name: Check Go core run: npm run check:client-core - - name: Type-check, test, and build - run: npm run check + - name: Type-check and test + run: npm run typecheck && npm test + env: + PIIK_BUILD_VERSION: ${{ steps.release.outputs.version }} + VITE_PIIK_VERSION: ${{ steps.release.outputs.version }} + VITE_PIIK_REVISION: ${{ github.sha }} release-application: needs: validate if: >- - github.event_name == 'workflow_dispatch' && inputs.client_checks == true + needs.validate.outputs.publish == 'true' || + (github.event_name == 'workflow_dispatch' && inputs.client_checks == true) runs-on: ubuntu-latest timeout-minutes: 15 + env: + PIIK_BUILD_VERSION: ${{ needs.validate.outputs.version }} steps: - name: Check out repository uses: actions/checkout@v6 @@ -93,7 +129,8 @@ jobs: - validate - release-application if: >- - github.event_name == 'workflow_dispatch' && inputs.client_checks == true + needs.validate.outputs.publish == 'true' || + (github.event_name == 'workflow_dispatch' && inputs.client_checks == true) strategy: fail-fast: false matrix: @@ -106,6 +143,8 @@ jobs: runner: macos-15 runs-on: ${{ matrix.runner }} timeout-minutes: 20 + env: + PIIK_BUILD_VERSION: ${{ needs.validate.outputs.version }} steps: - name: Check out repository uses: actions/checkout@v6 @@ -158,3 +197,52 @@ jobs: if-no-files-found: error compression-level: 0 retention-days: 14 + + publish: + needs: + - validate + - release-application + - release-clients + if: needs.validate.outputs.publish == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: write + steps: + - name: Check out repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version-file: .node-version + cache: npm + - name: Install dependencies + run: npm ci --ignore-scripts + - name: Download application release + uses: actions/download-artifact@v8 + with: + name: piik-server-${{ github.sha }} + path: ${{ runner.temp }}/publish-release + - name: Download App release candidates + uses: actions/download-artifact@v8 + with: + pattern: piik-app-*-${{ github.sha }} + path: ${{ runner.temp }}/publish-release + merge-multiple: true + - name: Publish verified release + run: >- + node scripts/publish-release.mjs + "$RUNNER_TEMP/publish-release" "$PIIK_RELEASE_VERSION" "$GITHUB_SHA" + env: + GH_TOKEN: ${{ github.token }} + PIIK_RELEASE_VERSION: ${{ needs.validate.outputs.version }} + - name: Mirror verified release to Gitee + run: >- + node scripts/mirror-release.mjs + "$RUNNER_TEMP/publish-release" "$PIIK_RELEASE_VERSION" "$GITHUB_SHA" + env: + GH_TOKEN: ${{ github.token }} + GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }} + PIIK_RELEASE_VERSION: ${{ needs.validate.outputs.version }} diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 0000000..7373416 --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,39 @@ +name: Website + +on: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: github-pages + cancel-in-progress: false + +jobs: + deploy: + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: + contents: read + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - run: npm run build:website + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v4 + with: + path: build/site + retention-days: 1 + - uses: actions/deploy-pages@v4 + id: deployment diff --git a/AGENTS.md b/AGENTS.md index 62ff490..08a8ae0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,7 +23,7 @@ ## Product Contract -- Piik is private game screen sharing for one Host and up to 20 authenticated +- Piik is private screen sharing for one Host and up to 20 authenticated Viewers, with Web Host/Viewer/relay as the current product surface. - Current product truth is split by owner: [rooms/access](./docs/product/rooms-access.md), @@ -45,10 +45,9 @@ [status](./docs/status.md), [TODO](./docs/todo.md), and only the relevant product module, ADR, research, or operations document. Then inspect branch, HEAD, status, staged diff, and worktrees. -- Product modules own current behavior; ADRs own non-obvious decisions and - consequences; research owns evidence and license boundaries; deployment owns - operational reference. Status is the current execution/deployment index, TODO - is the only work ledger, and Git/PRs own completed history. +- Use the [documentation owner map](./docs/maintenance.md#owners): product + behavior, engineering, visual language, versions, evidence and operations each + have one owner. TODO is the only work ledger; Git/PRs own completed history. - Give every durable fact one owner. Update memory or status only when its compact snapshot materially changes. Ordinary UI detail, protocol field listings, self-evident code, test inventories, routine validation, and agent process do @@ -71,40 +70,28 @@ - Canonical root must be clean current `main` at audit/integration boundaries. Create branches/worktrees from that exact commit; old branches and worktrees are never truth sources. -- `main` is a low-frequency integration branch, never a workbench. Keep work on - branches/worktrees and merge only one complete, user-accepted phase per PR, - after its related implementation, tests, documentation, and acceptance are - complete. Use one squash commit and leave `main` unchanged between phases. - Do not merge intermediate checkpoints, release records, metadata-only edits, - or follow-up cleanup; fold them into the next phase. A P0/P1 emergency may - bypass batching only when the user explicitly authorizes it, still through - one coherent PR. +- `main` remains low-frequency: one complete, user-accepted phase per squash PR, + with no intermediate release-record or cleanup commits. Keep implementation + on worktrees; [CONTRIBUTING.md](./CONTRIBUTING.md#full-integration-and-release-workflow) + owns the full workflow and explicit emergency exception. - Preserve user work. Branch, truth-checkpoint, PR, release, recovery, and cleanup rules are owned by [CONTRIBUTING.md](./CONTRIBUTING.md); do not mirror that workflow here. ## Engineering Defaults -- Prefer the simplest cohesive design that is easy to use and maintain. Reuse - mature components, keep ownership explicit, and remove superseded paths in - the same change instead of retaining speculative flexibility or technical debt. -- Apply good coding practice to every change: split modules around clear - responsibilities and state/lifecycle ownership, with cohesive internals and - narrow interfaces. Reuse proven shared behavior and abstract stable common - responsibilities; avoid both duplicate implementations and needless wrappers. - Review coupling and readability, not only file size or line count. -- Judge a change by evidenced user value against its full implementation, - maintenance, compatibility, and failure cost. A large measured gain may - justify broad or breaking work; a small or speculative gain does not justify - material complexity or risk. -- After completing a material module, run one ablation pass and remove every new - component, state, dependency, or branch that is not needed for the verified - result or an accepted contract. Its primary goal is lower total system - complexity, not perfect performance; marginal gains do not justify permanent - mechanisms or a materially larger maintenance surface. +- UI changes must follow the shared [visual language](./docs/design/visual-language.md): + cast, semantic colours, result panels and motion have one owner. Extend the + existing preview when adding a new meaning; do not invent scene-local rules. +- Follow [engineering and interface boundaries](./docs/reference/engineering.md): + simple cohesive modules, clear state/resource owners, mature reuse and narrow + contracts. After a material module, remove additions that the accepted result + does not need; total complexity matters more than marginal performance gains. +- [Versioning](./docs/reference/versioning.md) separates build identity, wire, + storage and live generations, and owns the public compatibility design. + Its pending public-release policy does not replace today's private contract. - Use primary sources for non-trivial design and bugs. Add focused tests in proportion to risk; batch full browser/network/endurance checks at acceptance. -- Keep scripts deterministic, fast, cross-platform, and CI-runnable. Support - Windows, macOS, and Linux; use LF and ASCII filenames for new files. +- Keep scripts deterministic, fast, cross-platform and CI-runnable. - Before finishing material work, inspect status, report untracked artifacts, and stage requested files unless told otherwise. diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 4a7a4a6..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,5 +0,0 @@ -@AGENTS.md - -# Claude Code - -This file intentionally imports the repository-wide agent instructions instead of duplicating them. Keep durable project guidance in `AGENTS.md` and the referenced bounded project documents. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 883a3e7..2a4d9af 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ leave `main` alone until the next material phase. Only a user-authorized P0/P1 emergency may use a separate PR, and that PR must still contain one coherent fix. -1. Create one short-lived branch/worktree from exact canonical `main`; use `feat/`, `fix/`, `docs/`, `refactor/`, `test/`, `chore/`, or `spike/` followed by a short description. +1. Create one short-lived branch/worktree from exact canonical `main`, following the [branch naming convention](#commit-pr-and-branch-names). 2. Update only the single durable owner for changed semantics and any materially changed current snapshot. If semantics remain disputed, record a hold and stop dependent work. 3. Implement and run repository hygiene, `npm run check`, the relevant browser/network gates, and review in proportion to the whole acceptance boundary. 4. Keep accepted truth checkpoints and dependent candidates on branches until the phase is complete. Rebase or rebuild a retained candidate from exact `main` only when starting a new phase, preserving main's owning truth on conflicts and transplanting only approved scoped code, tests, and new facts. @@ -37,20 +37,24 @@ the repository. Exact deployment identity belongs to the immutable release descriptor, runtime `REVISION`, and deployment record. Preserve separate commits only when they carry independently useful history. -Direct commits to `main` are reserved for an explicit user-approved exception. Never force-push shared branches or rewrite shared history without explicit approval. +Update `main` through PRs only; branch checkpoints and generated release metadata +do not bypass that boundary. Never force-push shared branches or rewrite shared +history without explicit approval. For deployment work, a routine application-only release verifies a new immutable artifact, switches to it atomically, and guarantees the pre-cutover application release only through bounded health and postflight checks; it has no retention contract afterward and is not a maintained backup. Define recovery only for the infrastructure, configuration, secrets, persistent state, or irreversible surfaces the task actually touches, before changing them. -Do not change `SIGNALING_PROTOCOL` for compatible internal, UI, routing, or -release work. A wire change makes existing pages stale and forces an active -Browser Host to reload, which ends its capture. Bump it only for an actually -incompatible message contract whose atomic cutover and capture interruption are -explicitly accepted. +Use the [version/compatibility policy](./docs/reference/versioning.md) to classify +release changes. In today's private contract an incompatible signaling cutover +forces old pages to reload and ends Browser capture; include that interruption +in the accepted cutover. Compatible UI/internal work does not require a wire bump. Clean up worktrees and branches only after semantic review and integration are complete and the normal merged-head, open-reference, clean-tree, and non-following link checks pass. Never merge an old branch wholesale after a newer truth checkpoint. ## Research Standard +The [engineering reference](./docs/reference/engineering.md) owns module and +interface discipline, including the post-change ablation pass. + Follow the [naming convention](./docs/reference/naming.md) for product copy, commands, packages and code ownership. Keep display names separate from stable protocol identifiers; use normal language-specific identifier conventions. @@ -65,6 +69,10 @@ protocol identifiers; use normal language-specific identifier conventions. ## Verification Entrypoints +Every retained test must be collected by a documented verification entry point. +Confirm runner inclusion when adding or moving a test; a file's presence alone +does not establish coverage. + - `npm run check` owns deterministic Web type-check, unit, and build acceptance. - `npm run check:client` owns Go formatting, unit tests, vet, three-platform builds, and the Windows capture compile/probe when run on Windows. The server @@ -80,16 +88,44 @@ protocol identifiers; use normal language-specific identifier conventions. identities; do not run network tests with a changing temporary executable path. Keep browser profiles isolated and consider the active firewall when diagnosing connection failures rather than changing global firewall rules. -- Server and three-platform Client candidates run only from an explicit manual - workflow dispatch with `client_checks=true`. Ordinary `main` pushes validate - source without running the expensive packaging matrix. - Publishing a tag or GitHub Release remains an explicit release decision rather - than a side effect of every merge. +- CI, versioning and release automation belong to complete, accepted squash + merges into `main`; ordinary branch pushes and PRs stay quiet. The + [versioning policy](./docs/reference/versioning.md) owns version selection, + publication and activation state. Package the merged SHA without writing + version-record commits back to `main`. + +## Commit, PR And Branch Names + +Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/): +`type(scope): outcome`. Scope is optional. Use `feat` for new behavior, `fix` +for repairs, or `docs`, `refactor`, `test`, `build`, `ci`, and `chore` for their +named purpose. Keep the outcome short and concrete; English is the default, +and a Chinese explanation may follow in the body. + +The PR title names the complete phase and becomes its single squash commit on +`main`, for example `fix(app): restore sharing after a source change`. Working +commits should follow the same form where useful; no history rewrite is needed +just to rename commits that will be squashed. Add `!` before the colon for a +breaking change, such as `feat(protocol)!: replace the join handshake`, and +explain its effect in the body. The final squash title and body supply release +intent; the [versioning policy](./docs/reference/versioning.md) owns version +selection and publication behavior. + +Name branches `/`, using the same types; +reserve `spike/` for experiments. No issue number is required. 中文说明:PR 标题 +与最终 squash 提交使用上述格式;分支用英文短名,破坏性变更标记 `!` 并说明影响。 ## Pull Request Scope A pull request should explain the problem, the chosen design, verification performed, user-visible or operational effects, and remaining risks. +Before an integration PR is accepted, fill its exact `## Release notes` section +with concise public copy in Chinese and English: user-visible changes, fixes and +required upgrade actions. Use `###` for subsections. Review this text as product +copy; it is published automatically from the squash commit, without PR discussion +or verification logs. The [release-note policy](./docs/reference/versioning.md#release-notes) +owns aggregation and preview. Do not add a changelog file or release-note archive. + Durable semantic or current-snapshot changes must update their single owner in the same integration boundary. Ordinary implementation and bug fixes may be complete with code plus focused evidence. ## Local Hooks diff --git a/LICENSE.zh-CN.md b/LICENSE.zh-CN.md deleted file mode 100644 index 3071655..0000000 --- a/LICENSE.zh-CN.md +++ /dev/null @@ -1,22 +0,0 @@ -# MIT 许可证中文参考译文 - -The authoritative license is the English [LICENSE](./LICENSE). -This translation is for convenience and adds no terms or restrictions. - -本文件为方便阅读提供中文参考译文,不替代英文 [LICENSE](./LICENSE), -也不增加条件或限制。Piik 自有代码的 MIT 许可不替代 -[第三方组件的许可与声明](./licenses/README.md)。 - -版权所有 (c) 2026 TNTcraft 和 Piik 贡献者 - -特此免费授予任何获得本软件及相关文档文件(以下简称“软件”)副本的人, -不受限制地处置本软件的权利,包括但不限于使用、复制、修改、合并、出版、 -分发、再许可和/或销售本软件副本,并允许获得软件的人这样做, -但须遵守以下条件: - -上述版权声明和本许可声明应包含在本软件的所有副本或实质部分中。 - -本软件按“原样”提供,不作任何明示或默示保证,包括但不限于适销性、 -特定用途适用性和不侵权的保证。在任何情况下,无论依据合同、侵权或其他 -法律理论,作者或版权持有人均不对因软件、软件的使用或其他处置而产生、 -源自或与之有关的任何索赔、损害或其他责任负责。 diff --git a/README.md b/README.md index ba6a51f..b4b958e 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,109 @@ -Piik TV logo +

Piik mascot

+

Piik

+

Share the good stuff.
Private screen sharing for you and up to 20 friends.

+

+ Website · + Download · + Gitee mirror · + Try the demo · + Documentation +

+

+ License: MIT + Up to 20 viewers + P2P-first media +

+

English · 简体中文

-# Piik +Piik is a free, open-source screen sharing tool for games, movie nights, +drawings and photos. Choose what to share and send an invitation. Your friends +watch in their browsers. -English | [简体中文](./README.zh-CN.md) +
+A little room · Show / hide animation -Share your screen. Bring your friends. +

A host with a small gold crown shares an RPG, a drawing, photos and an animated film while friends watch from the sofa.

-Piik is private screen sharing for one Host and up to 20 invited friends. -Friends watch in their browsers, with no installation. +
-```mermaid -flowchart LR - Browser[Browser] --> Host[Host a room] - App[Piik App] --> Host - Host -->|Invite link| Friends[Friends watch in browsers] +[Features](#features) · [Get started](#get-started) · [Self-hosting](#self-hosting) · [Contributing](#contributing) + +## Features + +- **Watch without installing.** Friends join by invitation in a desktop or mobile browser. +- **Share from Piik App or an existing Piik site.** Capture a screen, window or browser tab; available sources and audio depend on the platform. +- **Direct connections first.** Media travels between participants where possible (P2P). A self-hosted server can provide automatic media forwarding (SFU) as a fallback. +- **Rooms you control.** Invitations, room codes and optional room passwords, for one host and up to 20 viewers. +- **Flexible viewing.** Light and dark themes, playback controls, picture-in-picture and a connection topology view. +- **One program to host a site.** Web UI, room management and optional media forwarding are packaged together. + +

+ + + Piik room: a shared game, playback controls and friends on a sofa. The host wears a small gold crown. +
+ Interface preview · Sample room with a generated game scene +

+ +## Get started + +**To watch:** open the invitation your friend sends you. Select **Play** if the +picture does not start automatically. + +**To share:** + +| Start here | What you need to do | +| --- | --- | +| [Try the online demo](https://demo.piik.tv) | Open it in a desktop browser and start sharing. | +| [Download Piik App](https://piik.tv/#download) | Extract and open the App, choose **Public invite**, then **Open Piik** to create a temporary room. | +| Use an existing Piik site | Open the address your friend or administrator provides. [Hosting your own](./docs/operations/self-hosting.md) is an advanced option. | + +

Choose a screen, send an invitation, watch together.

+ +1. Select **Start sharing**, then choose the picture and audio to share. +2. Select **Copy invite link** and send it to your friends. Keep the sharing tab open. + +Piik uses icon controls by default; select **EN** in the header to show labels. +The App offers a local room, a temporary public link, or a connection to your own +site. Keep the App running while sharing through it. + +Download an archive beginning with **`piik-app`**. The filename also identifies the platform: + +| Filename contains | Platform | +| --- | --- | +| `windows-amd64` | Windows x64 | +| `darwin-arm64` | Apple silicon; native capture requires macOS 13+ | +| `linux-amd64` | Linux x64 | + +[**Full setup guide →**](./docs/guide/getting-started.md) · [**Open the demo →**](https://demo.piik.tv) + +Browser capture requires HTTPS or `localhost`. Windows App and desktop browser +sharing are the primary tested paths. The macOS and Linux apps have not yet been +tested on physical devices; [test results and feedback are welcome](https://github.com/TNTcraftHIM/Piik/issues). +P2P-only modes, including the App's temporary public +link and the demo, may not connect on restrictive networks. + +## Self-hosting + +Piik Server is a standalone binary with the web interface built in. +Download the Linux x64 Server package, extract it, and run: + +```sh +./piik-server ``` -## Join a friend +Open `http://localhost:8787` to try it locally. For a public site, configure your +domain, HTTPS reverse proxy and STUN address. Room data is stored in SQLite. -1. Open the invitation your friend sent. -2. Press Play if your browser asks. Use the video's sound and fullscreen controls. +[**Deploy your own site →**](./docs/operations/self-hosting.md) · [Configuration](./docs/reference/configuration.md) · [Run from source](./docs/README.md#run-from-source) -Got a room code instead? Open the same Piik site and choose **Join a room**. -Site access and the room's password settings still apply. +## Contributing -## Share from your browser - -1. Open the Piik site your group uses. Enter its site password if asked. -2. Choose **Start sharing**, pick a screen, window or tab, and check the sound switch. -3. Send the room's invitation link to your friends. Keep the sharing tab open. - -Capture needs HTTPS or `localhost`; available sources and sound depend on the -browser and platform. English, Chinese and an illustrated visual mode share the -same controls, with light and dark themes. - -## Start your own room with Piik App - -With the Piik App package for your platform: - -1. Extract the whole package, keeping `runtime` beside the executable. -2. Open `piik-app.exe` on Windows, `Piik App.app` on macOS, or - `./piik-app` on Linux. -3. Choose a mode, pick what to share, and send the invitation. Keep the app running. - -| Mode | Use it for | -| --- | --- | -| **Local room** | Friends on the same local network. An optional site password controls access. | -| **Public invite** | A temporary Internet invitation. The link lasts for this App run; media remains P2P. | -| **Connect to Site** | An existing Piik site, with App capture and media capabilities available in the same browser UI. | - -Piik App opens your system browser. Its package includes the Go application and -capture/link helpers; running it needs no Node.js, npm or Go installation. -Linux native capture uses the system Portal, PipeWire and GStreamer stack. -See the [App guide](./cmd/piik-app/README.md) for platform details. - -Temporary public links use Cloudflare Quick Tunnel, which has no uptime guarantee. -Media needs a working UDP path; restrictive networks or browser/OS suspension -can interrupt sharing. Windows App and Browser are the current acceptance -focus; macOS/Linux physical capture checks remain separate. See -[current status](./docs/status.md) for candidate and release readiness. - -## Host a site or contribute - -The Server package is one Go executable with the Web UI embedded. It owns room -signaling, STUN and optional embedded SFU fallback. Follow the -[self-hosting guide](./docs/operations/self-hosting.md) to set up your own site. - -For source builds, tests and architecture, start with the -[documentation map](./docs/README.md). [Contributing](./CONTRIBUTING.md) covers the workflow. - -## Something went wrong? - -Include your version, OS/browser, expected result and steps to reproduce. -For a local report, start Piik App with `--debug` and press `D`, or add `?debug=1` -before any `#` in the Browser page URL and use its header download button. Review reports before -sharing; see [diagnostics and export](./docs/reference/configuration.md#diagnostics). -Connection trouble? Try the [Chromium WebRTC FAQ](./cmd/piik-app/README.md#chromium-webrtc-connections). +Bug reports, documentation improvements and pull requests are welcome. +Start with [CONTRIBUTING.md](./CONTRIBUTING.md), or see the +[repository layout](./docs/reference/engineering.md#repository-layout) to find your way around. ## License -Piik-owned code is [MIT licensed](./LICENSE). Third-party components retain -their own licenses and notices: [licensing guide](./licenses/README.md). +Piik-owned code is [MIT licensed](./LICENSE). Dependencies retain their own +[licenses and notices](./licenses/README.md). diff --git a/README.zh-CN.md b/README.zh-CN.md index d47ee0d..971d275 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,79 +1,104 @@ -Piik 小电视标志 +

Piik 吉祥物

+

Piik

+

来,看点
好康的。

私密屏幕共享,邀请最多 20 位朋友观看。

+

+ 官网 · + 下载 · + Gitee 镜像 · + 在线演示 · + 文档 +

+

+ MIT 许可 + 最多 20 位观众 + 优先使用 P2P 连接 +

+

English · 简体中文

-# Piik +Piik 是一个免费开源的屏幕共享工具,适合游戏围观、一起看电影、展示绘画或分享照片。 +选择画面,把邀请链接发给朋友,对方用浏览器即可观看。 -[English](./README.md) | 简体中文 +
+客厅小剧场 · 展开 / 收起动画 -分享你的屏幕,叫上朋友一起看。 +

戴着小金冠的房主分享 RPG 游戏、绘画、照片和动画电影,朋友们坐在沙发上观看。

-Piik 是一个私密屏幕分享工具:一位房主,最多 20 位受邀好友。 -朋友用浏览器就能观看,无须安装。 +
-```mermaid -flowchart LR - Browser[浏览器] --> Host[开房分享] - App[Piik App] --> Host - Host -->|邀请链接| Friends[好友用浏览器观看] +[功能](#功能) · [开始使用](#开始使用) · [自行部署](#自行部署) · [参与贡献](#参与贡献) + +## 功能 + +- **观看无须安装。** 朋友通过邀请链接,用电脑或手机浏览器加入。 +- **用客户端或已有 Piik 站点分享。** 支持屏幕、窗口和浏览器标签页;可选来源与音频能力取决于平台。 +- **优先直接连接。** 画面优先在设备之间传输(P2P),自建站点可启用媒体转发(SFU)自动兜底。 +- **房间由你管理。** 支持邀请链接、房间号和可选的房间密码,一位房主、最多 20 位观众。 +- **灵活的观看方式。** 支持深浅主题、播放控制、画中画和连接拓扑查看。 +- **一个程序就能建站。** 网页、房间管理和可选的媒体转发打包在同一服务端程序中。 + +

+ + + Piik 房间:共享的游戏画面、播放控件和坐在沙发上的朋友,房主戴着小金冠。 +
+ 界面预览 · 示例房间与生成的游戏画面 +

+ +## 开始使用 + +**观看分享:** 打开朋友发来的邀请链接。画面没有自动播放时,点击**播放**即可。 + +**分享画面:** + +| 从这里开始 | 需要做什么 | +| --- | --- | +| [体验在线 Demo](https://demo.piik.tv) | 在电脑浏览器打开,开始分享。 | +| [下载 Piik App](https://piik.tv/?lang=zh-CN#download) | 解压并启动客户端,选择**公网邀请**,点击**进入 Piik**,创建临时房间。 | +| 使用已有 Piik 站点 | 打开朋友或管理员提供的地址。[自行部署](./docs/operations/self-hosting.zh-CN.md)属于进阶操作。 | + +

选择画面,发送邀请,一起观看。

+ +1. 点击**开始分享**,选择要分享的画面和声音。 +2. 点击**复制邀请链接**,发给朋友。分享期间保持标签页打开。 + +Piik 默认使用图示按钮;点击顶部的**中**可显示文字。 +客户端提供本地房间、临时公网邀请和连接已有站点三种模式,分享期间需保持 App 运行。 + +下载以 **`piik-app`** 开头的压缩包,再按文件名中的平台标识选择: + +| 文件名包含 | 适用平台 | +| --- | --- | +| `windows-amd64` | Windows x64 | +| `darwin-arm64` | Apple 芯片;原生采集需 macOS 13 及以上 | +| `linux-amd64` | Linux x64 | + +[**完整使用教程 →**](./docs/guide/getting-started.zh-CN.md) · [**打开在线演示 →**](https://demo.piik.tv) + +浏览器采集需要 HTTPS 或 `localhost`。目前主要测试 Windows 客户端和桌面浏览器分享。 +macOS 和 Linux 客户端尚未经过实机测试,欢迎有设备的朋友试用并[反馈问题](https://github.com/TNTcraftHIM/Piik/issues)。 +客户端公网邀请和演示站使用纯 P2P 连接, +在受限网络下可能无法连通。 + +## 自行部署 + +Piik Server 是一个内置网页界面的独立程序。 +下载 Linux x64 服务端程序包,解压后运行: + +```sh +./piik-server ``` -## 去朋友的房间 +打开 `http://localhost:8787` 即可在本机试用。对外提供服务时, +再配置域名、HTTPS 反向代理和 STUN 地址。房间数据保存在 SQLite 中。 -1. 打开朋友发来的邀请链接。 -2. 如果浏览器提示,点击播放。声音和全屏由视频控件控制。 +[**部署自己的站点 →**](./docs/operations/self-hosting.zh-CN.md) · [配置参考](./docs/reference/configuration.md) · [从源码运行](./docs/README.md#run-from-source) -只有房间号?打开同一个 Piik 站点,选择 **加入房间**。 -站点访问权限和房间密码设置仍然适用。 +## 参与贡献 -## 用浏览器分享 - -1. 打开你们使用的 Piik 站点,按提示输入站点密码。 -2. 点击 **开始分享**,选择屏幕、窗口或标签页,并检查声音开关。 -3. 把房间邀请链接发给朋友,保持分享标签页打开。 - -浏览器采集需要 HTTPS 或 `localhost`;可选来源和声音支持取决于浏览器与平台。 -界面提供中文、英文和图示模式,以及明暗主题。 - -## 用 App 自己开房 - -拿到对应平台的 App 程序包后: - -1. 完整解压,保留可执行文件旁的 `runtime` 目录。 -2. Windows 打开 `piik-app.exe`,macOS 打开 `Piik App.app`, - Linux 运行 `./piik-app`。 -3. 选择模式和分享来源,发出邀请。分享期间保持 App 运行。 - -| 模式 | 适合什么情况 | -| --- | --- | -| **本地房间** | 与同一局域网内的好友分享,可设置站点访问密码。 | -| **公网邀请** | 生成本次 App 运行期间有效的临时邀请链接;媒体仍走 P2P。 | -| **连接站点** | 使用已有 Piik 站点,并在同一浏览器界面使用 App 的采集与媒体能力。 | - -App 会打开系统浏览器。程序包包含 Go 应用和采集、临时链接辅助程序, -运行时无须安装 Node.js、npm 或 Go。Linux 原生采集使用系统的 Portal、PipeWire -和 GStreamer,平台细节见 [App 指南](./cmd/piik-app/README.md)。 - -临时公网链接使用 Cloudflare Quick Tunnel,不保证持续可用。 -媒体需要可用的 UDP 路径;网络限制、浏览器或系统挂起都可能中断分享。 -当前以 Windows App 和浏览器为验收重点,macOS/Linux 原生采集的实机验证另行进行。 -候选版本与发布准备情况见 [当前状态](./docs/status.md)。 - -## 自建站点或参与开发 - -Server 是一个内嵌 Web 界面的 Go 可执行文件,负责房间信令、STUN 和可选的内置 -SFU 后备路径。搭建自己的站点,请看 [自托管指南](./docs/operations/self-hosting.md)。 - -源码运行、测试和架构从 [文档地图](./docs/README.md) 开始; -[贡献指南](./CONTRIBUTING.md) 说明协作流程。 - -## 遇到问题? - -反馈时附上版本、系统与浏览器、预期结果和复现步骤。 -App 可用 `--debug` 启动后按 `D` 导出本地报告;浏览器网址加上 `?debug=1` -后(放在 `#` 之前),可点击顶部下载按钮。分享前请检查报告内容,详见 -[诊断与导出](./docs/reference/configuration.md#diagnostics)。 -连接不上时,也可以查看 [Chromium WebRTC 常见问题](./cmd/piik-app/README.md#chromium-webrtc-connections)。 +欢迎提交问题、改进文档或参与开发。 +修改前请阅读[贡献指南](./CONTRIBUTING.md),也可以从 +[项目目录说明](./docs/reference/engineering.md#repository-layout)了解代码结构。 ## 许可 -Piik 自有代码采用 [MIT 许可](./LICENSE),提供 [中文参考译文](./LICENSE.zh-CN.md)。 -第三方组件保留各自的许可与声明,详见 [许可说明](./licenses/README.md)。 +Piik 自有代码采用 [MIT 许可](./LICENSE),依赖保留各自的[许可与声明](./licenses/README.md)。 diff --git a/cmd/piik-app/README.md b/cmd/piik-app/README.md index c37a393..bcd5b37 100644 --- a/cmd/piik-app/README.md +++ b/cmd/piik-app/README.md @@ -1,21 +1,20 @@ # Piik App -Piik App is the self-contained and native-capability runtime for the same -Browser application used by Hosted Piik. It does not implement another UI, -room store, signaling protocol, or route controller. +Piik App provides local rooms and native screen capture through the Piik web +interface in your system Browser. ## Run A Package Extract the matching platform bundle in full and keep `runtime` beside the App executable. Run `piik-app.exe` on Windows, `./piik-app` on -Linux, or `Piik App.app` on macOS. The launcher opens in the system Browser; -the App does not embed a browser UI. Packaged execution needs no Node.js, npm, -or Go installation. Linux native capture uses the system dependencies described +Linux, or `Piik App.app` on macOS. The launcher opens in the system Browser. +Linux native capture uses the system dependencies described in the [Linux capture guide](../../native/capture/linux/README.md). -Windows App and Browser are this phase's acceptance targets. Other platform -builds do not establish physical capture/audio acceptance; see -[current status](../../docs/status.md). Package construction and public Release +Windows App and browser sharing are the primary tested paths. The macOS and +Linux apps have not yet been tested on physical devices; test results and +[feedback](https://github.com/TNTcraftHIM/Piik/issues) are welcome. macOS native +capture requires Apple silicon and macOS 13 or newer. Package construction and public Release publication are separate steps in [deployment](../../docs/deployment.md). ## Modes @@ -25,14 +24,12 @@ publication are separate steps in [deployment](../../docs/deployment.md). Site, then enters the normal Host page. - The launcher remembers the Site address but keeps the per-run room source separate. The App RPC starts before this choice and accepts the saved Site - alongside the Local Host origin, so Local or Public invite does not disable - Site enhancement. An App-opened Site remembers the opt-in in that Browser + alongside the Local Host origin. An App-opened Site remembers the opt-in in that Browser origin; later manually opened Host pages may reuse the running App. -- `--site`, `--local`, and `--link` remain deterministic automation inputs for - CI and development. They are not required for normal use. -- The default launcher checks the official GitHub Releases metadata after it - opens and shows a notice when a newer full-SHA release exists. The check is - best-effort and never installs or replaces the App. +- The `--site`, `--local`, and `--link` flags select a mode for CI and development. +- The default launcher checks official releases after it opens, using GitHub + first and Gitee if GitHub is unavailable. It links to an available release + without installing or replacing the App. Local mode uses memory-only rooms, P2P relay, no SFU listener, and no public discovery. Ordinary Local works on a reachable LAN. The **Public invite** mode @@ -72,9 +69,8 @@ reuse suitable H.264/VP8 outputs and derive a missing lower output only for direct-child demand. Compatible children share that output; each edge receives only its selected representation. SFU publication combines its requested output prefix with one aggregate upstream budget. A lower-output constraint does not -replace the original input or higher sibling outputs. The existing route -controller still owns persistent quality evidence and any route replacement; -there is no room-wide score or periodic rebalance. See +replace the original input or higher sibling outputs. The route controller owns +persistent quality evidence and route replacement. See [media quality](../../docs/product/media-quality.md) for the implemented behavior and [status](../../docs/status.md) for its acceptance limits. @@ -89,7 +85,7 @@ The terminal shows the current mode, entry links and startup state; its language follows the launcher and App-enabled pages. Press `o` to reopen the Browser, or `q` / Ctrl+C to end Local rooms and stop the local server and temporary public link. Plain-text output -uses Ctrl+C. A Site-loaded Browser tab does not own the App process. +uses Ctrl+C. The App keeps running after a Site tab closes. For one-link Internet sharing, open the App launcher, choose **Public invite**, create a room in the opened Browser, and send its normal invitation link. The @@ -106,8 +102,7 @@ use a configured Site when persistent control availability or SFU fallback matte Chromium-based Browsers can restrict WebRTC UDP through Browser settings, extensions or managed policies. Disabling non-proxied UDP can prevent even the local Browser-to-App media connection; successful capture or page loading -does not prove that this separate connection is available. This is not specific -to one Browser brand or to VPN use. +does not prove that this separate connection is available. Check the Browser's WebRTC/IP-handling policy and any extension's WebRTC or IP-leak protection setting. Restore a policy that permits WebRTC UDP, reload @@ -170,12 +165,21 @@ admits at most two independent strict v9 control sessions. After `hello`, each session may list local capture choices, own one generation-fenced Host share, or receive one native Viewer source and its bounded encoded child edges. Closing one session retires only its resources. Its public `instanceToken` -distinguishes the discovered process but is not authentication; room authority -and remote signaling remain in the Browser. Viewer receive/relay remains +distinguishes the discovered process but is not authentication. The shared Go +service owns room authority; the Browser owns the room protocol client and +orchestrates native media through this control session. Viewer receive/relay remains available even when this machine has no accepted native capture encoder. Capture sidecars must match the App's current probe/encoded-output contract; the package-candidate wrapper validates that version before accepting its artifact. +Packaged builds report the product version and source SHA in the terminal and +diagnostic context. The launcher uses that identity to distinguish a newer +version, a different build of the same version, and an official release offered +to a development build; the link never installs or interrupts a share. +[Versioning](../../docs/reference/versioning.md) +owns these meanings and [GitHub operations](../../docs/operations/github.md) +owns automatic publication. + ## Packaging From a clean revision, build the application release and run the platform's diff --git a/cmd/piik-server/main.go b/cmd/piik-server/main.go index ae18948..43cfe90 100644 --- a/cmd/piik-server/main.go +++ b/cmd/piik-server/main.go @@ -1,10 +1,10 @@ // Command piik-server is the Hosted Piik entry point: it loads the // environment, serves the embedded Browser UI together with the signaling and -// room API, and stops on SIGINT or SIGTERM. It replaces src/server/index.ts. +// room API, and stops on SIGINT or SIGTERM. // // Two maintenance modes exit without serving: --check-config validates the // environment (the release wrapper runs it as the service user before cutover) -// and --check-release compares the deployed revision with the latest published +// and --check-release compares this binary with the latest published // release (see release.go). package main @@ -37,17 +37,16 @@ const shutdownTimeout = 15 * time.Second // release directory. Hosted keeps its real values in the service secret store. const environmentFile = ".env" -// BuildRevision is the full Git revision the release packager links in with -// -ldflags. It matches the REVISION file shipped beside the binary and is -// reported at startup so one journal line identifies the running release. -var BuildRevision = "development" +// The packager injects the product version and full source revision together. +var ( + BuildVersion = "development" + BuildRevision = "development" +) func main() { checkConfig := flag.Bool("check-config", false, "validate the environment and exit") checkRelease := flag.Bool("check-release", false, "report whether a newer published release exists and exit") - currentFile := flag.String("current-file", "", - "path to the deployed REVISION file read by --check-release") apiURL := flag.String("api-url", defaultReleaseAPIURL, "release metadata endpoint used by --check-release") debug := flag.Bool("debug", false, "save opt-in server diagnostics to rotated files") @@ -58,7 +57,7 @@ func main() { } switch { case *checkRelease: - os.Exit(checkDeployedRelease(context.Background(), *currentFile, *apiURL, os.Stdout)) + os.Exit(checkDeployedRelease(context.Background(), *apiURL, os.Stdout)) case *checkConfig: if _, err := config.Load(environment()); err != nil { fail(err) @@ -98,14 +97,16 @@ func serve(debug bool) (returnedErr error) { defer func() { stopExport() _ = dependencyLog.Close() - logger.Info("piik-server", "event", "stopped", "failed", returnedErr != nil, diagnostics.Error(returnedErr)) returnedErr = errors.Join(returnedErr, exportServerDiagnostics(recorder), recorder.Close()) slog.SetDefault(previous) log.SetOutput(previousWriter) log.SetFlags(previousFlags) }() - logger.Info("piik-server", "event", "start", "revision", BuildRevision) + logger.Info("piik-server", "event", "start", "version", BuildVersion, "revision", BuildRevision) } + defer func() { + logger.Info("piik-server", "event", "stopped", "failed", returnedErr != nil, diagnostics.Error(returnedErr)) + }() configuration, err := config.Load(environment()) if err != nil { return err @@ -133,11 +134,26 @@ func serve(debug bool) (returnedErr error) { if err != nil { return err } - fmt.Printf("Piik %s is listening on %s:%d; public URL %s\n", - BuildRevision, configuration.ListenHost, port, config.Origin(configuration.PublicBaseURL)) + logger.Info("Piik server is listening", "event", "ready", "version", BuildVersion, "revision", BuildRevision, + "host", configuration.ListenHost, "port", port, "publicUrl", config.Origin(configuration.PublicBaseURL), + "sqlite", configuration.RoomDatabasePath != "", "siteAccessProtected", configuration.SiteAccessPassword != "", + "sfu", configuration.SFU != nil, "natPrediction", configuration.NATPredictionEnabled) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) - defer stop() + // One bounded background lookup never delays serving. Join it before closing + // diagnostic outputs so shutdown cannot leave a late writer behind. + releaseChecked := make(chan struct{}) + go func() { + defer close(releaseChecked) + result := checkRelease(ctx, BuildVersion, BuildRevision, defaultReleaseAPIURL, os.Getenv("GITHUB_TOKEN"), mirrorReleaseAPIURL) + if ctx.Err() == nil { + logReleaseNotice(logger, result) + } + }() + defer func() { + stop() + <-releaseChecked + }() <-ctx.Done() shutdownCtx, cancel := context.WithTimeout(context.Background(), shutdownTimeout) defer cancel() @@ -185,9 +201,9 @@ func environment() map[string]string { return values } -// loadEnvironmentFile ports the src/server/index.ts loadEnvFile() call: an -// absent file is the ordinary case and every other read failure stops startup. -// Like Node, a name the process already carries is never overwritten, so a +// loadEnvironmentFile reads optional startup overrides. An absent file is the +// ordinary case and every other read failure stops startup. A name the process +// already carries is never overwritten, so a // systemd EnvironmentFile still wins over a stale file in the release // directory. The accepted syntax is DECISIONS D8: KEY=value lines, whole-line // '#' comments, an optional 'export ' prefix, and a single- or double-quoted diff --git a/cmd/piik-server/release.go b/cmd/piik-server/release.go index eb4d188..e9c818e 100644 --- a/cmd/piik-server/release.go +++ b/cmd/piik-server/release.go @@ -6,86 +6,66 @@ import ( "errors" "fmt" "io" + "log/slog" "net/http" "net/url" "os" "regexp" "strings" "time" + + "golang.org/x/mod/semver" ) -// defaultReleaseAPIURL is DEFAULT_RELEASE_API_URL: the same published release -// contract the Browser update notice uses (src/client/lib/release-update.ts). +// The Browser notice and operator checker read the same published release. const defaultReleaseAPIURL = "https://api.github.com/repos/TNTcraftHIM/Piik/releases/latest" +const mirrorReleaseAPIURL = "https://gitee.com/api/v5/repos/TNTcraftHIM/Piik/releases" -// Exit codes are UPDATE_EXIT_CODES. deploy/check-release.sh forwards them, so a -// checker failure stays distinguishable from "an update exists". +// deploy/check-release.sh forwards these codes without installing anything. const ( exitUpToDate = 0 exitUpdateAvailable = 10 exitUpdateUnavailable = 20 - // exitUsage is the exit code parseArguments set when --current-file was - // missing. Without it a forgotten argument reads as an unavailable check. - exitUsage = 2 + releaseTimeout = 5 * time.Second + releaseURLPrefix = "https://github.com/TNTcraftHIM/Piik/releases/tag/" + releaseAPIHost = "api.github.com" + mirrorReleasePrefix = "https://gitee.com/TNTcraftHIM/Piik/releases/tag/" ) -// releaseUsage is the usage string parseArguments threw, with this binary's -// name in place of the script's. -const releaseUsage = "Usage: piik-server --check-release --current-file [--api-url ]" - -const ( - // releaseTimeout bounds the whole check; an operator runs it interactively. - releaseTimeout = 5 * time.Second - // releasePathPrefix is RELEASE_PATH_PREFIX: the only accepted release page. - releasePathPrefix = "/TNTcraftHIM/Piik/releases/tag/" - releaseHost = "github.com" - releaseAPIHost = "api.github.com" -) - -// fullRevisionPattern is FULL_REVISION applied to an already lowercased value, -// which is why the JavaScript case-insensitive flag has no counterpart here. var fullRevisionPattern = regexp.MustCompile(`^[0-9a-f]{40}$`) +var mirrorSourcePattern = regexp.MustCompile(`(?m)^\r?$`) -// Release status values are the "status" field of the printed JSON line, which -// deploy/check-release.sh reads; each maps to one exit code above. const ( statusUpToDate = "up-to-date" statusUpdateAvailable = "update-available" + statusDifferentBuild = "different-build" + statusOfficialRelease = "official-release" statusUnavailable = "unavailable" ) -// releaseResult is the single JSON line the checker prints. Field order is the -// JSON.stringify order of the ported object, and the pointers are the nulls: a -// value the check could not establish is present and null, never omitted. +// Unknown identity fields are explicit nulls in the single printed JSON line. type releaseResult struct { Status string `json:"status"` + CurrentVersion *string `json:"currentVersion"` + LatestVersion *string `json:"latestVersion"` CurrentRevision *string `json:"currentRevision"` LatestRevision *string `json:"latestRevision"` ReleaseURL *string `json:"releaseUrl"` } -// checkDeployedRelease is the --check-release entry point. It writes one JSON -// line and returns the process exit code. An unreadable revision file is an -// unavailable check rather than an update, which is what the ported script's -// silently swallowed read failure meant; an absent --current-file is a usage -// error, which is what parseArguments made it. -func checkDeployedRelease(ctx context.Context, currentFile, apiURL string, out io.Writer) int { - if currentFile == "" { - fmt.Fprintln(os.Stderr, releaseUsage) - return exitUsage +func checkDeployedRelease(ctx context.Context, apiURL string, out io.Writer) int { + mirrorURL := "" + if apiURL == defaultReleaseAPIURL { + mirrorURL = mirrorReleaseAPIURL } - current := "" - if content, err := os.ReadFile(currentFile); err == nil { - current = string(content) - } - result := checkRelease(ctx, current, apiURL, os.Getenv("GITHUB_TOKEN")) + result := checkRelease(ctx, BuildVersion, BuildRevision, apiURL, os.Getenv("GITHUB_TOKEN"), mirrorURL) encoder := json.NewEncoder(out) encoder.SetEscapeHTML(false) if err := encoder.Encode(result); err != nil { return exitUpdateUnavailable } switch result.Status { - case statusUpdateAvailable: + case statusUpdateAvailable, statusDifferentBuild, statusOfficialRelease: return exitUpdateAvailable case statusUpToDate: return exitUpToDate @@ -94,149 +74,213 @@ func checkDeployedRelease(ctx context.Context, currentFile, apiURL string, out i } } -// checkRelease ports checkRelease. Every failure - an unusable current -// revision, an unusable endpoint, a redirect, a timeout, a non-2xx reply or -// metadata that fails validation - collapses to the same unavailable result: -// the checker never guesses that an update exists. -func checkRelease(ctx context.Context, currentRevision, apiURL, token string) releaseResult { - current := normalizeRevision(currentRevision) - if current == "" { - return unavailableResult(currentRevision) +func checkRelease(ctx context.Context, currentVersion, currentRevision, apiURL, token, mirrorURL string) releaseResult { + result := unavailableResult(currentVersion, currentRevision) + comparableVersion := result.CurrentVersion != nil && semver.IsValid(*result.CurrentVersion) + if !comparableVersion && result.CurrentRevision == nil { + return result } + version, revision, releaseURL, ok := fetchLatestRelease(ctx, apiURL, token, false) + if !ok && mirrorURL != "" { + version, revision, releaseURL, ok = fetchLatestRelease(ctx, mirrorURL, "", true) + } + if !ok { + return result + } + result.LatestVersion = &version + result.LatestRevision = revisionOrNull(revision) + result.ReleaseURL = &releaseURL + if comparableVersion { + result.Status = statusUpToDate + order := semver.Compare(version, *result.CurrentVersion) + if order > 0 { + result.Status = statusUpdateAvailable + } else if order == 0 && result.CurrentRevision != nil && result.LatestRevision != nil && + *result.CurrentRevision != *result.LatestRevision { + result.Status = statusDifferentBuild + } + } else if result.CurrentRevision != nil && result.LatestRevision != nil { + result.Status = statusOfficialRelease + if *result.CurrentRevision == *result.LatestRevision { + result.Status = statusUpToDate + } + } + return result +} + +// Routine startup only announces actionable release choices. An unavailable +// provider is not a server failure, and never changes the running installation. +func logReleaseNotice(logger *slog.Logger, result releaseResult) { + var message string + switch result.Status { + case statusUpdateAvailable: + message = "A newer Piik release is available" + case statusDifferentBuild: + message = "This Piik build differs from the official release" + case statusOfficialRelease: + message = "An official Piik release is available" + default: + return + } + current := "development" + if result.CurrentVersion != nil { + current = *result.CurrentVersion + } + logger.Info(message, "event", "release-check", "status", result.Status, + "currentVersion", current, "latestVersion", *result.LatestVersion, "releaseUrl", *result.ReleaseURL) +} + +func fetchLatestRelease(ctx context.Context, apiURL, token string, mirror bool) (version, revision, releaseURL string, ok bool) { endpoint, err := url.Parse(apiURL) if err != nil || (endpoint.Scheme != "https" && endpoint.Scheme != "http") { - return unavailableResult(current) + return "", "", "", false } - ctx, cancel := context.WithTimeout(ctx, releaseTimeout) defer cancel() + for page := 1; page <= 10; page++ { + if mirror { + query := endpoint.Query() + query.Set("per_page", "100") + query.Set("page", fmt.Sprint(page)) + query.Set("direction", "desc") + endpoint.RawQuery = query.Encode() + } + body, err := readReleaseResponse(ctx, endpoint, token, mirror) + if err != nil { + return "", "", "", false + } + if !mirror { + return parseReleaseMetadata(body) + } + var releases []json.RawMessage + if err := json.Unmarshal(body, &releases); err != nil || releases == nil || len(releases) > 100 { + return "", "", "", false + } + for _, payload := range releases { + candidateVersion, candidateRevision, candidateURL, valid := parseMirrorReleaseMetadata(payload) + if valid && (!ok || semver.Compare(candidateVersion, version) > 0) { + version, revision, releaseURL, ok = candidateVersion, candidateRevision, candidateURL, true + } + } + if len(releases) < 100 { + return + } + } + // Incomplete pagination cannot establish the highest stable version. + return "", "", "", false +} + +func readReleaseResponse(ctx context.Context, endpoint *url.URL, token string, mirror bool) ([]byte, error) { request, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint.String(), nil) if err != nil { - return unavailableResult(current) + return nil, err } - request.Header.Set("Accept", "application/vnd.github+json") - request.Header.Set("X-GitHub-Api-Version", "2022-11-28") + request.Header.Set("Accept", "application/json") request.Header.Set("User-Agent", "Piik-release-check") - if authorizesGitHub(endpoint, token) { - request.Header.Set("Authorization", "Bearer "+strings.TrimSpace(token)) + if !mirror { + request.Header.Set("Accept", "application/vnd.github+json") + request.Header.Set("X-GitHub-Api-Version", "2022-11-28") + if authorizesGitHub(endpoint, token) { + request.Header.Set("Authorization", "Bearer "+strings.TrimSpace(token)) + } } - client := &http.Client{CheckRedirect: func(*http.Request, []*http.Request) error { - // The ported redirect: "error" policy. A moved release endpoint is not - // followed, so the Authorization header cannot travel to another origin. return errors.New("release endpoint redirected") }} response, err := client.Do(request) if err != nil { - return unavailableResult(current) + return nil, err } defer response.Body.Close() if response.StatusCode < 200 || response.StatusCode > 299 { - return unavailableResult(current) + return nil, errors.New("release endpoint unavailable") } - body, err := io.ReadAll(response.Body) - if err != nil { - return unavailableResult(current) - } - latest, releaseURL, ok := parseReleaseMetadata(body) - if !ok { - return unavailableResult(current) - } - status := statusUpdateAvailable - if latest == current { - status = statusUpToDate - } - return releaseResult{ - Status: status, - CurrentRevision: ¤t, - LatestRevision: &latest, - ReleaseURL: &releaseURL, + const limit = 4 << 20 + body, err := io.ReadAll(io.LimitReader(response.Body, limit+1)) + if err != nil || len(body) > limit { + return nil, errors.New("release metadata unreadable or too large") } + return body, nil } -// authorizesGitHub reports whether the operator token may be sent to endpoint. -// A fixture, mirror or plaintext endpoint must never receive it, which is why -// the scheme and the host are both part of the rule. +// Only the HTTPS GitHub API receives an operator token, and redirects are refused. func authorizesGitHub(endpoint *url.URL, token string) bool { return endpoint.Scheme == "https" && strings.ToLower(endpoint.Hostname()) == releaseAPIHost && strings.TrimSpace(token) != "" } -// unavailableResult is unavailableResult: the current revision is reported when -// it is well formed and null otherwise. -func unavailableResult(currentRevision string) releaseResult { - return releaseResult{Status: statusUnavailable, CurrentRevision: revisionOrNull(currentRevision)} +func unavailableResult(currentVersion, currentRevision string) releaseResult { + currentVersion = strings.TrimSpace(currentVersion) + if canonical := semver.Canonical(currentVersion); canonical != "" { + currentVersion = canonical + } + result := releaseResult{Status: statusUnavailable, CurrentRevision: revisionOrNull(currentRevision)} + if currentVersion != "" { + result.CurrentVersion = ¤tVersion + } + return result } func revisionOrNull(value string) *string { - revision := normalizeRevision(value) - if revision == "" { + revision := strings.ToLower(strings.TrimSpace(value)) + if !fullRevisionPattern.MatchString(revision) { return nil } return &revision } -// normalizeRevision ports normalizeRevision, returning "" where it returned -// null: only a full 40-hex commit identifies a release. -func normalizeRevision(value string) string { - revision := strings.ToLower(strings.TrimSpace(value)) - if !fullRevisionPattern.MatchString(revision) { - return "" - } - return revision -} - -// releaseMetadata is the subset of the GitHub release payload that is read. -// A tag_name or html_url of another type fails to decode, which is the -// rejection the JavaScript reached through typeof. Deviation: the JavaScript -// tested `draft === true`, so it read a draft of another type as "not a -// draft"; here such a payload fails to decode and the check reports -// unavailable. Only stricter, and a release payload the checker cannot -// understand must never be reported as an update. type releaseMetadata struct { - TagName *string `json:"tag_name"` - HTMLURL *string `json:"html_url"` - Draft *bool `json:"draft"` - Prerelease *bool `json:"prerelease"` + TagName string `json:"tag_name"` + HTMLURL string `json:"html_url"` + TargetCommitish string `json:"target_commitish"` + Draft bool `json:"draft"` + Prerelease bool `json:"prerelease"` } -// parseReleaseMetadata ports parseReleaseMetadata. It accepts one shape only: a -// published, non-draft release whose tag is a full commit revision and whose -// page is exactly https://github.com/TNTcraftHIM/Piik/releases/tag/ with no credentials, port, query or fragment. The returned URL is -// rebuilt from the validated parts so nothing unverified reaches the operator. -func parseReleaseMetadata(payload []byte) (revision string, releaseURL string, ok bool) { +// A branch-valued target_commitish is unknown provenance, never a source SHA. +func parseReleaseMetadata(payload []byte) (version, revision, releaseURL string, ok bool) { var metadata releaseMetadata if err := json.Unmarshal(payload, &metadata); err != nil { - return "", "", false + return "", "", "", false } - if (metadata.Draft != nil && *metadata.Draft) || - (metadata.Prerelease != nil && *metadata.Prerelease) { - return "", "", false - } - if metadata.TagName == nil || metadata.HTMLURL == nil { - return "", "", false - } - revision = normalizeRevision(*metadata.TagName) - if revision == "" { - return "", "", false - } - parsed, err := url.Parse(*metadata.HTMLURL) - if err != nil || parsed.Scheme != "https" || - strings.ToLower(parsed.Hostname()) != releaseHost || parsed.User != nil || - parsed.Port() != "" || parsed.RawQuery != "" || parsed.Fragment != "" { - return "", "", false - } - // The escaped path is compared, so an encoded separator such as %2F cannot - // smuggle another path past the prefix the way the decoded form would. - path := parsed.EscapedPath() - if !strings.HasPrefix(path, releasePathPrefix) { - return "", "", false - } - tag, err := url.PathUnescape(strings.TrimPrefix(path, releasePathPrefix)) - if err != nil || normalizeRevision(tag) != revision { - return "", "", false - } - return revision, "https://" + releaseHost + path, true + return normalizeReleaseMetadata(metadata) +} + +func normalizeReleaseMetadata(metadata releaseMetadata) (version, revision, releaseURL string, ok bool) { + if metadata.Draft || metadata.Prerelease { + return "", "", "", false + } + version = metadata.TagName + if version == "" || semver.Canonical(version) != version || semver.Prerelease(version) != "" || + metadata.HTMLURL != releaseURLPrefix+version { + return "", "", "", false + } + if source := revisionOrNull(metadata.TargetCommitish); source != nil { + revision = *source + } + return version, revision, metadata.HTMLURL, true +} + +func parseMirrorReleaseMetadata(payload []byte) (version, revision, releaseURL string, ok bool) { + var metadata struct { + TagName string `json:"tag_name"` + Body string `json:"body"` + Prerelease *bool `json:"prerelease"` + } + if err := json.Unmarshal(payload, &metadata); err != nil || metadata.Prerelease == nil || *metadata.Prerelease { + return "", "", "", false + } + sources := mirrorSourcePattern.FindAllStringSubmatch(metadata.Body, -1) + if len(sources) != 1 { + return "", "", "", false + } + // The mirror's target_commitish identifies its README, not the original source. + version, revision, _, ok = normalizeReleaseMetadata(releaseMetadata{ + TagName: metadata.TagName, TargetCommitish: sources[0][1], HTMLURL: releaseURLPrefix + metadata.TagName, + }) + if !ok { + return "", "", "", false + } + return version, revision, mirrorReleasePrefix + version, true } diff --git a/cmd/piik-server/release_test.go b/cmd/piik-server/release_test.go index 53f9e52..0a0feb9 100644 --- a/cmd/piik-server/release_test.go +++ b/cmd/piik-server/release_test.go @@ -4,202 +4,174 @@ import ( "bytes" "context" "encoding/json" + "log/slog" "net/http" "net/http/httptest" "net/url" "os" - "path/filepath" "strings" "testing" ) const ( + deployedVersion = "v1.9.0" + latestVersion = "v1.10.0" deployedRevision = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" latestRevision = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" - latestReleaseURL = "https://github.com/TNTcraftHIM/Piik/releases/tag/" + latestRevision - latestRelease = `{"tag_name":"` + latestRevision + `","html_url":"` + latestReleaseURL + `"}` + latestReleaseURL = "https://github.com/TNTcraftHIM/Piik/releases/tag/" + latestVersion + latestRelease = `{"tag_name":"` + latestVersion + `","html_url":"` + latestReleaseURL + `","target_commitish":"` + latestRevision + `"}` ) +func TestReleaseNoticeUsesOperatorLogsOnlyForAvailableChoices(t *testing.T) { + for _, status := range []string{statusUpdateAvailable, statusDifferentBuild, statusOfficialRelease, statusUpToDate, statusUnavailable} { + t.Run(status, func(t *testing.T) { + var output bytes.Buffer + version, releaseURL := latestVersion, latestReleaseURL + logReleaseNotice(slog.New(slog.NewJSONHandler(&output, nil)), releaseResult{ + Status: status, LatestVersion: &version, ReleaseURL: &releaseURL, + }) + if status == statusUpToDate || status == statusUnavailable { + if output.Len() != 0 { + t.Fatalf("non-actionable check produced a notice: %s", output.String()) + } + return + } + var entry map[string]any + if err := json.Unmarshal(output.Bytes(), &entry); err != nil { + t.Fatal(err) + } + if entry["status"] != status || entry["currentVersion"] != "development" || + entry["latestVersion"] != latestVersion || entry["releaseUrl"] != latestReleaseURL || entry["level"] != "INFO" { + t.Fatalf("release notice lost its version or download action: %v", entry) + } + if status == statusDifferentBuild && strings.Contains(entry["msg"].(string), "newer") { + t.Fatal("SHA inequality was presented as release ordering") + } + }) + } +} + func TestParseReleaseMetadataAcceptsOnlyTheStrictReleaseIdentity(t *testing.T) { - tagged := func(page string) string { - return `{"tag_name":"` + latestRevision + `","html_url":"` + page + `"}` + tagged := func(version, page string) string { + return `{"tag_name":"` + version + `","html_url":"` + page + `"}` } testCases := []struct { - name string - payload string - revision string - url string + name, payload, version, revision, url string }{ - {"published release", latestRelease, latestRevision, latestReleaseURL}, - { - "uppercase tag normalizes", - `{"tag_name":"` + strings.ToUpper(latestRevision) + `","html_url":"` + latestReleaseURL + `"}`, - latestRevision, latestReleaseURL, - }, - {"short tag", `{"tag_name":"short","html_url":"` + latestReleaseURL + `"}`, "", ""}, - {"other host", tagged("https://evil.example"), "", ""}, - { - "userinfo", - tagged("https://user@github.com/TNTcraftHIM/Piik/releases/tag/" + latestRevision), - "", "", - }, - { - "port", - tagged("https://github.com:8443/TNTcraftHIM/Piik/releases/tag/" + latestRevision), - "", "", - }, - { - "plaintext page", - tagged("http://github.com/TNTcraftHIM/Piik/releases/tag/" + latestRevision), - "", "", - }, - {"query", tagged(latestReleaseURL + "?asset=1"), "", ""}, - {"fragment", tagged(latestReleaseURL + "#assets"), "", ""}, - { - "encoded path separator", - tagged("https://github.com/TNTcraftHIM%2FPiik/releases/tag/" + latestRevision), - "", "", - }, - { - "page tag disagrees with the release tag", - tagged("https://github.com/TNTcraftHIM/Piik/releases/tag/" + deployedRevision), - "", "", - }, - { - "draft", - `{"tag_name":"` + latestRevision + `","html_url":"` + latestReleaseURL + `","draft":true}`, - "", "", - }, - { - "prerelease", - `{"tag_name":"` + latestRevision + `","html_url":"` + latestReleaseURL + `","prerelease":true}`, - "", "", - }, - {"missing page", `{"tag_name":"` + latestRevision + `"}`, "", ""}, - {"array payload", `[]`, "", ""}, - {"not an object", `"released"`, "", ""}, - {"not json", `nonsense`, "", ""}, + {"published release", latestRelease, latestVersion, latestRevision, latestReleaseURL}, + {"uppercase source normalizes", strings.Replace(latestRelease, latestRevision, strings.ToUpper(latestRevision), 1), latestVersion, latestRevision, latestReleaseURL}, + {"branch source is unknown", strings.Replace(latestRelease, latestRevision, "main", 1), latestVersion, "", latestReleaseURL}, + {"missing source is unknown", tagged(latestVersion, latestReleaseURL), latestVersion, "", latestReleaseURL}, + {"short source is unknown", strings.Replace(latestRelease, latestRevision, "bbbbbbb", 1), latestVersion, "", latestReleaseURL}, + {"old SHA tag", tagged(latestRevision, releaseURLPrefix+latestRevision), "", "", ""}, + {"short version", tagged("v1", releaseURLPrefix+"v1"), "", "", ""}, + {"missing v prefix", tagged("1.10.0", releaseURLPrefix+"1.10.0"), "", "", ""}, + {"prerelease version", tagged("v1.10.0-rc.1", releaseURLPrefix+"v1.10.0-rc.1"), "", "", ""}, + {"build suffix", tagged("v1.10.0+build", releaseURLPrefix+"v1.10.0+build"), "", "", ""}, + {"other host", tagged(latestVersion, "https://evil.example"), "", "", ""}, + {"userinfo", tagged(latestVersion, "https://user@github.com/TNTcraftHIM/Piik/releases/tag/"+latestVersion), "", "", ""}, + {"port", tagged(latestVersion, "https://github.com:8443/TNTcraftHIM/Piik/releases/tag/"+latestVersion), "", "", ""}, + {"plaintext page", tagged(latestVersion, "http://github.com/TNTcraftHIM/Piik/releases/tag/"+latestVersion), "", "", ""}, + {"query", tagged(latestVersion, latestReleaseURL+"?asset=1"), "", "", ""}, + {"fragment", tagged(latestVersion, latestReleaseURL+"#assets"), "", "", ""}, + {"encoded path separator", tagged(latestVersion, "https://github.com/TNTcraftHIM%2FPiik/releases/tag/"+latestVersion), "", "", ""}, + {"mismatched page tag", tagged(latestVersion, releaseURLPrefix+deployedVersion), "", "", ""}, + {"draft", strings.TrimSuffix(latestRelease, "}") + `,"draft":true}`, "", "", ""}, + {"prerelease", strings.TrimSuffix(latestRelease, "}") + `,"prerelease":true}`, "", "", ""}, + {"missing page", `{"tag_name":"` + latestVersion + `"}`, "", "", ""}, + {"array payload", `[]`, "", "", ""}, + {"not an object", `"released"`, "", "", ""}, + {"not json", `nonsense`, "", "", ""}, } for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { - revision, releaseURL, ok := parseReleaseMetadata([]byte(testCase.payload)) - if ok != (testCase.revision != "") || revision != testCase.revision || - releaseURL != testCase.url { - t.Fatalf("parseReleaseMetadata(%s) = %q, %q, %t; want %q, %q", - testCase.payload, revision, releaseURL, ok, testCase.revision, testCase.url) + version, revision, releaseURL, ok := parseReleaseMetadata([]byte(testCase.payload)) + if ok != (testCase.version != "") || version != testCase.version || revision != testCase.revision || releaseURL != testCase.url { + t.Fatalf("parseReleaseMetadata = %q, %q, %q, %t; want %q, %q, %q", + version, revision, releaseURL, ok, testCase.version, testCase.revision, testCase.url) } }) } } func TestCheckReleaseReportsTheDeployedComparison(t *testing.T) { + branchRelease := strings.Replace(latestRelease, latestRevision, "main", 1) testCases := []struct { - name string - current string - status int - body string - wantStatus string - wantCurrent string - wantLatest string - wantReleaseURL string - wantRequestSent bool + name, version, revision, body, wantStatus, wantLatest string }{ - { - name: "newer release", current: deployedRevision, status: http.StatusOK, - body: latestRelease, wantStatus: "update-available", wantCurrent: deployedRevision, - wantLatest: latestRevision, wantReleaseURL: latestReleaseURL, wantRequestSent: true, - }, - { - name: "same release", current: latestRevision, status: http.StatusOK, - body: latestRelease, wantStatus: "up-to-date", wantCurrent: latestRevision, - wantLatest: latestRevision, wantReleaseURL: latestReleaseURL, wantRequestSent: true, - }, - { - name: "endpoint unavailable", current: deployedRevision, - status: http.StatusServiceUnavailable, body: "offline", - wantStatus: "unavailable", wantCurrent: deployedRevision, wantRequestSent: true, - }, - { - name: "unusable metadata", current: deployedRevision, status: http.StatusOK, - body: `{"tag_name":"v1","html_url":"https://evil.example"}`, - // The published page failed validation, so no update is claimed. - wantStatus: "unavailable", wantCurrent: deployedRevision, wantRequestSent: true, - }, - { - name: "deployed revision is not a release", current: "development", - status: http.StatusOK, body: latestRelease, - // No request at all: the check cannot compare an unknown deployment. - wantStatus: "unavailable", wantCurrent: "", wantRequestSent: false, - }, + {"newer numeric version", deployedVersion, deployedRevision, latestRelease, statusUpdateAvailable, latestRevision}, + {"newer version of same source", deployedVersion, latestRevision, latestRelease, statusUpdateAvailable, latestRevision}, + {"older version", "v2.0.0", deployedRevision, latestRelease, statusUpToDate, latestRevision}, + {"same version and source", latestVersion, latestRevision, latestRelease, statusUpToDate, latestRevision}, + {"same version with different source", latestVersion, deployedRevision, latestRelease, statusDifferentBuild, latestRevision}, + {"development has an official choice", "development", deployedRevision, latestRelease, statusOfficialRelease, latestRevision}, + {"development has same source", "development", latestRevision, latestRelease, statusUpToDate, latestRevision}, + {"other unversioned build", "custom-build", deployedRevision, latestRelease, statusOfficialRelease, latestRevision}, + {"local prerelease", "v1.10.0-rc.1", deployedRevision, latestRelease, statusUpdateAvailable, latestRevision}, + {"newer version without known remote source", deployedVersion, deployedRevision, branchRelease, statusUpdateAvailable, ""}, + {"same version without known remote source", latestVersion, deployedRevision, branchRelease, statusUpToDate, ""}, + {"development without known remote source", "development", deployedRevision, branchRelease, statusUnavailable, ""}, + {"newer version without known local source", deployedVersion, "", latestRelease, statusUpdateAvailable, latestRevision}, } for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { - requested := false - server := httptest.NewServer(http.HandlerFunc( - func(writer http.ResponseWriter, request *http.Request) { - requested = true - if got := request.Header.Get("Accept"); got != "application/vnd.github+json" { - t.Errorf("Accept = %q", got) - } - if got := request.Header.Get("X-GitHub-Api-Version"); got != "2022-11-28" { - t.Errorf("X-GitHub-Api-Version = %q", got) - } - if got := request.Header.Get("User-Agent"); got != "Piik-release-check" { - t.Errorf("User-Agent = %q", got) - } - writer.WriteHeader(testCase.status) - _, _ = writer.Write([]byte(testCase.body)) - })) + server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + if request.Header.Get("Accept") != "application/vnd.github+json" || + request.Header.Get("X-GitHub-Api-Version") != "2022-11-28" || request.Header.Get("User-Agent") != "Piik-release-check" { + t.Error("release request headers changed") + } + _, _ = writer.Write([]byte(testCase.body)) + })) defer server.Close() - - result := checkRelease(t.Context(), testCase.current, server.URL, "") - if requested != testCase.wantRequestSent { - t.Fatalf("endpoint requested = %t; want %t", requested, testCase.wantRequestSent) - } - assertResult(t, result, testCase.wantStatus, testCase.wantCurrent, - testCase.wantLatest, testCase.wantReleaseURL) + result := checkRelease(t.Context(), testCase.version, testCase.revision, server.URL, "", "") + assertResult(t, result, testCase.wantStatus, testCase.version, latestVersion, testCase.revision, testCase.wantLatest, latestReleaseURL) }) } } func TestCheckReleaseFailsClosedWithoutAUsableEndpoint(t *testing.T) { - redirect := httptest.NewServer(http.HandlerFunc( - func(writer http.ResponseWriter, request *http.Request) { - http.Redirect(writer, request, "https://evil.example/releases", http.StatusFound) - })) + redirect := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + http.Redirect(writer, request, "https://evil.example/releases", http.StatusFound) + })) defer redirect.Close() - reachable := httptest.NewServer(http.HandlerFunc( - func(writer http.ResponseWriter, _ *http.Request) { - _, _ = writer.Write([]byte(latestRelease)) - })) + reachable := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { + _, _ = writer.Write([]byte(latestRelease)) + })) defer reachable.Close() - + unavailable := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { + writer.WriteHeader(http.StatusServiceUnavailable) + })) + defer unavailable.Close() + malformed := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { + _, _ = writer.Write([]byte(`{"tag_name":"v1","html_url":"https://evil.example"}`)) + })) + defer malformed.Close() cancelled, cancel := context.WithCancel(t.Context()) cancel() - testCases := []struct { - name string - ctx context.Context - apiURL string + for _, testCase := range []struct { + name, apiURL string + ctx context.Context }{ - {"redirected endpoint", t.Context(), redirect.URL}, - {"unsupported scheme", t.Context(), "file:///etc/passwd"}, - {"relative endpoint", t.Context(), "releases/latest"}, - {"cancelled check", cancelled, reachable.URL}, - } - for _, testCase := range testCases { + {"redirected endpoint", redirect.URL, t.Context()}, + {"unsupported scheme", "file:///etc/passwd", t.Context()}, + {"relative endpoint", "releases/latest", t.Context()}, + {"cancelled check", reachable.URL, cancelled}, + {"server unavailable", unavailable.URL, t.Context()}, + {"unusable metadata", malformed.URL, t.Context()}, + } { t.Run(testCase.name, func(t *testing.T) { - result := checkRelease(testCase.ctx, deployedRevision, testCase.apiURL, "") - assertResult(t, result, "unavailable", deployedRevision, "", "") + result := checkRelease(testCase.ctx, deployedVersion, deployedRevision, testCase.apiURL, "", "") + assertResult(t, result, statusUnavailable, deployedVersion, "", deployedRevision, "", "") }) } + result := checkRelease(t.Context(), "development", "unknown", "", "", "") + assertResult(t, result, statusUnavailable, "development", "", "", "", "") } func TestOperatorTokenReachesGitHubOnly(t *testing.T) { - endpoints := []struct { - name string - url string - token string - authorized bool + for _, endpoint := range []struct { + name, url, token string + authorized bool }{ {"github api", defaultReleaseAPIURL, "operator-token", true}, {"github api with padded token", defaultReleaseAPIURL, " operator-token ", true}, @@ -208,95 +180,143 @@ func TestOperatorTokenReachesGitHubOnly(t *testing.T) { {"release host", "https://github.com/repos", "operator-token", false}, {"local fixture", "http://127.0.0.1:8787/releases/latest", "operator-token", false}, {"lookalike host", "https://api.github.com.evil.example/x", "operator-token", false}, - } - for _, endpoint := range endpoints { + } { t.Run(endpoint.name, func(t *testing.T) { parsed, err := url.Parse(endpoint.url) if err != nil { t.Fatal(err) } if got := authorizesGitHub(parsed, endpoint.token); got != endpoint.authorized { - t.Fatalf("authorizesGitHub(%q) = %t; want %t", - endpoint.url, got, endpoint.authorized) + t.Fatalf("authorizesGitHub(%q) = %t; want %t", endpoint.url, got, endpoint.authorized) } }) } var received http.Header - fixture := httptest.NewServer(http.HandlerFunc( - func(writer http.ResponseWriter, request *http.Request) { - received = request.Header.Clone() - _, _ = writer.Write([]byte(latestRelease)) - })) + fixture := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + received = request.Header.Clone() + _, _ = writer.Write([]byte(latestRelease)) + })) defer fixture.Close() - checkRelease(t.Context(), deployedRevision, fixture.URL, "fixture-secret") + checkRelease(t.Context(), deployedVersion, deployedRevision, fixture.URL, "fixture-secret", "") if authorization := received.Get("Authorization"); authorization != "" { t.Fatalf("fixture endpoint received %q", authorization) } } -func TestCheckDeployedReleasePrintsOneLineAndTheOperatorExitCode(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc( - func(writer http.ResponseWriter, _ *http.Request) { - _, _ = writer.Write([]byte(latestRelease)) - })) +func TestCheckDeployedReleaseUsesTheBinaryIdentityAndOperatorExitCode(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { + _, _ = writer.Write([]byte(latestRelease)) + })) defer server.Close() - - testCases := []struct { - name string - revision string - wantCode int - wantJSON string + originalVersion, originalRevision := BuildVersion, BuildRevision + t.Cleanup(func() { BuildVersion, BuildRevision = originalVersion, originalRevision }) + for _, testCase := range []struct { + name, version, revision, status string + code int }{ - { - "update available", deployedRevision + "\n", exitUpdateAvailable, - `{"status":"update-available","currentRevision":"` + deployedRevision + - `","latestRevision":"` + latestRevision + - `","releaseUrl":"` + latestReleaseURL + `"}`, - }, - { - "up to date", latestRevision, exitUpToDate, - `{"status":"up-to-date","currentRevision":"` + latestRevision + - `","latestRevision":"` + latestRevision + - `","releaseUrl":"` + latestReleaseURL + `"}`, - }, - { - "unreadable deployment", "", exitUpdateUnavailable, - `{"status":"unavailable","currentRevision":null,` + - `"latestRevision":null,"releaseUrl":null}`, - }, - } - for _, testCase := range testCases { + {"newer release", deployedVersion, deployedRevision, statusUpdateAvailable, exitUpdateAvailable}, + {"different build", latestVersion, deployedRevision, statusDifferentBuild, exitUpdateAvailable}, + {"official release", "development", deployedRevision, statusOfficialRelease, exitUpdateAvailable}, + {"up to date", latestVersion, latestRevision, statusUpToDate, exitUpToDate}, + {"unknown build", "development", "development", statusUnavailable, exitUpdateUnavailable}, + } { t.Run(testCase.name, func(t *testing.T) { - currentFile := filepath.Join(t.TempDir(), "REVISION") - if testCase.revision != "" { - if err := os.WriteFile(currentFile, []byte(testCase.revision), 0o600); err != nil { - t.Fatal(err) - } - } + BuildVersion, BuildRevision = testCase.version, testCase.revision var out bytes.Buffer - code := checkDeployedRelease(t.Context(), currentFile, server.URL, &out) - if code != testCase.wantCode || out.String() != testCase.wantJSON+"\n" { - t.Fatalf("checkDeployedRelease = %d, %q; want %d, %q", - code, out.String(), testCase.wantCode, testCase.wantJSON+"\n") + code := checkDeployedRelease(t.Context(), server.URL, &out) + if code != testCase.code || strings.Count(out.String(), "\n") != 1 { + t.Fatalf("checkDeployedRelease = %d, %q; want code %d and one line", code, out.String(), testCase.code) + } + var result releaseResult + if err := json.Unmarshal(out.Bytes(), &result); err != nil { + t.Fatal(err) + } + if testCase.status == statusUnavailable { + assertResult(t, result, testCase.status, testCase.version, "", "", "", "") + } else { + assertResult(t, result, testCase.status, testCase.version, latestVersion, testCase.revision, latestRevision, latestReleaseURL) } }) } } -// assertResult compares the whole result through its JSON form so a value that -// must be null is distinguished from one that is merely empty. -func assertResult(t *testing.T, result releaseResult, status, current, latest, releaseURL string) { +func TestMirrorFallbackUsesOriginalSourceAndCompleteStablePagination(t *testing.T) { + payload, err := os.ReadFile("../../tests/fixtures/mirror-releases.json") + if err != nil { + t.Fatal(err) + } + var releases []json.RawMessage + if err := json.Unmarshal(payload, &releases); err != nil { + t.Fatal(err) + } + for i, raw := range releases { + _, revision, _, ok := parseMirrorReleaseMetadata(raw) + if ok != (i < 2) || (ok && revision != latestRevision) { + t.Fatalf("mirror fixture %d: accepted=%t revision=%s", i, ok, revision) + } + } + primaryAvailable, truncate := false, false + primary := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if primaryAvailable { + _, _ = w.Write([]byte(latestRelease)) + } else { + w.WriteHeader(http.StatusServiceUnavailable) + } + })) + defer primary.Close() + mirrorCalls := 0 + mirror := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + mirrorCalls++ + if r.Header.Get("Authorization") != "" || r.Header.Get("X-GitHub-Api-Version") != "" || + r.Header.Get("Accept") != "application/json" { + t.Error("mirror received credentials or GitHub headers") + } + if r.URL.Query().Get("per_page") != "100" || r.URL.Query().Get("direction") != "desc" { + t.Error("mirror pagination missing") + } + if r.URL.Query().Get("page") == "1" || truncate { + page := make([]json.RawMessage, 100) + for i := range page { + page[i] = releases[0] + } + _ = json.NewEncoder(w).Encode(page) + } else { + _, _ = w.Write(payload) + } + })) + defer mirror.Close() + result := checkRelease(t.Context(), deployedVersion, deployedRevision, primary.URL, "operator-secret", mirror.URL) + assertResult(t, result, statusUpdateAvailable, deployedVersion, latestVersion, deployedRevision, latestRevision, mirrorReleasePrefix+latestVersion) + if mirrorCalls != 2 { + t.Fatalf("mirror calls = %d", mirrorCalls) + } + result = checkRelease(t.Context(), "v2.0.0", deployedRevision, primary.URL, "", mirror.URL) + if result.Status != statusUpToDate { + t.Fatal("a lagging mirror offered a downgrade") + } + truncate = true + result = checkRelease(t.Context(), deployedVersion, deployedRevision, primary.URL, "", mirror.URL) + if result.Status != statusUnavailable { + t.Fatal("an incomplete mirror list was accepted") + } + primaryAvailable = true + mirrorCalls = 0 + result = checkRelease(t.Context(), latestVersion, latestRevision, primary.URL, "", mirror.URL) + if result.Status != statusUpToDate || mirrorCalls != 0 { + t.Fatal("a usable primary release consulted the mirror") + } +} + +func assertResult(t *testing.T, result releaseResult, status, currentVersion, latestVersion, currentRevision, latestRevision, releaseURL string) { t.Helper() payload, err := json.Marshal(result) if err != nil { t.Fatal(err) } expected, err := json.Marshal(releaseResult{ - Status: status, - CurrentRevision: reported(current), - LatestRevision: reported(latest), - ReleaseURL: reported(releaseURL), + Status: status, CurrentVersion: reported(currentVersion), LatestVersion: reported(latestVersion), + CurrentRevision: reported(currentRevision), LatestRevision: reported(latestRevision), ReleaseURL: reported(releaseURL), }) if err != nil { t.Fatal(err) @@ -306,24 +326,9 @@ func assertResult(t *testing.T, result releaseResult, status, current, latest, r } } -// reported turns the empty test expectation into the JSON null the result uses. func reported(value string) *string { if value == "" { return nil } return &value } - -// release-update.mjs parseArguments threw the usage string and set -// process.exitCode = 2 when --current-file was absent, so the operator could -// tell a forgotten argument from a check that could not reach GitHub. -func TestCheckDeployedReleaseWithoutACurrentFileIsAUsageError(t *testing.T) { - var out bytes.Buffer - code := checkDeployedRelease(context.Background(), "", defaultReleaseAPIURL, &out) - if code != exitUsage { - t.Fatalf("exit code = %d, want %d", code, exitUsage) - } - if out.Len() != 0 { - t.Fatalf("a usage error wrote %q, want no result line", out.String()) - } -} diff --git a/deploy/check-release.sh b/deploy/check-release.sh index a800fd0..148fc78 100644 --- a/deploy/check-release.sh +++ b/deploy/check-release.sh @@ -1,11 +1,9 @@ #!/bin/bash set -Eeuo pipefail -if [ "$#" -gt 1 ]; then - printf 'usage: %s [current-revision-file]\n' "$0" >&2 +if [ "$#" -ne 0 ]; then + printf 'usage: %s\n' "$0" >&2 exit 2 fi -current_file="${1:-/opt/piik/current/REVISION}" - -exec /opt/piik/current/piik-server --check-release --current-file "$current_file" +exec /opt/piik/current/piik-server --check-release diff --git a/deploy/nginx/share.bonfire.icu.conf.example b/deploy/nginx/piik.conf.example similarity index 88% rename from deploy/nginx/share.bonfire.icu.conf.example rename to deploy/nginx/piik.conf.example index c920c93..a0bfb3f 100644 --- a/deploy/nginx/share.bonfire.icu.conf.example +++ b/deploy/nginx/piik.conf.example @@ -8,7 +8,7 @@ limit_req_zone $binary_remote_addr zone=piik_site_access:10m rate=5r/m; server { listen 80; listen [::]:80; - server_name share.bonfire.icu; + server_name share.example.com; location ^~ /.well-known/acme-challenge/ { root /var/www/letsencrypt; @@ -16,17 +16,17 @@ server { } location / { - return 301 https://share.bonfire.icu$request_uri; + return 301 https://share.example.com$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; - server_name share.bonfire.icu; + server_name share.example.com; - ssl_certificate /etc/letsencrypt/live/share.bonfire.icu/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/share.bonfire.icu/privkey.pem; + ssl_certificate /etc/letsencrypt/live/share.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/share.example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; diff --git a/deploy/release-app.sh b/deploy/release-app.sh index 9b4434a..fe83d7d 100644 --- a/deploy/release-app.sh +++ b/deploy/release-app.sh @@ -26,7 +26,8 @@ descriptor_text() { sed -n "s|^ \"$1\": \"\([A-Za-z0-9._/-]*\)\",\{0,1\}\$|\1|p" "$descriptor" } -grep -qx ' "schema": 1,' "$descriptor" +grep -qx ' "schema": 2,' "$descriptor" +version="$(descriptor_text version)" revision="$(descriptor_text revision)" release_id="$(descriptor_text releaseId)" artifact_name="$(descriptor_text artifact)" @@ -37,6 +38,7 @@ file_count="$(sed -n 's|^ "fileCount": \([0-9]\{1,\}\),\{0,1\}$|\1|p' "$descrip main_asset="$(descriptor_text mainAsset)" [[ "$revision" =~ ^[0-9a-f]{40}$ ]] +[[ "$version" = development || "$version" =~ ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ ]] [[ "$release_id" =~ ^[0-9a-f]{7}$ ]] test "$release_id" = "${revision:0:7}" test "$artifact_name" = "piik-${release_id}-runtime.tar.gz" @@ -232,7 +234,8 @@ test -d "$release" test ! -L "$release" test "$(stat -c '%U:%G %a' "$release")" = 'root:root 755' -firewall_before="$(nft list table inet bonfire_filter | sha256sum | awk '{print $1}')" +# Compare rules without traffic counters; no operator-specific table name. +firewall_before="$(nft --stateless list ruleset | sha256sum | awk '{print $1}')" nginx_restarts="$(systemctl show nginx.service -p NRestarts --value)" cutover_since="$(date '+%Y-%m-%d %H:%M:%S')" cutover_start="$(date +%s%3N)" @@ -249,7 +252,7 @@ health_ready="$(date +%s%3N)" test "$(systemctl show piik.service -p ActiveState --value)" = 'active' test "$(systemctl show piik.service -p NRestarts --value)" = '0' test "$(systemctl show nginx.service -p NRestarts --value)" = "$nginx_restarts" -test "$(nft list table inet bonfire_filter | sha256sum | awk '{print $1}')" = "$firewall_before" +test "$(nft --stateless list ruleset | sha256sum | awk '{print $1}')" = "$firewall_before" test "$(readlink -f -- "$current")" = "$release" pid="$(systemctl show piik.service -p MainPID --value)" test "$pid" -gt 1 diff --git a/docs/README.md b/docs/README.md index c012a17..1b7e90c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,32 +1,36 @@ -# Documentation +# Piik Documentation -[English Quick Start](../README.md) · [中文快速开始](../README.zh-CN.md) +[About Piik](../README.md) · [中文介绍](../README.zh-CN.md) · [中文上手指南](./guide/getting-started.zh-CN.md) -## Use Piik +## Guides And References -| What you need | Start here | +| Task | Guide | | --- | --- | -| Join a friend or share a screen | [Quick Start](../README.md) | -| Run App, choose a mode, or fix capture trouble | [App guide](../cmd/piik-app/README.md) | -| Collect a useful bug report | [Diagnostics and export](./reference/configuration.md#diagnostics) | -| Host your own site | [Self-hosting](./operations/self-hosting.md) | -| Configure ports, access or persistence | [Configuration reference](./reference/configuration.md) | -| Update an existing deployment | [Deployment and recovery](./deployment.md) | -| Check platform and release readiness | [Current status](./status.md) | +| Try the online demo | [Online demo](https://demo.piik.tv) · [Demo steps](./guide/getting-started.md#try-the-online-demo) | +| Watch a friend or share my first screen | [Getting started](./guide/getting-started.md) | +| Choose an App mode or fix sound and connection trouble | [First-use help](./guide/getting-started.md#choose-an-app-mode) | +| Run Piik App, check platform requirements, or build a package | [App guide](../cmd/piik-app/README.md) | +| Try or change the source code | [Run from source](#run-from-source) | +| Find a directory or the module responsible for a behavior | [Repository layout and module map](./reference/engineering.md#repository-layout) | +| Host a site for my group | [Self-hosting](./operations/self-hosting.md) · [中文部署](./operations/self-hosting.zh-CN.md) | +| Keep a server running with systemd or Docker | [Service management](./operations/service-management.md) | +| Set passwords, ports, or room storage | [Configuration](./reference/configuration.md) | +| Update my server | [Server updates](./operations/self-hosting.md#keep-it-running-and-update) | +| Build, publish or recover a maintained release | [Maintainer release tooling](./deployment.md) | +| Send a useful bug report | [Diagnostics and export](./reference/configuration.md#diagnostics) | +| Check release and platform readiness | [Current status](./status.md) | -The public entry points have English and Chinese versions. Technical references -keep one owner rather than duplicate the full documentation tree. - -Contributors should follow the [naming convention](./reference/naming.md) for -display names, commands, packages and App/Server/Browser code boundaries. +The introduction, getting-started and self-hosting guides are available in English and Chinese. +Technical references keep one shared version. ## Run from source -Use Node from [.node-version](../.node-version), npm from -[package.json](../package.json), and Go 1.26 as specified by [go.mod](../go.mod). -Node builds and serves the development UI; the application server runs in Go. +You can try the Browser application locally with Node from +[.node-version](../.node-version), npm from +[package.json](../package.json), and Go 1.26 from [go.mod](../go.mod). +Run these commands from the repository root. -Start the UI: +Start the web UI: ```sh npm ci @@ -49,49 +53,58 @@ go build -o build/dev/piik-server.exe ./cmd/piik-server ``` The fixed Windows executable path avoids repeated firewall prompts from `go run`. +Open [localhost:8787](http://localhost:8787), start sharing, and open the invitation +in another browser tab to try watching. This localhost invitation stays on your +computer; remote invitations need a reachable origin as described in +[configuration](./reference/configuration.md). +Browser capture requires `localhost` or HTTPS. -Open `http://localhost:8787`. The development UI also listens on the LAN; -screen capture requires `localhost` or HTTPS. For another invitation origin, -follow the [configuration reference](./reference/configuration.md). +For the self-contained App, follow [App development](../cmd/piik-app/README.md#development) +and [packaging](../cmd/piik-app/README.md#packaging), including the platform's +native capture requirements. -The standard checks are: +## Work on Piik + +[Contributing](../CONTRIBUTING.md) covers the workflow and choosing focused checks. +The main verification commands are: ```sh npm run check npm run check:client ``` -The [contributing guide](../CONTRIBUTING.md#verification-entrypoints) explains -native build prerequisites, focused checks and separate physical gates. +Use the [naming and copy guide](./reference/naming.md) for product names, +commands, role labels and Chinese/English voice. +Piik-owned code uses [MIT](../LICENSE); see the +[licensing guide](../licenses/README.md) for third-party components. -## Product and design +For the public website, see the [introduction design](./design/public-introduction.md) +and [website preview and publishing](./operations/website.md). -Current behavior belongs to four product modules: +## Understand the product -- [Rooms and access](./product/rooms-access.md) -- [Routing and transport](./product/routing-transport.md) -- [Capture, audio and media quality](./product/media-quality.md) -- [Presentation and lifecycle](./product/presentation-lifecycle.md) +| Topic | Its reference | +| --- | --- | +| Invitations, room codes and passwords | [Rooms and access](./product/rooms-access.md) | +| How viewers connect | [Routing and transport](./product/routing-transport.md) | +| Screen capture, quality controls and sound | [Media quality](./product/media-quality.md) | +| Host and viewer behavior | [Presentation and lifecycle](./product/presentation-lifecycle.md) | +| Why a design was chosen | [Architecture decisions](./adr/) | +| Measurements and platform limits | [Research](./research/) and [verification status](./verification-status.md) | -Key decisions cover [automatic routing](./adr/0005-automatic-hybrid-media-routing.md), -the [shared Go core](./adr/0012-shared-go-backend-core.md), -[embedded media and Native output groups](./adr/0013-embedded-node-local-media.md), -and the [Browser encoding-pool candidate](./adr/0014-browser-node-local-encoding-pool.md). -Browse [all ADRs](./adr/) for their context and consequences. +## Shared conventions -## Evidence and current work +| When changing… | Follow this owner | +| --- | --- | +| Module responsibilities or interfaces | [Engineering and contract map](./reference/engineering.md) | +| Product/tool names, role labels or copy | [Naming and copy](./reference/naming.md) | +| UI colour, illustration, motion or layout | [Visual language](./design/visual-language.md) | +| Overlays, titles or state indicators | [Media status](./design/media-status.md) | +| Releases, protocols or stored formats | [Versions and compatibility](./reference/versioning.md) | +| Main protection or automatic publishing | [GitHub operations](./operations/github.md) | +| Documentation or a duplicated rule | [Documentation ownership](./maintenance.md) | +| Checks, PRs, integration or cleanup | [Contributing](../CONTRIBUTING.md) | -- [Project memory](./project-memory.md): compact product map and invariants. -- [Status](./status.md): current source, production and acceptance boundaries. -- [TODO](./todo.md): the only work ledger. -- [Verification status](./verification-status.md): remaining physical evidence. -- [Native encoding research](./research/webrtc-encoder-pool.md) and - [Browser pooling research](./research/browser-local-encoding-pool.md): measured - results, failed controls and limits; neither promises universal performance. -- [Research directory](./research/): transport, capture, platform and backend evidence. -- [Maintenance](./maintenance.md): document ownership and repository lifecycle. -- [Licensing](../licenses/README.md): Piik's MIT scope and third-party notices. - -Research distinguishes observations from assumptions. Product modules own -accepted behavior, source and tests own implementation detail, and Git/PRs own -completed history. +For ongoing work, use [TODO](./todo.md). [Project memory](./project-memory.md) +provides the compact product map; [status](./status.md) indexes current source +and deployment boundaries. Completed work lives in Git history and pull requests. diff --git a/docs/adr/0001-p2p-first-media-topology.md b/docs/adr/0001-p2p-first-media-topology.md index 0b8e702..a0b6e38 100644 --- a/docs/adr/0001-p2p-first-media-topology.md +++ b/docs/adr/0001-p2p-first-media-topology.md @@ -25,7 +25,7 @@ browser-first product surface but did not establish a sustainable fanout, fallback order, or server-resource policy. The MVP explicitly excluded always-SFU conferencing, public-broadcast scaling, -MCU transcoding, and a custom Parsec-like transport. Those workloads either +MCU transcoding, and a custom low-latency media transport. Those workloads either contradict the private-room cost model or duplicate mature WebRTC capabilities. ## Current Ownership diff --git a/docs/adr/0009-optional-nat-prediction.md b/docs/adr/0009-optional-nat-prediction.md index 5f6ff42..98d8c76 100644 --- a/docs/adr/0009-optional-nat-prediction.md +++ b/docs/adr/0009-optional-nat-prediction.md @@ -107,6 +107,8 @@ RTP packets to an independent Linux Pion Viewer over a selected direct host-to-srflx pair. This proves the shared-socket candidate carries DTLS-SRTP; the tested TUN network exposed only one distinct public mapping, so it does not prove a predicted candidate win. +Survey inputs, platform limits and the measured boundaries live in +[NAT traversal research](../research/nat-traversal.md). The current Native path maps selected Pion candidate foundations to the same anonymous `ordinary | predicted | unknown` evidence as Browser ICE. diff --git a/docs/adr/0012-shared-go-backend-core.md b/docs/adr/0012-shared-go-backend-core.md index 0bb496e..a60ee8d 100644 --- a/docs/adr/0012-shared-go-backend-core.md +++ b/docs/adr/0012-shared-go-backend-core.md @@ -56,18 +56,19 @@ the same Browser build. stay synchronous inside the lock and keep the current fail-fast storage policy: an unrecoverable authority write ends the process instead of continuing on divergent state. -6. LiveKit access uses the standard library: HS256 participant and service tokens - plus Twirp JSON RoomService calls over `net/http`, with the current grants, - bounded per-request timeout, per-managed-room serialization, and not-found - rule. No LiveKit SDK is added. +6. Superseded by [ADR-0013](./0013-embedded-node-local-media.md): the port initially + used standard-library tokens and Twirp calls for external LiveKit. Current + App/Server media adapters share embedded Pion/LiveKit forwarding and the + authenticated room signaling path; that external service/token layer is gone. 7. Room persistence uses the pure-Go `modernc.org/sqlite` driver over the schema, pragmas, single exclusive connection, and recovery accepted in [ADR-0002](./0002-memory-resident-protected-rooms.md). Both storage modes, their validation, and their failure policy are unchanged, and no build requires a C toolchain. -8. The port changed no contract. Signaling stayed on its then-current v21 wire; the App - loopback stays v8, capture framing stays v4, and the HTTP API, cookies, error - codes, and close codes keep their exact shapes. No compatibility alias, dual +8. The port changed no contract. At that boundary signaling was v21, App loopback + v8 and the capture probe v4; the HTTP API, cookies, error codes and close codes + retained their shapes. [Status](../status.md#accepted-release-contract) owns + the current contract tuple. No compatibility alias, dual reader, or migration is added for a change of implementation language. ## Consequences @@ -91,7 +92,7 @@ the same Browser build. production host need no Node; [deployment](../deployment.md) owns their exact commands. - Development runs two processes: the Vite dev server for the Browser bundle and - the Go application server behind it. The [README](../../README.md) owns those + the Go application server behind it. The [development guide](../README.md#run-from-source) owns those commands. - ADR-0010 items 1, 5, 7, 12 (its supervisor sentence), 13, 14, and its two-internal-process consequence are superseded and amended in place. The rest diff --git a/docs/adr/0013-embedded-node-local-media.md b/docs/adr/0013-embedded-node-local-media.md index a7845cb..7e3012e 100644 --- a/docs/adr/0013-embedded-node-local-media.md +++ b/docs/adr/0013-embedded-node-local-media.md @@ -120,3 +120,4 @@ is introduced. - [RTP switching and source projection, RFC 7667](https://www.rfc-editor.org/rfc/rfc7667) - [LiveKit demand envelope](https://github.com/livekit/livekit/blob/v1.13.6/pkg/rtc/dynacast/dynacastmanagervideo.go) - [Implementation proposal and reuse map](../research/node-local-media-design.md) +- [Embedded media evaluation](../research/embedded-media.md) diff --git a/docs/assets/quickstart.svg b/docs/assets/quickstart.svg new file mode 100644 index 0000000..d94aaac --- /dev/null +++ b/docs/assets/quickstart.svg @@ -0,0 +1,63 @@ + + Pick a screen, send an invitation, watch together + Three illustrated steps: choose a window, send its room invitation, and join friends on the sofa. Each loop pauses to let the scene settle. + + + + 01 + + + + + + + + + + 02 + + + + + + + + + 03 + + + + + + + + + + diff --git a/docs/assets/room-en-dark.png b/docs/assets/room-en-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..39b41717a433243462f628ad34c2445959b03340 GIT binary patch literal 104025 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 VIXsl(jK^z;lAQXh3R&}a{|Ad)ywd;x literal 0 HcmV?d00001 diff --git a/docs/assets/room-en-light.png b/docs/assets/room-en-light.png new file mode 100644 index 0000000000000000000000000000000000000000..84d778e75f6de2593a6095947aa114163b568466 GIT binary patch literal 103356 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ä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 literal 0 HcmV?d00001 diff --git a/docs/assets/room-zh-dark.png b/docs/assets/room-zh-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3b79ae48255e41ff4307d1ccddb40af875b21b13 GIT binary patch literal 105046 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 literal 0 HcmV?d00001 diff --git a/docs/assets/room-zh-light.png b/docs/assets/room-zh-light.png new file mode 100644 index 0000000000000000000000000000000000000000..bedfc10d14390ab6bbbd964d52ef8098e1f9be14 GIT binary patch literal 104394 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 - - - - -Piik · Brand study / 品牌预览 - - - - diff --git a/docs/design/public-introduction.md b/docs/design/public-introduction.md new file mode 100644 index 0000000..a5cb3d8 --- /dev/null +++ b/docs/design/public-introduction.md @@ -0,0 +1,148 @@ +# Public introduction + +This file owns the website and README content structure. The +[visual language](./visual-language.md) owns their shared illustration and motion. + +## One story, three readers + +Lead with friends sharing something worth seeing: a game, a drawing, a film or +travel photos. The [copy guide](../reference/naming.md#voice-and-terminology) owns +Chinese/English voice and role labels. A visitor should +understand what Piik does, choose an entry and complete the first useful action. + +| Surface | Reader's question | Content | +| --- | --- | --- | +| README, English and Chinese | What is this, and how do I start? | Brand introduction and interface preview, features, getting started, self-hosting, contribution and license | +| `site/`, for GitHub Pages | What does using it feel like, and how do I start? | Room illustration and primary download link, illustrated steps, demo/App/existing-site walkthroughs, FAQ, platform downloads, documentation and source | +| Getting-started guides | Which button or mode do I use? | Browser invitation, sharing, App setup and three mode choices | +| Self-hosting guides | How do I put my own site online? | Run the binary, set the domain and HTTPS proxy, open ports and verify; service management remains a separate reference | +| Developer and operations docs | How do I build or host it? | Existing configuration, deployment, architecture and diagnostic owners | + +The [documentation map](../README.md) is the Wiki-style entry. Link it from the +website navigation and footer, with direct self-hosting, configuration and +update/recovery links in the documentation section. Keep the guides in this +repository; do not maintain a second GitHub Wiki copy of the same instructions. + +## Presentation + +Keep three presentation responsibilities distinct: + +| Layer | Owns | Review question | +| --- | --- | --- | +| Shared identity | Mascot geometry and wink, gold sparkle, wordmark/orange dot, public-page brand control | Does this read as the same Piik at every size and entry? | +| Product demonstration | Actual components, labels, source selection, room controls and participants with sample data | Does the pictured action still match the current product? | +| Promotional composition | Original scenery, large typography, framing, transitions and optional music | Does the spectacle help a newcomer understand the product and find the next action? | + +Use one public-page brand component for the homepage and film. The mascot's +curved wink and gold sparkle are recognizable features; a prop or a pictured +game does not replace its face with another expression. Original RPG scenery +can suggest exploration through terrain, ruins and small discoveries without +borrowing another product's characters, named places, logos or artwork. + +Homepage sections follow the visitor's decisions: understand Piik and find the +primary download action, see the sharing steps, choose a short tutorial, resolve +questions, then find platform downloads, detailed documentation and source. +The primary download link lets returning visitors skip the tutorials. Guide +choices run from online demo to App to an existing site, with only the demo +expanded initially. Watching requires no installation. Explain where an existing +site comes from; mark self-hosting as advanced and link its complete guide. +Platform download cards share one App tutorial entry. Keep section navigation +available on phones rather than hiding the only route to documentation. +The film can use bolder composition, but must show real operations and concrete +benefits before its closing action. The [copy guide](../reference/naming.md#voice-and-terminology) +owns technical disclosure; a dramatic heading does not exempt copy from it. + +Review whole Chinese phrases, English meaning and adjacent number labels in +finished frames, not just the source string. Recheck the smallest viewport and +both languages when changing a title or its timing. Keep enough still time to +read it; do not solve overflow by shrinking an important caption beyond legibility. + +Use the [shared visual language](./visual-language.md) for cast, objects, +accessible interaction and motion. This document owns the website's editorial +layout and introduction, not a separate product-status vocabulary. + +Each section needs one reader question, evidence that answers it and a clear +next action. A scene should demonstrate one action or benefit before changing +the topic. Keep decorative words and transitions away from control labels and +the primary action; sound and motion must not carry essential instructions alone. +Gameplay reactions follow a visible result: establish the action, show its +success, then celebrate. Keep enough of the play visible to make the reaction +understandable; a genre label or a score burst does not replace the action. + +Use mint walls, clear control edges, a warm orange/yellow sofa and the curious TV +mascot. The site is a welcoming room, not a monitoring dashboard. Keep one +primary action, native navigation and short instructions. English is the first +view with an explicit Chinese choice; theme follows the system unless changed. +Respect reduced motion and retain useful content without JavaScript. + +The room illustration cycles through four distinct uses: an RPG, drawing, +travel photos and a movie. Treat coding and design as creative work rather than +proliferating overlapping examples. The host holds a gamepad during the game; +the role badge identifies the host independently of the activity. +Keep participant drawings consistent across the site, READMEs, +interface captures and tooltip/status comics. + +Present Piik as an open-source project: plain explanations, room for tinkering, +and an invitation to contribute. Keep the friendly illustration and avoid +company-style pitches, repeated slogans or claims about a support team. +The short comics illustrate choosing, inviting and joining, following the +shared motion grammar and whole-control replay rule. The optional film starts +only after an explicit action and has native buttons and a seek slider. Open it +within the homepage, loading its single player on demand; closing it unloads +playback. The standalone page serves recording and direct links. Fullscreen +watching keeps touch controls available; hiding them is an explicit recording action. +Both READMEs share the friendly opening and room illustration. Their feature, +limitation and setup sections use the factual register in the copy guide. + +Use a consistent README structure: +a distinct brand opening, bold headings and key phrases, regular explanatory +text, quiet captions and optional detail. Use images and short demonstrations +to explain different things rather than filling space. Keep essential setup and +availability in readable text, and distinguish generated demo content from a +real captured workload. GitHub-native Markdown/HTML must remain useful on mobile +and in both themes without custom CSS. + +The product UI remains mascot-only. On the website, keep the header's TV +mascot before the Piik name. The wordmark and mascot do not transform +into one another. Match the product's +playful style through the mascot's wink and short comic interactions. An +original room illustration is shared by the site and READMEs. Interface previews +use generated scenes and sample participants. Keep private invitations, +user identities and personal media out of published assets; no external fonts +or tracking are needed. + +## Small implementation + +The website and film initially follow the browser's primary language: Chinese +uses Chinese copy, and other languages use English. An explicit language choice +is shared between these two pages and remembered; linked language choices take +precedence when following a link. + +Use static HTML, CSS, SVG and small scripts for the public pages; no router, +CMS, translation dependency or new application backend. The film's isolated +demonstration frame bundles the existing React product components and styles, +using staged inputs. It cannot access storage, run capture or contact the room +service. The film clock owns its actions and decorative CSS animation positions. +Rebuilding the site picks up component/style/copy changes; changes to the actual +workflow still require reviewing the sequence and camera framing. Do not replace +shared controls with a second hand-drawn UI or retain obsolete screenshot plates. +The existing App/Web +continues to own sharing. The homepage explains it rather than simulating a +second room authority. Public copies of advanced product/research documents +are not automatically included in the website artifact. + +The [website operations guide](../operations/website.md) owns Pages publication, +public destinations and the separate P2P-only demo. The primary action leads +to the platform download section. Use permanent release-page links for downloads; +archive names include a revision. Verify destinations as part of publication. +Demo, App and existing-site walkthroughs +use real action names and explain the first sharing and viewing steps. Keep +platform requirements and connection limitations beside the relevant steps. + +## Review boundary + +Review desktop/mobile, English/Chinese, light/dark, keyboard navigation, +reduced motion, no JavaScript and a nested project URL. Check links, accurate +platform/connection claims and a single copy of each responsibility. Remove +decorative controls or code that do not improve understanding. This is a public +introduction overhaul, not an excuse to change configuration or media policy. diff --git a/docs/design/visual-language.md b/docs/design/visual-language.md new file mode 100644 index 0000000..b1bcf15 --- /dev/null +++ b/docs/design/visual-language.md @@ -0,0 +1,210 @@ +# Visual Language + +This is the single design requirement for Piik's shared Web/App interface: +illustration, semantic colour, panel grammar, motion and tooltip presentation. +New UI work follows this file and the local `/__tooltip-preview` catalogue. +[Media status](./media-status.md) owns which facts justify each status; +[presentation lifecycle](../product/presentation-lifecycle.md) owns interaction +and playback. Neither an illustration nor its colour creates product state. + +Use one stroke language for single concepts, small panel comics for causes and +sequences, and literal scene objects for people, rooms and media. Glyphs do not +form sentences. The same meaning and visual hierarchy must work in Chinese, +English and pure-visual modes, in both themes and at narrow widths. + +Piik's living room uses simple silhouettes, generous space, rounded controls +and a small responsive bounce. Clear hierarchy and legible interaction keep +the playful details easy to use. +The [copy guide](../reference/naming.md#voice-and-terminology) owns its voice. +The [public introduction guide](./public-introduction.md) owns website and film +hierarchy: shared identity, current product demonstrations and promotional +composition. It applies the copy guide's audience and technical-detail layers. + +Keep playfulness restrained: clean silhouettes, balanced proportions, quiet +expressions and brief gestures. Keep the interface approachable; avoid +pushing ordinary characters toward infant proportions, exaggerated +grins, dense cute decoration or children's picture-book styling. + +## Layout And Input + +Present a small shared living room: the television is the media stage, the +couch and pawns make presence spatial, and the four-digit room code stays +prominent. Decoration must clarify product facts without creating another state +model. Universal digits, transport symbols, URLs and measured values remain +literal when the user needs the data. + +Functional controls use native buttons/inputs and localized accessible names. +Hover, keyboard focus and touch receive equivalent guidance. Keep information +order and interaction ownership consistent across languages, themes and viewport +sizes. Reflow or bounded scrolling must not hide a primary action, truncate an +essential value, overlap controls or change meaning. + +Shared buttons and chips use pill shapes, a quiet lower edge and a short lift +on hover or keyboard focus, then compress on press. Inputs and option tiles +share softer corners. Keep a distinct focus ring and a persistent selected +state; disabled controls must not pretend to activate. Reduced motion keeps +the colour, outline and selected position without decorative displacement. + +## Cast And Objects + +The brand mascot keeps its own identity, separate from ordinary participants. +Participant characters should leave room for that distinctive presence. + +| Meaning | Representation | +| --- | --- | +| The person using the pictured action | Green pawn (`YOU` / `--you`), in every panel | +| Somebody else | Blue pawn (`SKY`), or another distinct non-green illustration colour | +| Host role | Gold crown above the head: rounded three-point outline, dark gold edge and a quiet lower rim; the standalone absent-Host symbol uses the same outline, unfilled and dashed | +| Shared or watched media | Small television, including antenna, body and feet | +| Browser application | Browser chrome around content; not a second design of television | +| A captured window or display | Window title bar or display stand, with the shared media metaphor kept distinct | +| Server forwarding media | A server on the media path; opening a Site alone does not imply SFU | + +These are **identity/object colours**, not status. A green pawn remains green +in a failed scene; a successful scene does not turn other people green. Real +roster identities retain the shared UUID colour function, not the illustrative +"you versus others" palette. Actor positions and identities remain stable from +the first panel to the result. + +Room pawns, tooltip/status comics and introduction participants use +a round head, half-oval body and two restrained eyes. Reuse the shared +figure and face geometry in product illustrations so expressions stay inside +the head as it scales. Larger scenes can add a small lean; small status panels +may omit facial detail to keep the action clear. When a gesture needs hands, +use small floating round shapes. A held gamepad is a scene prop; a separate role +crown identifies the host and moves with the body. Its gold is an identity colour, +not a warning or achievement. The share control retains its +cast icon. The cast represents friends sharing games, drawings +and other screen content. Exploratory figures are not alternate +participant identities. Keep the brand mascot distinct. + +The couch has a back, seat, arms and feet. A full room reflows into rows of seats +without hiding people or requiring horizontal scrolling. Topology preserves +each participant and actual parent edge at a readable scale; reduce spare +spacing, then use a vertical outline when depth exceeds the available width. + +Couch upholstery uses the fixed warm orange/yellow `--couch` / `--couch-dark` +palette. Never draw upholstery from the participant palette or randomize it by +room. Keep automatic participant colours outside the upholstery's amber/orange +range and the crown's gold; check all eight tokens against both objects in light +and dark themes. The crown retains a bright gold fill with a dark gold edge. +Figures and exterior upholstery use flat fills without outline strokes. +Use differences in tone, spacing and name tags to keep people readable; retain +only the few interior seams that clarify cushions. Apply this convention to +the website and README cast as well as the product UI. + +## Semantic Colour And Shape + +Use the existing theme tokens in `src/client/styles.css`. The shared +`comic-presentation.ts` maps meanings to those tokens for tooltip outlines, +carets, result panels and verdict marks. Do not choose independent hex colours +or animation rules inside an individual scene. + +| Meaning | Token / code tone | Panel and symbol | +| --- | --- | --- | +| Explanation, preference, ordinary action, intentional closure or unknown state | Neutral ink / `off` | Neutral panels; illustrate the action/object without a success stamp | +| Confirmed completion or delivered media | Green `--live` / `live` | Neutral before, green result; check or completed object | +| Still usable with a limitation, unavailable optional capability, or intentional media pause | Amber `--warn` / `warn` | Neutral before, amber result; limit, pause, lock or unavailable mark on the affected part | +| Confirmed failed or blocked action | Red `--danger` / `bad` | Neutral before, red result; cross, broken path or other explicit failure mark | +| Work in progress or awaiting an action/frame | Blue `--action` / `busy` | Neutral before, blue current/result panel; connection, progress or play symbol | + +Recovery retains amber because service is interrupted while work continues. +Waiting for a Host and unknown observations remain neutral. A control's +prospective action is not proof of success: opening details, switching theme, +adjusting volume or offering P2P stays neutral. Actual copy feedback can change +that same hint to green or red, using the existing operation result. + +Two-panel comics always read before/context on the left and result/current +condition on the right. Only the result carries the semantic accent; a single +panel carries the current condition. Tooltip outline and caret use that same +tone in Chinese, English and visual modes. Neutral uses theme ink, not literal +white. Keep paper fills quiet; do not tint the whole scene green/yellow/red. +Meaning must also survive without colour through objects, symbols and accessible +localized names. Never show celebration or a completed live path as the verdict +of a failed or unavailable operation. + +A missing optional feature is not a failed media path. For example, unavailable +NAT prediction marks only extra candidate paths; ordinary P2P remains a neutral +possibility. A rejected PiP request is failure; lack of PiP support is a limitation. + +## Motion Grammar + +| Presentation | Rule | +| --- | --- | +| Action demonstration (`demo`) | Play one meaningful transition when shown, then hold its result | +| Work actually continuing (`progress`) | Repeat a gentle connection/recovery beat while that state exists | +| Settled success, failure, limitation, pause or idle (`still`) | Show the informative final pose immediately; no repeated stamping, shaking, blinking or celebration | + +Demonstrations and progress share the existing 3.2-second comic beat. The main +action belongs in its first half, followed by a readable hold; small internal +staggering is allowed. At most two independent movers per panel. An explanatory +slider describes purpose and available range, not its live numeric value. +Decorative sparkle must support the pictured action, never fake current success. + +Reduced motion and settled states reuse each scene's **same explicit final +pose**. Disabling animation alone is insufficient if the base SVG hides the +result or shows a misleading starting pose. Static styling is scoped to its SVG; +one still tooltip must not freeze another progress scene. New keyframes must end +in the documented result rather than reset for an obsolete loop. + +The tooltip panel itself uses the same restrained entrance/exit for every tone. +Replay belongs to opening/hovering/focusing the whole control, not just its SVG. +Ordinary controls keep their icons visible during hover and keyboard focus; +surface colour, lift, focus and press feedback carry the interaction. Reserve +icon drawing/replay for primary actions such as starting a share or joining a +room, and for explicit state-entry feedback. The whole control owns the trigger. +Stroke and solid drawings share one total duration and easing; stroke count +must not lengthen the animation. Disabled controls and passive status icons +retain their informative pose; busy indicators retain their progress beat. +Do not add a per-scene timer or another interaction/state owner. Outside status +comics, the brand mascot and participant figures may blink or glance occasionally; +a pictured screen can guide the Host's gaze. Keep eye gestures and small body +leans brief, separated by long pauses and offset between people. A participant's +UUID seeds the cadence; align its phase to wall time in every view, including +later mounts and return from background. Names, roster order and the observer's +role do not reseed it. Device clock skew bounds cross-device precision; cosmetic +motion adds no signaling or media state. They express personality independently +of connection feedback. Follow the system's reduced-motion preference, keeping a +natural, open-eyed pose when enabled; participant gestures have no separate +product playback control. Status comics still follow the table above. + +Introduction artwork is separate from product status. Website/README scenes may +repeat a short action with a generous pause. Keep broad movement to one or two +focal elements; small participant gestures follow the quiet cadence above. +Provide a pause or hide control for automatic loops, and a useful static pose +for reduced motion. Product-state comics still follow the table above. + +Entry screens may carry one quiet, original welcome line in Chinese or English +text mode. Pure-visual mode pairs familiar pictograms with static pixel +pseudo-lettering tied to the same line. This decoration is hidden from assistive +technology. The selected line stays stable during that visit, including mode +changes, and never replaces an action, error, loading message or connection +progress. Keep it on one line, apart from the actions; primary controls take +precedence when space is tight. + +## Ownership And Incremental Review + +- Existing status/operation facts outrank the scene default. Reused `warning` + artwork can represent a warning or a confirmed failure; pass the actual tone. +- `comic-presentation.ts` owns defaults and semantic tokens; `Frame`, `RedX`, + `rmBlock`, `Comic` and `HintComic` apply the shared grammar. Scenes own only + their cast, causal illustration and final pose. `Tooltip` owns interaction + and placement. Do not duplicate these rules in each scene or page. +- Keep the semantic kind and tone in all languages; localized text changes + expression, not severity. Symbol-only controls retain accessible names. +- For each changed scene inspect its start, transition and settled pose in + both themes, reduced motion and narrow layouts. Compare success, failure, + limitation and neutral neighbours in the catalogue. Code-level tests do not + establish visual clarity. +- Update this owner when accepting a new convention. Product documents link + here instead of copying the palette, cast or animation table. + +## Interaction References + +[Carbon status indicators](https://v10.carbondesignsystem.com/patterns/status-indicator-pattern/) +supports combining semantic colour with shape and symbols; +[Carbon motion](https://carbondesignsystem.com/elements/motion/overview/) +distinguishes functional feedback from occasional expressive movement. + +[Web Animations start time](https://developer.mozilla.org/en-US/docs/Web/API/Animation/startTime) +provides the native timeline alignment used by participant gestures. diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md new file mode 100644 index 0000000..0e2a4ce --- /dev/null +++ b/docs/guide/getting-started.md @@ -0,0 +1,133 @@ +# Your first Piik room + +English · [简体中文](./getting-started.zh-CN.md) · [Back to Piik](../../README.md) + +Piik shares one person's screen with up to 20 invited viewers. This guide covers +watching, trying the online demo, using Piik App and sharing through an existing site. + +[Join a room](#join-a-friends-room) · [Online demo](#try-the-online-demo) · +[Piik App](#share-with-piik-app) · [Existing site](#share-from-your-browser) · +[Troubleshooting](#when-something-gets-in-the-way) + +Viewers need a browser and an invitation. To try sharing, use the online demo +or **Public invite** in Piik App. + +If Piik shows icons only, choose **EN** in the header to show the labels +used below. **中** switches to Chinese; **✦** returns to the illustrations. + +## Join a friend's room + +1. Open the invitation link your friend sent in a desktop or mobile browser. +2. Wait for their screen to appear. If the browser blocks autoplay, press **Play**. +3. Move the pointer over the picture or tap it to show the playback bar. + +The playback bar controls only your own picture and sound. + +
+Playback controls, at a glance + +| Control | What it does | +| --- | --- | +| **Theater mode** | Expands the picture inside the browser tab. | +| **Fullscreen** | Fills your screen. | +| **Picture in picture** | Opens a floating video where supported. | +| **Volume** | Goes up to 200% with audio boost, or 100% otherwise. Lower it if the sound distorts. | + +
+ +With just a four-digit room code, open the same Piik site and choose +**Join a room**. You may need the site's passphrase and the room's password. +The host decides whether code entry is available; ask for an invitation link if +you cannot join by code. + +If an old link no longer works, ask the host for the current invitation. +App Local rooms and temporary public invitations end when that App run stops. + +## Try the online demo + +1. Open [demo.piik.tv](https://demo.piik.tv) in a desktop browser that supports + screen sharing. +2. Select **Start sharing**, choose a screen, window or tab, and enable audio if + needed and offered by the browser. +3. Confirm the preview and select **Copy invite link**. Open that link on a + second device or send it to a friend. +4. Select **Stop sharing** when finished. + +The project hosts this site for you. It uses direct media connections (P2P); +restrictive networks may load the page but block video. + +## Share with Piik App + +1. Download a **`piik-app`** archive for your platform from + [GitHub Releases](https://github.com/TNTcraftHIM/Piik/releases) or the + [Gitee mirror](https://gitee.com/TNTcraftHIM/Piik/releases). Extract the whole + archive and keep its directory structure intact. +2. Open `piik-app.exe` on Windows, `Piik App.app` on macOS, or `./piik-app` on Linux. + The launcher opens in your system browser. +3. Choose **Public invite** for friends outside your local network, then select + **Open Piik**. Other modes are explained below. +4. Choose **Start sharing**, then select **Browser**, **Apps / Windows**, or + **Screens** as available. Pick the actual source and sound option. +5. Copy and send the room invitation. Keep both the App and sharing tab open. + +| Filename contains | Platform | +| --- | --- | +| `windows-amd64` | Windows x64 | +| `darwin-arm64` | Apple silicon; native capture requires macOS 13+ | +| `linux-amd64` | Linux x64 | + +Windows App and browser sharing are the primary tested paths. The macOS and +Linux apps have not yet been tested on physical devices; +[test results and feedback are welcome](https://github.com/TNTcraftHIM/Piik/issues). +Linux native capture also needs [system components](../../native/capture/linux/README.md). +See the [App guide](../../cmd/piik-app/README.md) for package and runtime details. + +### Choose an App mode + +| Mode | When to choose it | What to keep in mind | +| --- | --- | --- | +| **Local room** | Friends are on the same local network. | Your computer must be reachable from theirs. A local site passphrase is optional. | +| **Public invite** | Friends are elsewhere and you want a temporary invitation. | Needs Internet access. The public address lasts for this App run. | +| **Connect to Site** | Your group already has a Piik site. | Enter its address; the App adds capture capabilities to the site's sharing page. | + +**A page that opens does not guarantee a video connection.** Public invite gives +your room a temporary web address; picture and sound still travel between +participants. This mode has no media-server fallback, and the temporary address +has no uptime guarantee. All modes need a working UDP media path. +The [App guide](../../cmd/piik-app/README.md#modes) explains the connection setup. + +## Share from your browser + +You need an existing HTTPS site running Piik Server, provided by a friend or +administrator. If you do not have one, start with the [demo](#try-the-online-demo) +or [Piik App](#share-with-piik-app). Hosting a site yourself is an advanced option: +follow the [self-hosting guide](../operations/self-hosting.md) for server, HTTPS +and network setup. + +1. Open your group's Piik site on your computer. Enter its site passphrase if asked. +2. Choose **Start sharing**. In the browser picker, select the screen, window or + tab you want friends to see, and enable audio if offered. +3. Check the preview, then choose **Copy invite link** and send it to your friends. +4. Keep the sharing tab open. Use **Pause sharing**, **Switch source**, or + **Stop sharing** when you need them. + +Screen capture requires an HTTPS site or `localhost`. The sources and audio +offered by the picker depend on your browser and operating system. +Invitation links grant access to that room; share them with the people you want there. + +## When something gets in the way + +| What you see | Try this | +| --- | --- | +| Picture but no sound | Unmute the video. The host should choose a source with shareable audio; if sound was disabled, stop and start sharing with it enabled. App window/screen capture keeps that setting when switching sources. | +| No screen picker | Allow the browser or App to record the screen when the OS asks. Browser capture needs HTTPS or `localhost`; try sharing from a desktop computer. | +| Local invitation will not open | Check that both devices are on the same network and can reach each other. Guest Wi-Fi or firewall rules can block local access. | +| Page opens but video will not connect | Choose **Reconnect** in the playback bar. If it still fails, check [WebRTC connection settings](../../cmd/piik-app/README.md#chromium-webrtc-connections) or try a site with media fallback. | +| Sharing stops after sleep or suspension | Wake the device and return to the sharing tab; start sharing again if needed. Browser and OS suspension can interrupt capture or playback. | + +For a bug report, include the version, OS/browser, what you expected, and how +to reproduce it. [Diagnostics and export](../reference/configuration.md#diagnostics) +explains how to collect a local report and what to review before sharing it. + +Ready to host a site for your group? Follow [self-hosting](../operations/self-hosting.md). +For everything else, use the [documentation map](../README.md). diff --git a/docs/guide/getting-started.zh-CN.md b/docs/guide/getting-started.zh-CN.md new file mode 100644 index 0000000..5193627 --- /dev/null +++ b/docs/guide/getting-started.zh-CN.md @@ -0,0 +1,122 @@ +# 第一次用 Piik + +[English](./getting-started.md) · 简体中文 · [回到 Piik](../../README.zh-CN.md) + +Piik 支持一位房主分享屏幕,最多 20 位受邀观众通过浏览器观看。 +本指南介绍加入房间、体验在线 Demo、使用客户端,以及通过已有站点分享的方法。 + +[加入房间](#加入朋友的房间) · [在线 Demo](#体验在线-demo) · +[Piik App](#用-piik-app-分享) · [已有站点](#用浏览器分享) · [问题排查](#遇到问题了) + +观众只需要浏览器和邀请链接。 +初次体验分享,可以使用在线 Demo 或客户端的 **公网邀请**。 + +如果 Piik 只显示图示,点击顶部的 **中** 即可显示下文提到的按钮文字。 +**EN** 切换到英文,**✦** 返回图示模式。 + +## 加入朋友的房间 + +1. 用电脑或手机浏览器打开朋友发来的邀请链接。 +2. 等待画面出现。如果浏览器没有自动播放,点击 **播放**。 +3. 将鼠标移到画面上,或轻点画面,显示播放控制栏。 + +播放控制栏只改变你自己看到的画面和听到的声音。 + +
+播放按钮分别做什么? + +| 按钮 | 作用 | +| --- | --- | +| **剧场模式** | 在浏览器标签页内展开画面。 | +| **全屏观看** | 让画面铺满屏幕。 | +| **悬浮小窗** | 浏览器支持时,把视频放进独立小窗。 | +| **音量** | 支持增强时最高 200%,否则最高 100%;声音失真时调低一些。 | + +
+ +只有四位房间号时,打开同一个 Piik 站点,选择 **加入房间**。 +你可能需要站点口令和房间密码。能否通过房间号加入由房主决定; +无法加入时,请朋友发邀请链接。 + +旧链接失效了,就请房主重新发一份当前邀请。 +App 的本地房间和临时公网邀请会随本次 App 退出而结束。 + +## 体验在线 Demo + +1. 在支持屏幕共享的电脑浏览器中打开 [demo.piik.tv](https://demo.piik.tv)。 +2. 点击 **开始分享**,选择屏幕、窗口或标签页;如需声音且浏览器提供该选项,启用音频。 +3. 确认预览后,点击 **复制邀请链接**,用另一台设备打开,或发送给朋友。 +4. 体验结束后,点击 **停止分享**。 + +演示站由项目提供,画面通过设备间直连(P2P)传输。 +在受限网络下,可能出现页面能打开、画面无法连接的情况。 + +## 用 Piik App 分享 + +1. 从 [GitHub Releases](https://github.com/TNTcraftHIM/Piik/releases) 或 + [Gitee 镜像](https://gitee.com/TNTcraftHIM/Piik/releases)下载以 **`piik-app`** 开头、 + 对应平台的压缩包,完整解压并保留目录结构。 +2. Windows 打开 `piik-app.exe`,macOS 打开 `Piik App.app`,Linux 运行 `./piik-app`。 + 启动页会在系统浏览器里打开。 +3. 邀请不在同一局域网的朋友时,选择 **公网邀请**,再点击 **进入 Piik**。 + 其他模式的用途见下表。 +4. 点击 **开始分享**,按可用选项选择 **浏览器**、**程序 / 窗口** 或 **屏幕**, + 然后选定要分享的画面与声音。 +5. 复制房间邀请发给朋友。分享期间保持 App 和分享标签页打开。 + +| 文件名包含 | 适用平台 | +| --- | --- | +| `windows-amd64` | Windows x64 | +| `darwin-arm64` | Apple 芯片;原生采集需 macOS 13 及以上 | +| `linux-amd64` | Linux x64 | + +目前主要测试 Windows 客户端和浏览器分享。macOS 和 Linux 客户端尚未经过实机测试, +欢迎有设备的朋友试用并[反馈问题](https://github.com/TNTcraftHIM/Piik/issues)。 +Linux 原生采集还需要[系统组件](../../native/capture/linux/README.md)。 +程序包与启动参数的细节见 [App 指南](../../cmd/piik-app/README.md)。 + +### 选择 App 模式 + +| 模式 | 什么时候用 | 需要知道 | +| --- | --- | --- | +| **本地房间** | 朋友和你在同一个局域网。 | 对方需要能连接到你的电脑,可以设置本地站点口令。 | +| **公网邀请** | 朋友在别处,想临时发个邀请。 | 需要互联网连接;公网地址只在本次 App 运行期间有效。 | +| **连接站点** | 你们已经有一个 Piik 站点。 | 输入站点地址,在原有分享页面使用 App 的采集能力。 | + +**网页能打开,不代表视频一定能连通。** 公网邀请为房间提供临时网页地址, +画面和声音仍靠参与者之间的连接传输。此模式没有媒体服务器兜底, +临时地址也不保证持续可用。所有模式都需要可用的 UDP 媒体路径。 +具体连接方式见 [App 指南](../../cmd/piik-app/README.md#modes)。 + +## 用浏览器分享 + +需要先有一个运行 Piik Server 的 HTTPS 站点,可以使用朋友或管理员提供的地址。 +还没有站点时,请先体验[在线 Demo](#体验在线-demo) 或使用[客户端](#用-piik-app-分享)。 +自建站点属于进阶操作,服务器、HTTPS 和网络端口的配置步骤见[部署指南](../operations/self-hosting.zh-CN.md)。 + +1. 在电脑上打开 Piik 站点。如果站点设置了口令,先输入口令。 +2. 点击 **开始分享**,在浏览器弹窗里选择屏幕、窗口或标签页; + 如需声音且浏览器提供该选项,启用音频。 +3. 确认预览画面后,点击 **复制邀请链接** 发给朋友。 +4. 保持分享标签页打开。需要时使用 **暂停分享**、**切换来源** 或 **停止分享**。 + +浏览器屏幕采集需要 HTTPS 站点或 `localhost`。 +弹窗里有哪些画面和声音可选,取决于浏览器与操作系统。 +拿到邀请链接的人可以进入这个房间,请把它发给你想邀请的人。 + +## 遇到问题了 + +| 你遇到的情况 | 可以先试什么 | +| --- | --- | +| 有画面,没声音 | 先取消视频静音。房主应选择支持分享声音的来源;如果开始时关闭了声音,请停止后重新开始并打开声音。通过 App 采集窗口或屏幕时,切换来源会保留原来的声音设置。 | +| 没有屏幕选择弹窗 | 按系统提示允许浏览器或 App 录制屏幕。浏览器采集需要 HTTPS 或 `localhost`,请在电脑上尝试分享。 | +| 本地邀请打不开 | 确认两台设备在同一网络且可以互相访问。访客 Wi-Fi 或防火墙规则可能阻止本地连接。 | +| 网页能打开,画面连不上 | 点击播放控制栏的 **重新连接**;仍然失败时,检查 [WebRTC 连接设置](../../cmd/piik-app/README.md#chromium-webrtc-connections),或尝试有媒体服务器兜底的站点。 | +| 休眠或挂起后分享中断 | 唤醒设备,回到分享标签页,必要时重新开始分享。浏览器或系统挂起可能中断采集和播放。 | + +反馈问题时,请附上版本、系统与浏览器、预期结果和复现步骤。 +[诊断与导出](../reference/configuration.md#diagnostics) +说明如何收集本地报告,以及分享前需要检查哪些内容。 + +想为朋友搭一个站点?从 [部署指南](../operations/self-hosting.zh-CN.md) 开始。 +其他内容可在 [文档导航](../README.md) 找到。 diff --git a/docs/maintenance.md b/docs/maintenance.md index 3a7f429..5942301 100644 --- a/docs/maintenance.md +++ b/docs/maintenance.md @@ -1,68 +1,95 @@ -# 项目维护与上下文治理 +# Documentation Ownership -## 目标 +The repository is the durable source across sessions, devices and agents. +Use [the documentation map](./README.md) to find a topic, then update its owner. +Chat, agent summaries and an old branch do not replace current code, contracts +and evidence. Task authority stays in [AGENTS.md](../AGENTS.md); delivery and +verification procedures stay in [CONTRIBUTING.md](../CONTRIBUTING.md). -仓库是跨 session、设备和 agent 的持久事实源。会影响后续工作的结论必须先进入其权威文档;聊天、agent 摘要、旧分支和临时计划都不能替代仓库真相。 +## Owners -常驻上下文只保留每次工作都需要的边界和导航。细节按需读取,完成历史交给 Git。任务范围和交付遵循 `AGENTS.md`,最小正确结果遵循仓库内的 [`ponytail` skill](../.agents/skills/ponytail/SKILL.md);本文件只维护仓库特有的事实治理规则。 - -## 事实分层 - -| 内容 | 权威归属 | 维护方式 | +| Topic | Owner | Keep here | | --- | --- | --- | -| 每次都必须遵守的硬约束和导航 | `AGENTS.md` | 保持短、单义、稳定;不复制流程手册或临时状态 | -| 分支、研究、验证、PR、合并和清理流程 | `CONTRIBUTING.md` | 维护可执行的日常流程 | -| 产品总览和领域导航 | `docs/project-memory.md` | 只保留每次 substantial task 都需要的摘要与链接 | -| 当前生产、里程碑、阻塞项和明细索引 | `docs/status.md` | 只保留 current/index;接近 120 行或 12 KB 时提示园艺审查 | -| 当前未决、已授权或待用户决策的工作 | `docs/todo.md` | 不是完成记录;不把 checkbox、实验或 agent 建议自动升级为 TODO | -| 当前产品合同 | `docs/product/` | 每个领域一个 owner;只写行为、边界和非显然不变量 | -| 架构取舍 | `docs/adr/` | 明确状态;新决定替代冲突旧决定 | -| 可复核证据和研究结论 | `docs/research/` | 标日期、来源、推断、适用边界和许可证 | -| 当前验证与部署边界 | `docs/verification-status.md`、`docs/deployment.md`、`docs/operations/`、`docs/reference/` | 按需读取,不保存发布流水账 | -| 已完成工作的时间线 | commit、PR、issue | 不复制进常驻 memory 或 status | +| Universal constraints and navigation | `AGENTS.md` | Short mandatory boundaries and links; no procedure manual | +| Branches, review, validation, PRs, releases and cleanup | `CONTRIBUTING.md` | Executable workflow | +| Module boundaries, interface discipline and ablation | [Engineering](./reference/engineering.md) | Current responsibility map and shared coding rules | +| Names, terminology and voice | [Naming and copy](./reference/naming.md) | Product/tool names, role labels and Chinese/English writing conventions | +| Illustration, palette, motion and accessible layout | [Visual language](./design/visual-language.md) | Shared Browser/App design grammar | +| Status projection | [Media status](./design/media-status.md) | Which facts each display surface may express | +| Release identity and compatibility | [Versioning](./reference/versioning.md) | Version roles, protected interfaces and public-readiness boundary | +| Current product behavior | `docs/product/` | One owner per domain; promises, boundaries and non-obvious invariants | +| Architecture decisions | `docs/adr/` | Decision status, rationale and consequences; explicitly supersede changed clauses | +| Measurements and external evidence | `docs/research/` | Date, sources, observations, inference, limits and license scope | +| Deployment and configuration | `docs/deployment.md`, `docs/operations/`, `docs/reference/configuration.md` | Runnable operator reference; no per-release diary | +| Compact product map | `docs/project-memory.md` | Stable summaries and domain navigation, not implementation inventories | +| Current execution/deployment index | `docs/status.md` | Current boundaries and pointers; exact artifact identity stays in release metadata | +| Remaining work and decisions | `docs/todo.md` | One task ledger, with executable work separated from parked ideas | +| Unresolved physical acceptance | `docs/verification-status.md` | Still-relevant evidence gaps across modules | +| Completed history | Git commits and PRs | Changes and outcomes; do not reproduce them in memory or TODO | -每个事实只有一个 owner。顶层文件提供链接和当前结论,不复制深层正文;`docs/README.md` 维护完整文档索引。 +Source schemas and existing conformance fixtures own exact interface fields; +package comments own local lock/resource invariants. The engineering reference +links to them instead of copying every field. README and guides explain how to +use the product; technical details link to the relevant owner. English/Chinese +entry guides are intentional translations and must change together; technical +references keep one version. -## 顶级指令卫生 +## Updating A Rule -[官方调研](./research/agent-context-governance.md)的共同结论是:顶层指令应是短而稳定的地图,流程和专业细节按需加载,并定期删除冲突或陈旧规则。检查器把官方边界分成推荐线和硬顶:Codex 项目指令链在默认 32 KiB 上限的 80% 提示、到上限失败;Claude 的有效启动指令在官方建议的 200 行提示,并容许到 250 行的项目缓冲;Hermes 在动态下限 20,000 字符的 80% 提示、到下限失败。`CLAUDE.md` 导入的 `AGENTS.md` 计入有效行数;必读的 repo Ponytail skill 使用同一保守包络。 +1. Trace the current product contract, actual callers and relevant evidence. + Search hits are leads, not proof of a defect. Separate an implementation + mismatch from a historical decision or a still-unaccepted proposal. +2. Update the existing owner first. Add a new owner only for a distinct topic + with real consumers; give it an entry in the documentation map. Delete + replaced normative text elsewhere and link to the owner. +3. Keep current owners consistent. Update memory/status only when their compact + snapshot materially changes; put unresolved work in TODO. Checkpoint and + integration timing follows CONTRIBUTING, not an automatic extra commit for + every small edit. -推荐线只触发园艺提醒,不是压缩目标。硬顶失败时应把目录专属规则迁到嵌套或 path-scoped context,把流程和参考资料迁到按需 skill/文档,简化重复措辞,并删除已完成历史或陈旧结论;不要为了过闸损失仍有消费者的约束。模块特有规则只有在对应代码存在且每次读取确有必要时,才放到最近目录的 `AGENTS.md`;流程说明进入 `CONTRIBUTING.md`,当前工作进入 `docs/todo.md`,证据与理由进入其 owner。 +When semantics are disputed, record the decision needed and hold only dependent +implementation. At handoff or a material phase change, persist accepted rules, +remaining work and actual blockers before relying on a conversation summary. +Do not store tool transcripts, raw logs, temporary paths or repeated completed +checklists as product truth. +After an audit, put accepted constraints in their existing owners and unresolved +work in TODO, then remove the report and handoff bundle. Do not create dated +audit-summary directories or replacement archives of completed work. -## 真相更新顺序 +Published copy describes Piik's behavior and design directly. Remove discarded +design labels, private operational details and conversational comparisons to +other products. Retain primary technical evidence and required attribution or +license notices; rewriting prose must not obscure the origin of reused work. -1. 按 [`AGENTS.md`](../AGENTS.md) 的 authority 和 scope 规则,对照完整产品模型、当前代码、测试和证据确定目标;语义未定时只冻结依赖项。 -2. 就地更新受影响的 product、ADR 或 research owner;仅在快照确实变化时同步 memory/status,未决执行项进入 TODO。 -3. 检查各 current owner 一致并形成 Git-tracked truth checkpoint,再开始依赖该结论的实现或派发。 +## Consolidation And Ablation -语义仍未决定时,在 TODO 记录 hold,只冻结依赖项。具体 Git、worktree、checkpoint 和 integration 流程由 `CONTRIBUTING.md` 拥有。 +Keep one owner per fact, with short summaries where navigation needs them. +Consolidation is not concatenating documents into one giant manual. Remove +stale procedures and duplicated prescriptions; preserve still-consumed behavior, +failure boundaries, reasoning and reproducible evidence. An ADR can retain a +historical decision when its superseded status is clear. -## 机制减负审查 +Document cost is part of [engineering ablation](./reference/engineering.md#ablation-and-review). +Do not delete a product promise solely to shrink a file. Archive completed work +in Git, keep candidate ideas out of active instructions, and never promote an +agent suggestion to accepted policy simply by writing it in a checklist. -机制减负遵循 [`ponytail`](../.agents/skills/ponytail/SKILL.md) 的最小正确结果原则,范围由 `AGENTS.md` 约束。本仓库的审查先只读清点机制服务的用户行为,量化移除后的真实退让,并与代码、配置、迁移、测试、运行时状态、部署和故障面的整体成本比较。文档也是需要同步和审查的机制:长期真相只保留产品合同、非显然不变量、算法/模型、关键取舍和外部证据,普通 UI 与实现细节由代码、测试和 PR 持有。若 owner 接受有界退让,先更新产品合同再删除失去必要性的完整表面;否则保留合同并寻找更小实现。审查不以行数为目标,也不授权无边界重构。 +The top-level context stays a map. Directory-specific instructions belong near +the code only when that module exists and the rule is needed every time. +The [context-governance research](./research/agent-context-governance.md) owns +the external rationale; the existing hygiene scripts own executable limits. +Their gardening warnings invite review, not arbitrary compression; hard failures +for broken links, required owners and instruction-loading limits remain binding. -TURN 的减负证据由 [ADR-0005](./adr/0005-automatic-hybrid-media-routing.md) 和相关 transport research 持有;轻量/SQLite 房间取舍由 [ADR-0002](./adr/0002-memory-resident-protected-rooms.md) 持有。这些案例只证明应按当前消费者重审完整成本,不能被推广为永远删除或永远保留某类机制的规则。 +## Checks -## 检查点与恢复 +For documentation work use the existing link, whitespace and repository-hygiene +checks; do not rerun unrelated media benchmarks. The shared +[`required-project-paths.txt`](../scripts/required-project-paths.txt) lists durable +owners for both hygiene entry points. No additional checker is needed for each +new convention. -在需求或优先级被接受、设计或研究结论改变、实质阶段切换、分支/PR/agent 交接、可能 compaction 或长暂停前更新事实 owner。不要为每个函数、工具调用或未形成结论的探索建立检查点。 - -检查点按 [`AGENTS.md`](../AGENTS.md) 的 durable-truth 规则,只保存以后仍需要的结论、当前状态、下一步和真实阻塞;不保存原始对话或工具输出、完整日志、临时路径、可廉价重查的事实和过程性 TODO 流水账。 - -恢复上下文时依次读取 `AGENTS.md`、project memory、status、TODO、相关 product/ADR/research,然后检查当前分支、`git status`、近期 commit 和 PR。摘要与仓库冲突时,以当前代码、测试和权威文档为准。 - -## 清理规则 - -- `project-memory.md` 和 `status.md` 接近预算时,先删除可从代码或 Git 恢复的完成/失效内容,再把仍需保留的细节迁到现有 owner;不要反复微压缩句子。 -- `todo.md` 只保留真实未完工作、明确 hold 和待用户决策,不保留完成清单或一次性审计过程。 -- `verification-status.md` 只保留仍影响验收的跨模块证据;成熟结论迁回 product、ADR、research 或 operations,过期结果删除。 -- Product 合同不追加确认流水;研究失效时更新正文及最后验证日期;只有仍有解释价值的历史取舍进入 ADR。 -- 每个重要 PR 检查 current 文档是否互相矛盾、链接是否有效、memory/status/TODO 是否仍代表现在。 - -## 验证与自动化 - -- 迭代中运行覆盖当前改动的最小定向检查;完整套件、真实浏览器矩阵、网络整形、跨设备、长时稳定性和部署检查在相关候选的验收边界批量运行。 -- 文档改动默认运行本地 Markdown 链接、whitespace、diff 和 repository-hygiene 检查;不因无关文档变化重跑媒体基准。 -- 断链、缺失必需 owner 和格式损坏是 hard failure。每次注入的有效 `AGENTS.md`/`CLAUDE.md` 上下文与必读的 repo Ponytail skill 使用“推荐线 warning、硬顶 failure”,避免把建议值误当死线,也避免超过工具加载边界。Product、ADR、research、operations 等按需文档的行数/字节阈值始终只是 warning:它提示检查是否应拆分二级 owner、删除历史或移出过程信息,不要求为通过门禁压缩合理正文,也不是交付质量指标。 -- 昂贵证据记录 commit、环境、结果和适用边界。只有相关路径、协议、配置、依赖、环境或门槛改变,或旧证据失败/含糊时才重跑。 -- `.githooks/pre-commit`、`scripts/check-project-state.sh` 和 PowerShell 等价入口共享 `scripts/required-project-paths.txt`。Hook 只做快速、确定、可复现的检查;工程判断留给评审和测试。 +At a meaningful integration boundary check that current documents agree, links +resolve, and memory/status/TODO still describe what remains. Expensive evidence +retains its measured revision, environment and limits; rerun it when a relevant +contract, dependency, platform, workload or unexplained failure changes. diff --git a/docs/operations/github.md b/docs/operations/github.md new file mode 100644 index 0000000..64add0c --- /dev/null +++ b/docs/operations/github.md @@ -0,0 +1,94 @@ +# GitHub Repository And Releases + +[Versioning](../reference/versioning.md) owns release meaning and compatibility; +[CONTRIBUTING](../../CONTRIBUTING.md) owns review and local validation. This file +owns the one-time GitHub settings. The source repository is public; automatic +package publication has its own activation gate below. + +## Main And Pull Requests + +Use squash merging only, with the PR title and body as the squash commit. These +repository settings are applied. Keep automatic branch deletion off: the normal +cleanup step checks local worktrees and remaining references first. + +Protect `main` with PRs required, zero mandatory peer approvals for the solo +maintainer, administrator enforcement, linear history, and no force pushes or +deletions. Do not require cloud PR checks while branch/PR CI is intentionally +quiet; local validation and acceptance precede the squash merge. PR/issue +templates live in `.github/`; [naming](../../CONTRIBUTING.md#commit-pr-and-branch-names) +is shared with automatic version selection. + +These protections are active, including conversation resolution. GitHub Pages +uses the **GitHub Actions** publishing source and the `piik.tv` custom domain; +the repository homepage points to `https://piik.tv`. The dedicated Website +workflow publishes the static site under [website operations](./website.md). + +## Enable Automatic Publication Once + +Before enabling, accept the release packages, compatibility baseline, public +copy and repository visibility; finish main protection. Then set repository +Actions variable `PIIK_RELEASES_ENABLED` to `true`. This is a repository setting, +not an environment variable for Piik App or Server. + +Subsequent accepted PRs merged to main use the existing CI workflow: calculate +one version, validate, package Server and all App targets, and publish the same +artifacts. Runs queue rather than overlap or cancel one another. Branches/PRs +stay quiet; manual `client_checks` dispatch remains available for candidates. +Writing a new version back to main is unnecessary and prohibited. + +For a complete publisher rehearsal, dispatch with `client_checks: true` and an +explicit `candidate_version` such as `v1.0.0`. This builds genuine Server and +native App artifacts under one revision and version without tagging or +publishing. Prepare its [release-note section](../reference/versioning.md#release-notes) +and inspect the generated preview in the run summary. For a local preview, run +`node scripts/release-notes.mjs v1.0.0 FULL_SOURCE_SHA` from the checkout with +full history and tags. Download that run's artifacts and pass their directory, version and +full revision to `scripts/publish-release.mjs --dry-run` (put the flag after +the three positional arguments). An omitted candidate version keeps the usual +development/exact-tag identity. + +Enable GitHub's built-in release immutability for formal publication where +available. Upload all assets to the draft before publishing. A failed upload can +resume its same-source draft; a published version is never clobbered. If its +files are wrong or incomplete, publish a corrected new version. An older retry +must not replace a newer release's `latest` designation. + +To stop future automatic publication, remove/set false the activation variable; +this does not alter existing releases or a currently running workflow. Inspect +the active run separately. No pipeline step changes visibility or installs an +update into a running Piik deployment. + +## Gitee Download Mirror + +[TNTcraftHIM/Piik](https://gitee.com/TNTcraftHIM/Piik) is a public README/Release +mirror. Source, documentation and issues stay on GitHub. The publishing job uses +the repository Actions secret `GITEE_TOKEN`, which is configured; rotate it there +when needed. Never put it in source, a remote URL or a distributed package. +GitHub publication continues to use the workflow's scoped token. + +After GitHub publication, the same job runs `scripts/mirror-release.mjs` on the +original artifacts. Upload failure leaves the Gitee release marked as a preview. +Rerun the failed publishing job to verify existing files and upload only missing +ones. GitHub's published release remains unchanged. Both publishers reject +changing a published package; use a corrected new version if its bytes are wrong. + +If the original Actions artifacts have expired, download that release's files +from GitHub into an external working directory, then run: + +```sh +gh release download v1.0.0 --repo TNTcraftHIM/Piik --dir /tmp/piik-mirror +node scripts/mirror-release.mjs /tmp/piik-mirror v1.0.0 FULL_SOURCE_SHA +``` + +Use the release's actual version and full `target_commitish` SHA, with +`GITEE_TOKEN` supplied through the publisher environment. `--dry-run` after the +three arguments checks local identity, checksums and attachment sizes without +publishing. The [release-source policy](../reference/versioning.md#release-sources) +owns provenance, selection and quota limits. Small-file upload/download acceptance +has passed; full-package mirror acceptance remains part of release readiness. + +## Platform References + +- [Protected branch availability](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches) +- [Workflow concurrency and queued runs](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#example-queueing-multiple-pending-runs) +- [Immutable release workflow](https://docs.github.com/en/code-security/concepts/supply-chain-security/immutable-releases) diff --git a/docs/operations/self-hosting.md b/docs/operations/self-hosting.md index f6b2b8a..e54be75 100644 --- a/docs/operations/self-hosting.md +++ b/docs/operations/self-hosting.md @@ -1,226 +1,93 @@ -# Self-Hosting Operations +# Deploy Piik Server -This runbook owns initial single-host service setup. Application releases use -[deployment](../deployment.md); accepted environment values and ports are in -[configuration reference](../reference/configuration.md). +English · [简体中文](./self-hosting.zh-CN.md) · [Documentation](../README.md) -## Embedded Media Configuration +Piik Server packages the web interface, room management and optional media +forwarding in **one server binary**. Extract and run it; room data is stored in SQLite. -The current source embeds STUN and SFU in the Piik process under -[ADR-0013](../adr/0013-embedded-node-local-media.md). Hosted `STUN_URLS` -advertises ordinary discovery and enables the UDP 3478 listener on -`STUN_LISTEN_HOST` (IPv4, default `0.0.0.0`). Enabling -`NAT_PREDICTION_ENABLED` also binds UDP 3479/3480 on that address. Local and -public-link App modes use discovery without creating media-service listeners. +## Try it locally -Set `SFU_UDP_PORT=7882` to enable automatic embedded SFU fallback. Its IPv4 bind -address is `SFU_LISTEN_HOST`, default `0.0.0.0`; `SFU_PUBLIC_IP` optionally -overrides the advertised IPv4 address when the host is behind NAT. Unset or -blank `SFU_UDP_PORT` keeps SFU disabled. SFU control uses authenticated Piik -signaling through the Web origin. No separate media-service executable, control -origin, or API credentials are needed by this source contract. +These server instructions use a Linux x64 machine. -These templates describe the embedded deployment. Its first cutover requires -the active-session check, matching artifacts and public media verification below. - -## Single-Host Topology - -```text -Browser -- HTTPS/WSS --> nginx :443 --> Piik :8787 -Browser <---------- DTLS-SRTP P2P ----------> Browser -Browser -------- ordinary STUN/UDP --------> Piik :3478 -Browser -------- optional STUN/UDP --------> Piik :3479/3480 -Browser <--------- DTLS-SRTP/UDP ----------> Piik :7882 -``` - -The public baseline uses one Piik Go binary, nginx, a valid Web TLS -certificate, and time synchronization. nginx terminates Web HTTPS/WSS and -proxies only to Piik's private application listener; media UDP reaches the -Go process directly. There is no separate SFU token endpoint or TCP 7880 service. -Web and STUN may use different DNS names on the same public IP. Another proxy or -firewall owner needs its own matching updater and recovery checks. - -Expose only the public listeners in -[configuration reference](../reference/configuration.md). Piik TCP 8787 stays -private. STUN answers Binding requests only; TURN allocations remain unavailable. - -## Templates - -- [Piik systemd unit](../../deploy/systemd/piik.service.example) -- [nginx site](../../deploy/nginx/share.bonfire.icu.conf.example) - -Copy templates outside the repository, inject independent secrets through an -access-restricted environment file or service manager, and adapt only addresses, -domains, certificates, users, and resource limits required by the host. - -## Initial Setup - -1. Configure DNS and TLS for the Web origin and STUN name. -2. Install nginx. The Piik release is one static binary and needs no - language runtime or separate media-service executable. -3. Create an unprivileged `piik` service account, `/opt/piik/releases`, - `/opt/piik/uploads`, and an access-restricted environment file. -4. Provision one verified initial immutable release and atomically point - `/opt/piik/current` to it before enabling the unit. The tracked release - wrapper is upgrade-only and deliberately refuses a missing prior release; - this repository does not provide a generic first-install transaction. -5. SQLite is the Hosted default. The service template selects - `/var/lib/piik/rooms.sqlite` in its service-owned StateDirectory; retain - that absolute path in the environment file and include it in the host's - backup/recovery policy. Use `ROOM_DATABASE_PATH=:memory:` only for intentional - process-only rooms. Do not leave an empty override in a service environment. -6. Install the tracked service and proxy templates. Bind HTTP to loopback on - bare metal; STUN and SFU retain their independent public IPv4 binds. - Containers may bind HTTP to `0.0.0.0` only when publishing/firewall rules - preserve the private application boundary. -7. Apply the public-port allowlist and confirm every retired TURN/TCP port - is closed. -8. Start Piik, then nginx. Piik binds its configured media listeners - before accepting signaling and closes them with the application; a listener - bind failure rolls back startup. Verify public UDP reachability separately. - -## Optional Container - -The [runtime-only Dockerfile](../../deploy/container/Dockerfile) consumes the -existing linux/amd64 Server release; it does not rebuild Go or Browser assets. -Its pinned [Distroless static non-root base](https://github.com/GoogleContainerTools/distroless) -includes CA certificates for HTTPS release checks and has no shell or package -manager. This is an optional recipe, not a published image or automatic installer. -On the local Linux Docker runtime, non-root/read-only startup, both persistence -modes, diagnostics export, STUN Binding and media listener cleanup pass. That -check covers the container lifecycle, not public-network SFU media or the host's -proxy/firewall configuration; verify those on the target deployment. - -Verify the release archive against its descriptor and manifest using the -[release procedure](../deployment.md), then extract its four files into a new -build-context directory: `piik-server`, `LICENSE`, `THIRD-PARTY-NOTICES.txt` -and `REVISION`. Use that directory, not the repository or a secrets directory: +Download the **Linux x64 Server** archive from [GitHub Releases](https://github.com/TNTcraftHIM/Piik/releases) +or the [Gitee mirror](https://gitee.com/TNTcraftHIM/Piik/releases), +extract it, and run the following in its directory: ```sh -docker build --platform linux/amd64 \ - -f /path/to/Piik/deploy/container/Dockerfile \ - -t piik: /path/to/extracted-runtime -docker run --rm --env-file /path/to/piik.env \ - piik: --check-config +./piik-server ``` -Use the existing [production configuration](../reference/configuration.md). -Keep `LISTEN_HOST=0.0.0.0` inside the container and retain the host's existing -HTTPS/WebSocket proxy. With Docker port mapping, set `SFU_PUBLIC_IP` to the -reachable server IPv4 address when SFU is enabled; container-private candidates -are not Internet-reachable. Advertised STUN names must resolve to the server's -public address, and UDP must reach the container directly. +Open `http://localhost:8787`. This is a local trial; use the configuration below +to let friends connect over the internet. To start a temporary room on your computer, +use the [Piik App guide](../guide/getting-started.md). -The following example publishes the standard listeners and keeps HTTP private -to a proxy running on the same host. Omit UDP publish options for disabled SFU -or auxiliary STUN listeners; use the matching port if configuration changes it. +## Put it online + +You need a Linux x64 server and a domain pointing to its public IP. +The example uses `share.example.com`; replace it with your domain. + +### 1. Configure and start Piik + +Create a `.env` file next to the binary: + +```dotenv +PIIK_ENV=production +LISTEN_HOST=127.0.0.1 +PUBLIC_BASE_URL=https://share.example.com +STUN_URLS=stun:share.example.com:3478 +MAX_VIEWERS_PER_ROOM=20 +SITE_ACCESS_PASSWORD= +``` + +Run these commands from that directory as a regular user: ```sh -docker run -d --name piik --restart unless-stopped --stop-timeout 20 \ - --read-only --cap-drop ALL --security-opt no-new-privileges \ - --env-file /path/to/piik.env \ - --mount type=volume,source=piik-data,target=/home/nonroot \ - -e ROOM_DATABASE_PATH=/home/nonroot/rooms.sqlite \ - -p 127.0.0.1:8787:8787/tcp \ - -p 3478:3478/udp -p 3479:3479/udp -p 3480:3480/udp -p 7882:7882/udp \ - piik: +./piik-server --check-config +./piik-server ``` -The image's `/home/nonroot` is owned by UID/GID `65532:65532` with mode `0700`. -A new named volume inherits that directory; an existing volume or bind mount -must already be writable by that identity. Keep this volume when replacing the -container. Set `ROOM_DATABASE_PATH=:memory:` for memory-only room authority. Diagnostics -remain opt-in and use `/home/nonroot/logs`; [export and retention](../reference/configuration.md#diagnostics) -remain the operator's responsibility. Do not mount application files writable. -With diagnostics enabled, `docker kill --signal=USR1 piik` requests a local -export without stopping the container; the ZIP remains in the mounted log directory. +The server reads `.env` automatically and stores rooms in `rooms.sqlite` in the +working directory. A blank `SITE_ACCESS_PASSWORD` allows +entry without a site passphrase; set 8–128 visible ASCII characters to require +one. Room invitations and access settings still apply. -Check `/healthz` from the host and public proxy, then verify configured STUN/SFU -UDP and room/media behavior using [operational verification](#operational-verification). -There is no shell-based healthcheck in the image. Retain the previous image, -environment and volume backup before replacement. Stop the old container before -reusing its listeners or SQLite volume, and recreate with the previous image and -environment if verification fails. The bare-metal `release-app.sh` wrapper does -not manage containers. The first move from external media services still follows -the coordinated cutover below; this recipe changes no proxy or firewall itself. +### 2. Enable HTTPS -## Coordinated Embedded-Media Cutover +Use your existing HTTPS reverse proxy to forward to `127.0.0.1:8787` with +WebSocket support. If you do not have one, [install Caddy](https://caddyserver.com/docs/install) +and add this to its Caddyfile: -Replacing the external STUN/SFU services, including Node-to-Go where still -needed, is one explicitly authorized infrastructure and protocol transaction. -The routine application wrapper cannot perform or recover it. +```caddyfile +share.example.com { + reverse_proxy 127.0.0.1:8787 +} +``` -1. Prepare and verify matching Web/Server signaling and native protocol v9 - App artifacts. Check active sessions and obtain the owner's acceptance of - share interruption before cutover; old pages and Apps must reload or - update together. -2. Retain the exact prior release path, Piik unit and drop-ins, environment, - nginx configuration, and external media-service units, configuration, secrets, - and enabled/active state for rollback. Keep this material access-restricted - outside the repository. Define recovery for any persistent-state or firewall - surface the transaction actually changes. -3. Stage the current unit with - `ExecStart=/opt/piik/current/piik-server` and - `PIIK_ENV=production`. Remove retired `NODE_ENV`, `PEER_ASSISTED_MEDIA` - and external `LIVEKIT_*` configuration; use the current - [environment contract](../reference/configuration.md), including - `SFU_UDP_PORT=7882` when fallback is enabled. Replace route `NODE_DEBUG` with - `PIIK_DEBUG=route` when needed. Validate the new binary's production - configuration as the service user before switching. -4. Stop Piik and the old coturn/LiveKit services. Disable those old media - services and remove the installed Piik LiveKit-readiness drop-in so they - cannot reclaim ports or delay startup. Verify that UDP 3478/3479/3480/7882 - are released before the new Go process binds them. Install the current unit, - environment and nginx template, remove the old RTC proxy locations, validate - nginx, and reload systemd. Preserve unrelated proxy headers, limits, TLS, - asset handling, and firewall rules. -5. Atomically point the current release at the verified candidate, start - Piik, and reload nginx. Verify the actual unit command and environment, - local/public health, the matching Web asset, UDP listener ownership, public - STUN Binding and admitted SFU media, and the agreed active-session outcome. -6. On failure, stop the new Go process and confirm it released its UDP sockets. - Restore the exact prior application path, unit/drop-ins, environment, proxy - and changed infrastructure configuration; reload systemd and validate nginx. - Restore the previous external service states before starting the previous - application with its matching unit, then prove health and media. Restore - matching pages and Apps as part of protocol rollback. A symlink-only - rollback cannot recover this transaction. +Reload Caddy. It obtains and renews the certificate automatically when DNS points +to the server and TCP 80/443 are reachable. See [Caddy's HTTPS proxy guide](https://caddyserver.com/docs/quick-starts/reverse-proxy#https). -Retain the recovery material through the agreed acceptance window. This is a -single replacement contract with no permanent legacy aliases or migration mode. -Later application-only releases use the ordinary -[release wrapper](../deployment.md#atomic-cutover). +### 3. Open the ports and verify -## Optional NAT Prediction +Allow **TCP 80/443** for HTTPS and **UDP 3478** for STUN in the server firewall +and cloud security group. Keep TCP 8787 private. The STUN hostname must resolve +directly to the server; a CDN HTTP proxy does not forward its UDP traffic. -Allow UDP 3479 and 3480 in both the cloud security group and the existing -nftables input rule, validating the complete ruleset with -`nft -c -f /etc/nftables.conf`. Set `NAT_PREDICTION_ENABLED=true` and restart -Piik within an accepted service window. Verify `ss -lunp` shows all three -Piik STUN listeners and that a public Binding request succeeds on each. -Do not add auxiliary URLs to `STUN_URLS`; enabled connections derive them from -the ordinary STUN authority. Keep both firewall rules while the capability is -enabled. Set `NAT_PREDICTION_ENABLED=false` and restart Piik before removing -the auxiliary firewall rules. Avoid verbose STUN/ICE logging because those -requests contain client IP addresses. +Open `https://share.example.com/healthz`; it should return `{"status":"ok"}`. +Then open the site, share a screen and join from another device. This initial +configuration uses P2P media, so participants need a usable UDP path. -These same-IP auxiliary ports measure destination-port mapping behavior. They -are not a full RFC 5780 alternate-address deployment; that requires a second -public IPv4. +## Optional: media fallback -## Operational Verification +Add `SFU_UDP_PORT=7882` to `.env`, allow UDP 7882, and restart Piik to enable +automatic SFU fallback. When the server is behind NAT, also set `SFU_PUBLIC_IP` +to its reachable public IPv4 address. The same binary provides the fallback. -- `/healthz` returns `{"status":"ok"}` locally and through the public origin. -- Piik and nginx are active with expected restart counts and bounded - logs/resources; Piik owns the configured STUN/SFU UDP listeners. -- The official Trickle ICE sample obtains an ordinary UDP `srflx` candidate from - the configured STUN service and no relay candidate. -- A direct room presents media on two networks when Peer ICE succeeds. -- A constrained route creates one managed Host publication and only admitted - subscriptions over embedded SFU UDP; Peer descendants remain ordinary P2P. -- Blocking all UDP reaches a clear bounded failure. -- Restarting Piik in stable mode retains room authority while Browser - sessions and media reconnect from fresh process state. +## Keep it running and update -Representative network, mobile, audio, 20-Viewer, and long-running evidence is -tracked in [verification status](../verification-status.md), not in this runbook. +For automatic startup, use the [systemd or container guide](./service-management.md). +Keep `.env` and `rooms.sqlite` across updates. Back up room data while the server is +stopped, replace the executable with the new release, then restart and check +health and room access. Read release notes before an upgrade that changes data formats. + +[All settings and ports](../reference/configuration.md) · +[Maintainer release tooling](../deployment.md) diff --git a/docs/operations/self-hosting.zh-CN.md b/docs/operations/self-hosting.zh-CN.md new file mode 100644 index 0000000..98a19ed --- /dev/null +++ b/docs/operations/self-hosting.zh-CN.md @@ -0,0 +1,87 @@ +# 部署 Piik Server + +[English](./self-hosting.md) · 简体中文 · [文档导航](../README.md) + +Piik Server 将网页、房间管理和可选的媒体转发打包在**一个服务端程序**中。 +解压后即可运行,房间数据保存在 SQLite 中。 + +## 先在本机试用 + +以下服务端操作在 Linux x64 环境中执行。 + +从 [GitHub Releases](https://github.com/TNTcraftHIM/Piik/releases) 或 +[Gitee 镜像](https://gitee.com/TNTcraftHIM/Piik/releases)下载 **Linux x64 服务端**程序包, +解压后,在该目录运行: + +```sh +./piik-server +``` + +打开 `http://localhost:8787` 即可试用。需要让朋友通过互联网访问时, +继续完成下方配置。如果只想在自己的电脑上临时开房间,可直接使用 [Piik App](../guide/getting-started.zh-CN.md#用-piik-app-分享)。 + +## 对外提供服务 + +准备一台 Linux x64 服务器,以及一个指向服务器公网 IP 的域名。 +下文以 `share.example.com` 为例,请替换成自己的域名。 + +### 1. 配置并启动 Piik + +在程序旁新建 `.env` 文件: + +```dotenv +PIIK_ENV=production +LISTEN_HOST=127.0.0.1 +PUBLIC_BASE_URL=https://share.example.com +STUN_URLS=stun:share.example.com:3478 +MAX_VIEWERS_PER_ROOM=20 +SITE_ACCESS_PASSWORD= +``` + +使用普通用户,在该目录执行: + +```sh +./piik-server --check-config +./piik-server +``` + +程序会自动读取 `.env`,并将房间数据保存在工作目录的 `rooms.sqlite` 中。 +`SITE_ACCESS_PASSWORD` 留空时,进入站点无须口令; +如需设置口令,可填写 8–128 个可见 ASCII 字符。房间邀请与加入权限仍由房主管理。 + +### 2. 配置 HTTPS + +如果已有 HTTPS 反向代理,将请求转发到 `127.0.0.1:8787`,并启用 WebSocket 支持。 +如果还没有,可以[安装 Caddy](https://caddyserver.com/docs/install),在 Caddyfile 中加入: + +```caddyfile +share.example.com { + reverse_proxy 127.0.0.1:8787 +} +``` + +重新加载 Caddy。域名解析正确且 TCP 80/443 可访问时,它会自动申请和续期证书。 +具体操作见 [Caddy 的 HTTPS 代理说明](https://caddyserver.com/docs/quick-starts/reverse-proxy#https)。 + +### 3. 放行端口并检查 + +在服务器防火墙和云平台安全组中放行 **TCP 80/443**(HTTPS)和 **UDP 3478**(STUN)。 +TCP 8787 仅供本机反向代理访问。STUN 域名需要直接解析到服务器,不能只经过 CDN 的 HTTP 代理。 + +打开 `https://share.example.com/healthz`,应返回 `{"status":"ok"}`。 +随后打开站点,分享一个画面,并用另一台设备加入验证。 +上述基础配置使用 P2P 传输,参与者之间需要可用的 UDP 通路。 + +## 可选:启用媒体兜底 + +在 `.env` 中添加 `SFU_UDP_PORT=7882`,放行 UDP 7882,再重启 Piik,即可启用自动 SFU 兜底。 +如果服务器处于 NAT 后方,还需将 `SFU_PUBLIC_IP` 设置为外部可达的公网 IPv4 地址。 +这项功能由同一个服务端程序提供。 + +## 长期运行与更新 + +需要开机启动时,参阅 [systemd 与容器配置](./service-management.md)。 +更新时保留 `.env` 和 `rooms.sqlite`:停止服务、备份房间数据、替换新版程序,再启动并检查健康状态和房间访问。 +涉及数据格式变化的版本,请先阅读发布说明。 + +[全部配置与端口](../reference/configuration.md) · [维护者发版工具](../deployment.md) diff --git a/docs/operations/service-management.md b/docs/operations/service-management.md new file mode 100644 index 0000000..12fafda --- /dev/null +++ b/docs/operations/service-management.md @@ -0,0 +1,104 @@ +# Service Management + +For first installation, use the [short self-hosting guide](./self-hosting.md). +This reference covers a persistent Linux service and the optional container recipe. + +## systemd + +The [service template](../../deploy/systemd/piik.service.example) runs as the +`piik` user, reads `/etc/piik/piik.env`, and starts +`/opt/piik/current/piik-server`. Create the service account and place the extracted +release at that path, or point `current` at its release directory. Copy your +configuration to `/etc/piik/piik.env` and set +`ROOM_DATABASE_PATH=/var/lib/piik/rooms.sqlite`; the unit creates this state directory. +Keep the environment file readable only by its operator. + +Install the template as `/etc/systemd/system/piik.service`, then run: + +```sh +sudo systemctl daemon-reload +sudo systemctl enable --now piik +sudo systemctl status piik +``` + +Keep HTTP bound to loopback when the HTTPS proxy runs on the same host. +STUN and optional SFU use their own public UDP listeners. An existing nginx +installation can use the [proxy example](../../deploy/nginx/piik.conf.example) +after adapting the domain and certificate paths. + +## Container + +The [runtime-only Dockerfile](../../deploy/container/Dockerfile) consumes the +existing linux/amd64 Server release; it does not rebuild Go or Browser assets. +Its pinned [Distroless static non-root base](https://github.com/GoogleContainerTools/distroless) +includes CA certificates for HTTPS release checks and has no shell or package +manager. This is an optional recipe, not a published image or automatic installer. + +Verify the release archive against its descriptor and manifest using the +[release procedure](../deployment.md), then extract its four files into a new +build-context directory: `piik-server`, `LICENSE`, `THIRD-PARTY-NOTICES.txt` +and `REVISION`. Use that directory, not the repository or a secrets directory: + +```sh +docker build --platform linux/amd64 \ + -f /path/to/Piik/deploy/container/Dockerfile \ + -t piik: /path/to/extracted-runtime +docker run --rm --env-file /path/to/piik.env \ + piik: --check-config +``` + +Use the existing [production configuration](../reference/configuration.md). +Keep `LISTEN_HOST=0.0.0.0` inside the container and retain the host's existing +HTTPS/WebSocket proxy. With Docker port mapping, set `SFU_PUBLIC_IP` to the +reachable server IPv4 address when SFU is enabled; container-private candidates +are not Internet-reachable. Advertised STUN names must resolve to the server's +public address, and UDP must reach the container directly. + +The following example publishes the standard listeners and keeps HTTP private +to a proxy running on the same host. Omit UDP publish options for disabled SFU +or auxiliary STUN listeners; use the matching port if configuration changes it. + +```sh +docker run -d --name piik --restart unless-stopped --stop-timeout 20 \ + --read-only --cap-drop ALL --security-opt no-new-privileges \ + --env-file /path/to/piik.env \ + --mount type=volume,source=piik-data,target=/home/nonroot \ + -e ROOM_DATABASE_PATH=/home/nonroot/rooms.sqlite \ + -p 127.0.0.1:8787:8787/tcp \ + -p 3478:3478/udp -p 3479:3479/udp -p 3480:3480/udp -p 7882:7882/udp \ + piik: +``` + +The image's `/home/nonroot` is owned by UID/GID `65532:65532` with mode `0700`. +A new named volume inherits that directory; an existing volume or bind mount +must already be writable by that identity. Keep this volume when replacing the +container. Set `ROOM_DATABASE_PATH=:memory:` for memory-only room authority. Diagnostics +remain opt-in and use `/home/nonroot/logs`; [export and retention](../reference/configuration.md#diagnostics) +remain the operator's responsibility. Do not mount application files writable. +With diagnostics enabled, `docker kill --signal=USR1 piik` requests a local +export without stopping the container; the ZIP remains in the mounted log directory. + +Check `/healthz` from the host and public proxy, then verify configured STUN/SFU +UDP and room/media behavior using [operational verification](#operational-verification). +There is no shell-based healthcheck in the image. Retain the previous image, +environment and volume backup before replacement. Stop the old container before +reusing its listeners or SQLite volume, and recreate with the previous image and +environment if verification fails. The bare-metal `release-app.sh` wrapper does +not manage containers. This recipe changes no proxy or firewall itself. + +## Operational Verification + +- `/healthz` returns `{"status":"ok"}` locally and through the public origin. +- Piik and the HTTPS proxy are active with expected restart counts and bounded + logs/resources; Piik owns the configured STUN/SFU UDP listeners. +- The official Trickle ICE sample obtains an ordinary UDP `srflx` candidate from + the configured STUN service and no relay candidate. +- A direct room presents media on two networks when Peer ICE succeeds. +- A constrained route creates one managed Host publication and only admitted + subscriptions over embedded SFU UDP; Peer descendants remain ordinary P2P. +- Blocking all UDP reaches a clear bounded failure. +- Restarting Piik in stable mode retains room authority while Browser + sessions and media reconnect from fresh process state. + +Representative network, mobile, audio, 20-Viewer, and long-running evidence is +tracked in [verification status](../verification-status.md), not in this runbook. diff --git a/docs/operations/website.md b/docs/operations/website.md new file mode 100644 index 0000000..1f32a22 --- /dev/null +++ b/docs/operations/website.md @@ -0,0 +1,93 @@ +# Public website + +The website source is `site/`. It explains Piik; it does not run rooms, signaling +or media. The [public introduction guide](../design/public-introduction.md) owns +its content and design boundary. + +## Public Destinations + +| Entry | Destination | +| --- | --- | +| Website | [piik.tv](https://piik.tv) | +| P2P-only demo on the separate US server | [demo.piik.tv](https://demo.piik.tv) | +| App downloads and release notes | [GitHub Releases](https://github.com/TNTcraftHIM/Piik/releases) | +| Download mirror for domestic access | [Gitee Releases](https://gitee.com/TNTcraftHIM/Piik/releases) | +| Documentation index | [Repository documentation](../README.md) | + +The introduction is prepared with these links. DNS, deployment and release +publication must be verified when publishing. + +GitHub Pages can serve the complete website: it hosts +[static HTML, CSS and JavaScript](https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages). +The demo also needs the Go service for room authority, WebSocket signaling and +UDP STUN, so it runs on the separate US server rather than Pages. + +## Public Demo Configuration + +The chosen demo allows entry without a site password and provides P2P sharing +without SFU fallback. Use the [self-hosting runbook](./self-hosting.md) with: + +```dotenv +PIIK_ENV=production +LISTEN_HOST=127.0.0.1 +PORT=8787 +PUBLIC_BASE_URL=https://demo.piik.tv +ALLOWED_ORIGINS=https://demo.piik.tv +SITE_ACCESS_PASSWORD= +ROOM_DATABASE_PATH=/var/lib/piik/rooms.sqlite +MAX_VIEWERS_PER_ROOM=20 +STUN_URLS=stun:demo.piik.tv:3478 +NAT_PREDICTION_ENABLED=true +SFU_UDP_PORT= +``` + +Point `demo.piik.tv` directly at the US server so UDP reaches its STUN listeners; +allow UDP 3478/3479/3480 and terminate HTTPS/WSS at Caddy. The demo uses the +standard [systemd service](./service-management.md#systemd), with its release +under `/opt/piik/current` and configuration at `/etc/piik/piik.env`. The service +unit provides the SQLite state directory. Room ownership, invitations and private-room +admission still apply. The [configuration reference](../reference/configuration.md) +owns each setting and its bounds. + +For updates, verify the release descriptor and manifest before placing a new +release under `/opt/piik/releases/`. Stop Piik, back up its SQLite state, switch +`current` to the verified release, and restart. Check local/public health, +WebSocket room access and STUN. Keep the previous release and state backup until +acceptance; restore both with Piik stopped if rollback is needed. The nginx-specific +maintainer wrapper does not manage this Caddy installation. + +## Preview + +With the repository's development dependencies installed: + +```sh +npm run build:website +npm run preview:website +``` + +Open `http://127.0.0.1:18890`. Rebuild after editing source. The build bundles the +film's real product components into an isolated demonstration frame; publishing +`build/site/` needs no Node runtime or backend. Vite preview supplies HTTP byte +ranges for seeking the soundtrack. Keep asset links relative so both a custom +domain and GitHub's `/Piik/` project path work. + +## Publish when approved + +1. Verify the public copy and destinations above, publish the release artifacts + and open the source repository as part of the approved public launch. +2. In repository **Settings > Pages**, choose **GitHub Actions** as the source. + Use the dedicated Pages workflow, not publication of the repository root or + all of `docs/`, which includes developer research and operational reference. +3. Set the approved `piik.tv` custom domain in Pages settings and configure its + DNS using GitHub's [current domain instructions](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site). + Actions publishing does not need a `CNAME` file in the source tree. +4. Dispatch **Website** from `main` after the reviewed site is merged. The + workflow builds and uploads only `build/site/`; no App/Server packaging is run. Verify the + domain, HTTPS, both languages, relative asset paths and primary links. + +There is no automatic deployment on branch pushes. The workflow is prepared, +but writing it does not enable Pages or change DNS. The private production +site and the US P2P-only demo remain separate deployments. + +For rollback, dispatch the previously accepted site revision from a reviewed +revert on `main`; runtime App/Server binaries and databases are unaffected. diff --git a/docs/product/media-quality.md b/docs/product/media-quality.md index f3b95e9..51ad88b 100644 --- a/docs/product/media-quality.md +++ b/docs/product/media-quality.md @@ -4,7 +4,8 @@ This file owns the current Browser and App media contract. Detailed measurements platform limits live in [realtime quality research](../research/realtime-quality-adaptation.md) and [screen-audio research](../research/browser-screen-audio-quality.md). [ADR-0007](../adr/0007-path-isolated-representation-quality.md) owns Browser -source intent and codec selection; [ADR-0013](../adr/0013-embedded-node-local-media.md) +source intent and codec selection, [ADR-0008](../adr/0008-window-scoped-audio-capture.md) +owns screen-audio scope, and [ADR-0013](../adr/0013-embedded-node-local-media.md) owns the current candidate's shared Native/SFU output model. This file describes that source contract. [Status](../status.md) separates it from the last known production behavior and remaining acceptance. diff --git a/docs/product/presentation-lifecycle.md b/docs/product/presentation-lifecycle.md index 14ae661..3894c5b 100644 --- a/docs/product/presentation-lifecycle.md +++ b/docs/product/presentation-lifecycle.md @@ -11,6 +11,13 @@ available, starting a share and joining a room are equally discoverable actions; joining expands the four-digit room form in place, while `/join` remains a direct entry route. Users never choose a media topology. +Host entry requires both site access and a validated capability description. +Initial entry, retry and password recovery load the same prerequisites; failed +authentication cannot leave a later successful entry using absent capability +state. A capability-load failure remains retryable and does not imply that a +service is available or disabled. Viewer/Join entry does not need this Host-only +description. + The Host workspace centers the capture preview, room code, invitation and common share controls. The Viewer workspace centers one persistent 16:9 video stage, room identity, current state, roster, and one manual media-reconnect action. @@ -25,6 +32,13 @@ Browser picker and any exact App-owned native windows. It never chooses a window automatically. A reproduced Browser-window, capture, or background failure is required before introducing an embedded Web runtime. +Server and App share one control layout and vocabulary. Deployment capabilities +may fix a control on or off, but do not remove its place in the interface; +disabled controls explain their reason in text and pure-visual modes. Real +workflow differences remain explicit: site authorization, opt-in diagnostics +and the capture/audio capabilities of the connected device are not alternate +versions of the product UI. + A remembered App activation permits discovery when choosing a source or receiving media; it does not make App a prerequisite for sharing. Idle Host pages hold no App control session. Ordinary Web entry opens the Browser picker @@ -38,47 +52,69 @@ retire another operation's media. Optional native ingress uses an already available connection without another scan. If it is not ready at Browser startup, that share keeps Browser senders. +A reachable Piik App with an incompatible control protocol is distinct from an +absent App. Discovery continues looking for a compatible process before reporting +the mismatch; the source selector retains Browser operation and offers update/ +refresh guidance. Discovery metadata may grow, while known identity and capability +types remain validated. Missing optional capabilities are unavailable; control +commands and responses retain their strict protocol contract. + ## Visual Language -The interface presents one small shared living room rather than an operations -dashboard. The television is the media stage, the couch and pawns make presence -spatial, the shelf separates watching from controls, and the room display keeps -the four-digit code prominent. This metaphor must clarify the same product -state on Host and Viewer pages; decoration never creates a second state model. - Chinese, English, and pure-visual modes are three expressions of the same typed -state and command catalog. A fresh Browser starts in visual mode and persists -an explicit later choice. Text modes use concise copy. Visual mode uses one -consistent stroke language for single concepts, small panel comics for causes -and sequences, and literal scene objects for people, rooms, and media. Glyphs do -not form sentences. Universal digits, transport symbols, URLs, and measured -values remain literal when users need the data. +state and command catalog. On first use, the App and Server UI follow the +Browser's primary system language: Chinese uses Chinese text, and other +languages use English. Pure-visual mode remains an explicit choice. An explicit +later choice is persisted and takes precedence over that default. Text modes +use concise copy. -Control hints and state comics use the same television for shared or watched -media. Browser chrome identifies the application UI; a window title bar or a -display stand identifies the capture target. A server in a media path means -actual SFU relay, not merely opening a configured Site. - -Motion explains entry, transition, progress, and control feedback. Operational -status stays still; ambient motion is limited to the App brand mark's -occasional idle wink. -All meaning remains available with reduced motion. Functional -controls remain native buttons or inputs with localized accessible names, and -hover, keyboard focus, and touch receive equivalent guidance. - -The visual hierarchy, interaction ownership, and information order remain the -same across themes and viewport sizes. Responsive layout may reflow or scroll a -bounded visualization, but it must not hide a primary action, truncate an -essential value, overlap controls, or change product semantics. +The [visual language](../design/visual-language.md) is the single owner of +illustrative roles and objects, semantic colour, panel grammar, motion, +accessible input and responsive hierarchy. ## Playback Ownership -One native `
-
-
Piik / 品牌预览
- -
-
-
-
01 / A name taking shape
-

A little peek.
A familiar face.

-

From “Peek” in games to a little TV for watching together. Keep the wink. Give it a name.

-

探个头,看看朋友在玩什么。名字换了,小电视还是那个小电视。

-
-
-
- Piik → TV - - Piik becomes the winking TV - The P bowl opens into the screen, with the outer letter stems joining its sides. The two i dots become eyes, their stems become feet, and the k arms open into the TV antennae. - -
-

Same strokes. Familiar wink.P 撑开屏幕,ii 变成眼睛和脚,k 的两笔转成电视天线。

-
- - - - -
- -
-
- -

Three ways to write it三个名字写法,同一套笔画

One drawing style. Only the casing changes.

-
- -
-
02More contrast
- PiiK -

PiiK

A stronger K gives the name a sharper silhouette.两侧更高、更硬朗,也更抢眼。

-
-
-
03Softer
- piik -

piik

Relaxed and compact, with a lower centre of gravity.更轻松。小写 p 会伸到基线下方。

-
-
-
-
-
02 / The two little details
-

Two dots. Two curious eyes.

-

Round dots keep the ii easy to read, then become the familiar TV eyes.

-

The wordmark below is shown at everyday sizes.

-

两个圆点保留 ii 的辨识度,再变成小电视的眼睛。下面按实际尺寸查看。

-
Keep the existing TV for the tiny icon.
No four-letter favicon puzzle.
-
- - - - - - - -
HeightPiik
64 px
32 px
24 px
-
-

At home on a page放到页面上:官网首屏的方向草图

A static website. The sharing app stays a tool.

-
-
- -
DownloadGuideGitHub
-
-
-

Your game.
Their front row.

Share your screen. Bring your friends.
They watch right in their browsers.

开一局,朋友坐前排。
发个邀请,打开浏览器就能看。

- -
-
-
01 / Pick

A screen, a window, a game.选好想分享的画面。

-
02 / Invite

Send a link to your friends.把邀请链接发给朋友。

-
03 / Hang out

A little room for your people.人到齐,就一起看。

-
-
-
Display / 显示名称 PiikTechnical / 技术名称 piik-appWebsite / 官网 piik.tvPage title / 页签 Piik | 6020 · 📺
-
-