尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗PublyApp is a full-stack SaaS foundation for teams operating across multiple organizations and projects. The repository combines a .NET 10 API, a React 19 frontend built with TanStack Start, PostgreSQL, background jobs, database migrations, and a TypeScript client generated from the API's OpenAPI contract.
The platform has three distinct operating scopes:
| Scope | Purpose |
|---|---|
| Staff | Platform-wide administration and support across tenants. |
| Tenant | Organization-level users, settings, and operations. |
| Project | A workspace boundary inside a tenant. |
Staff and tenant/project accounts are mutually exclusive. This keeps the platform-administration boundary separate from tenant data and permissions.
PublyApp already carries the core post and publishing pipeline. The product direction is to turn it into a complete multi-network workspace, with richer calendar, queue, planning, and review experiences. Those end-to-end product surfaces remain active development areas; partial workflows are not presented as complete.
justOn Windows, the justfile requires PowerShell 7 (pwsh).
cp .env.example .env.development
just dev
just dev stays attached and runs the whole stack: it applies pending
migrations, then starts persistent PostgreSQL (host port 5454), the API
(5000), the worker, and the frontend (5050). just dev <pr|issue|branch> runs
the same stack from the matching worktree, creating it when missing. Branches
created before #2305 must be updated with develop first.
| Service | Local address |
|---|---|
| Frontend | http://localhost:5050 |
| API | http://localhost:5000 |
| API reference (Scalar) | http://localhost:5000/scalar/v1 |
| PostgreSQL | localhost:5454 |
Do not start just dev-api alongside just dev; the AppHost already owns
port 5000. For the single-piece recipes and environment rules, read the
development commands in AGENTS.md.
flowchart LR
Browser["apps/front<br/>React 19 · TanStack Start"]
Client["packages/client-ts<br/>generated by Kiota"]
API["apps/api<br/>.NET 10 Minimal API"]
Handlers["handlers · services"]
DB[("PostgreSQL 18")]
Worker["worker<br/>same API image"]
Migrator["one-shot migrator"]
Browser --> Client
Client -->|X-Session-Token · X-Tenant-Id| API
API --> Handlers --> DB
Worker --> DB
Migrator --> DB
API -. OpenAPI .-> Client
The backend uses domain-first vertical slices: endpoints map routes and permissions, handlers orchestrate an operation, and domain services own business logic and data access. Authenticated frontend data stays client-side and flows through TanStack Query and the generated API client.
apps/
├── api/ # API, worker runtime, and migrator source
└── front/ # shipped TanStack Start frontend
packages/
├── client-ts/ # generated API client; never edit by hand
├── shared-ts/ # shared validation, types, and i18n
├── lint-ts/ # custom TypeScript lint rules
├── lint-cs/ # custom Roslyn analyzers
└── scripts-cs/ # .NET code-generation tools
Read the focused guides for the full rules:
The TypeScript client is generated from the backend's OpenAPI document. After changing an endpoint or wire contract, regenerate and type-check it:
just build-api
just generate-client
pnpm --filter front typecheck
Never hand-edit packages/client-ts; regeneration replaces its contents.
The repository uses just for its supported workflows. just --list is the
full command reference; these are the common entry points:
| Command | Purpose |
|---|---|
just dev | Run the complete local stack. |
just build-api | Build the API and emit OpenAPI. |
pnpm --filter front build | Build the shipped frontend. |
just test-api | Run API integration tests with Testcontainers. |
pnpm --filter front test | Run frontend tests and their existing guards. |
just lint && just format | Apply lint and formatting fixes. |
just ci | Run the local pre-push gate, including the API suite. |
just ci-full | Add both end-to-end suites to the pre-push gate. |
GitHub Actions also runs the API, frontend, contract, documentation, and security gates required for pull requests. See the local CI guide for the exact local/hosted mapping and known gaps.
Pull requests land on develop through GitHub's merge queue: the combination of
your branch and the current develop is tested as one merge group before it
lands, so two pull requests that are each green cannot break develop together
(#1889).
Start with CONTRIBUTING.md, then read AGENTS.md,
the source of truth for this repository's architecture and coding conventions.
The latter applies to both human contributors and coding agents.
Contributors sign the CLA once by adding themselves to
CLA-SIGNATURES.md and including the acceptance statement
described in the agreement.
Useful rules to know before opening a pull request:
apps/front; the retired frontend is not in this tree.apps/api/Modules/<Domain>/.401.The repository publishes three release images — api, migrate, and front.
The declared Dokploy topology runs four services: API, worker (from the API
image), one-shot migrator, and frontend. All release images share one immutable
commit tag.
Operational details live in the maintained deployment documents:
The source in this repository is licensed under the
Apache License 2.0. See NOTICE for attribution and the
repository scope.
PublyApp uses an open-core model. Paid modules distributed separately as
closed-source binaries are not part of this repository and are not covered by
its Apache-2.0 licence. Contributions to this repository are governed by the
CLA, under which contributors keep their copyright while granting
the project the rights described there.