Socialize
Socialize is an organization-owned, workspace-based workflow application for social media content review, revision, approval, and publication readiness.
It is not a public social network. The product is for internal teams, providers, and client approvers coordinating content work before publication.
Monorepo
- Backend: .NET 10 Web API in
backend/src/Socialize.Api - Backend tests:
backend/tests/Socialize.Tests - Frontend: Vue 3 + Vite + Vuetify + Pinia in
frontend - API contract: OpenAPI snapshot in
shared/openapi - Deployment: Docker Compose + Caddy
- Agentic workflow: specs, task files, and prompt templates under
docs
Local Development
Terminal 1:
./scripts/start-infrastructure.sh
./scripts/dev-backend.sh
Terminal 2:
./scripts/dev-frontend.sh
Frontend:
http://localhost:5173
http://<this-machine-lan-ip>:5173
Backend:
http://localhost:5080
http://<this-machine-lan-ip>:5080
Swagger UI:
http://localhost:5080/api
Update Frontend API Types
The backend must be running first.
./scripts/update-openapi.sh
This writes:
shared/openapi/openapi.json
frontend/src/api/schema.d.ts
Docker Compose
docker compose up --build
Then open:
http://localhost:8080
http://<this-machine-lan-ip>:8080
For preprod deployment, configure the POSTGRES_PASSWORD, RESEND_API_KEY,
RESEND_FROM_EMAIL, and JWT_SIGNING_KEY Gitea secrets.
The deploy workflow writes the remote .env file and syncs deploy/compose.yml
before running the server deploy script.
Use the raw Resend API key value for RESEND_API_KEY, without a Bearer prefix.
Preprod Observability
The optional observability overlay runs a self-hosted Grafana stack for preproduction:
- Grafana
13.0.1: dashboards - Prometheus
v3.11.3: metrics and local alert rules - Loki
3.7.1: Docker/container logs - Tempo
2.10.3: traces - Grafana Alloy
v1.16.0: OTLP receiver and Docker log collector
Start the app with observability:
docker compose -f deploy/compose.yml -f deploy/observability/compose.observability.yml up -d
Grafana is exposed at:
http://127.0.0.1:3000
Default credentials are admin / admin unless GRAFANA_ADMIN_USER and
GRAFANA_ADMIN_PASSWORD are set. Set GRAFANA_HTTP_BIND=0.0.0.0 only when the
preprod network boundary is trusted or protected by a reverse proxy/VPN.
Set a non-default GRAFANA_ADMIN_PASSWORD before exposing Grafana outside the
host. Prometheus alert rules are provisioned under
deploy/observability/prometheus/rules/; notification delivery is intentionally
left to the preprod operations environment.
Set ALERTMANAGER_WEBHOOK_URL to route alerts to a private notification endpoint.
See docs/OPERATIONS/observability-runbook.md for bring-up, alert triage, and
the optional protected Caddy configuration for Grafana.
Solution
dotnet build backend/Socialize.slnx
dotnet test backend/Socialize.slnx
Frontend Build
cd frontend
npm run build
Database Diagram
Start PostgreSQL, then generate a local schema diagram:
./scripts/generate-db-diagram.sh
The script writes an HTML viewer, SVG, PNG, and Graphviz source under:
.artifacts/db-diagrams/
Use DATABASE_URL, PGPASSWORD, or ~/.pgpass to provide local database credentials.
When using the repository infrastructure script, the diagram script can read from the
running socialize-postgres container directly.
Agentic Workflow
Start here:
docs/AGENTIC_WORKFLOW.md
Use feature specs, task files, and prompt templates instead of asking agents to work from vague chat history.