Public website for OpenSyria, a public data commons for reliable Syrian datasets, API access, and civic intelligence.
The website is intentionally small: a localized landing page, FAQ content, SEO metadata, social images, contributor attribution, theme and language controls, and links into the public API documentation and GitHub organization.
| URL | Purpose |
|---|---|
| https://opensyria.org | Public website |
| https://api.opensyria.org/docs | API documentation |
| https://github.com/Open-Syria | GitHub organization |
The site publishes public, read-only discovery metadata for agents:
/llms.txtand/index.mddescribe the project and link to the main public resources./auth.mdexplains that public website and dataset API access does not require registration, OAuth, API keys, or credentials./.well-known/api-cataloglinks to the public API documentation, OpenAPI description, health endpoint, and dataset pages./.well-known/agent-skills/index.jsonlists the available OpenSyria agent skills.- OAuth/OIDC and MCP well-known routes return explicit
404 application/problem+jsonresponses until OpenSyria offers protected auth flows or a public MCP server. Both/.well-known/mcp/server-card.jsonand the scanner-compatible plural alias/.well-known/mcp/server-cards.jsonuse that unsupported response.
- Next.js 16 App Router with Cache Components enabled
- React 19
- next-intl with
localePrefix: "as-needed" - shadcn Base UI components
- Tailwind CSS 4
- Biome for formatting and linting
- pnpm 11 with supply-chain protections
- Docker standalone Next.js runtime
- GitHub Actions deployment to
opensyria-prod
src/app/[locale]/ Localized app routes and metadata
src/components/ Website UI components
src/components/ui/ shadcn/Base UI primitives
src/i18n/ next-intl routing, navigation, and request config
src/lib/ Site config and GitHub data helpers
messages/ English and Arabic translations
public/ Public static assets
scripts/ Reproducible asset generation scripts
deploy/website/ Server runtime files copied during deployment
docs/ Contributor and operational documentation
Requirements:
- Node.js 24+
- pnpm 11+
Install dependencies:
corepack enable pnpm
pnpm installStart the development server:
pnpm devOpen:
http://localhost:3000
Application source code lives under src/.
Copy .env.example when local environment values are needed:
cp .env.example .env.local| Variable | Required | Purpose |
|---|---|---|
NEXT_PUBLIC_SITE_URL |
Local only | Canonical site URL for local testing |
NEXT_PUBLIC_DATASETS_API_URL |
Local only | API origin for future website/API integration |
NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ID |
Production | Real Google tag ID, such as GT-WPDWW3NR, or Tag Manager container ID, such as GTM-ABC1234 |
The Google tag ID is public by design. Production passes it at Docker build time and writes it into the runtime environment. Use the real ID from Google, not a placeholder such as GTM-... or GTM-XXXXXXX.
The site supports English and Arabic.
- English is the default locale and renders at
/. - Arabic renders at
/ar. - Locale prefixes use next-intl
as-neededrouting. - The HTML
dirattribute and Base UIDirectionProviderare both driven fromsrc/i18n/routing.ts.
Translations live in messages/en.json and messages/ar.json.
Open Graph and Twitter preview metadata explicitly reference the root social images:
/opengraph-image.png/twitter-image.png
Keep these images aligned with the current OpenSyria logo and visual theme so crawlers do not fall back to contributor avatars or other page images. When replacing the image content, bump the brand asset version in src/lib/site.ts so social crawlers request the refreshed URLs.
Regenerate social preview assets after brand changes:
pnpm images:brandGoogle Tag Manager is integrated through @next/third-parties/google.
Tracked CTA events use:
event=cta_click
cta_id=docs
cta_id=github_stars
The implementation keeps the landing page server-rendered and uses small client boundaries for tracked links and interactive FAQ controls.
Run all CI checks:
pnpm verifyFocused commands:
pnpm check
pnpm typecheck
pnpm buildApply Biome formatting and safe fixes:
pnpm check:writeProduction deployment is handled by .github/workflows/deploy-production.yml.
The workflow:
- Runs
pnpm verify. - Builds a Linux ARM64 Docker image from the
runtimetarget. - Pushes SHA and
maintags to GitHub Container Registry. - Joins the Tailscale network.
- Copies
deploy/websiteto/srv/opensyria/website. - Writes the server
.env. - Runs the blue/green deployment script.
Runtime image tags:
ghcr.io/open-syria/website:sha-<short-sha>
ghcr.io/open-syria/website:main
See docs/deployment.md and deploy/website/README.md.
Cloudflare should route:
opensyria.org -> http://website-proxy:80
api.opensyria.org -> http://proxy:80
Keep opensyria.org as the canonical host. Redirect http://opensyria.org, http://www.opensyria.org, and https://www.opensyria.org to https://opensyria.org in one Cloudflare redirect rule to avoid redirect chains.
- Contributing
- Code of Conduct
- Security Policy
- Support
- Changelog
- Pull Request Workflow
- Supply Chain Security
- Deployment
- Releases
The website is public for transparency, auditability, and reuse, but broad implementation work is maintainer-led.
Good public contributions here include documentation corrections, broken links, accessibility fixes, reproducible website bugs, deployment/tooling fixes, and maintainer-requested changes.
Dataset corrections belong in the relevant dataset repository.
Website code is licensed under MIT. See LICENSE.