Public marketing and product website for MNSCloud.
This repository is intentionally separate from the administrative Angular app. It is a public, static-first website focused on product positioning, modules, security posture, developer ecosystem, and commercial contact flows.
- Astro
- TypeScript
- Static output by default
- Product/runtime:
mnscloud-website - Project directory:
/opt/mnscloud/mnscloud-website - Framework: Astro
- Local development command:
npm run dev - Build command:
npm run build - Preview command:
npm run preview - Static build output:
dist/ - Public assets directory:
public/ - CMS route:
/admin - CMS configuration:
public/admin/config.yml - Editable site content:
src/content/site/*.json - Blog content:
src/content/blog/ - Uploaded media directory:
public/uploads/ - Site URL override:
PUBLIC_SITE_URL - GitHub artifact:
mnscloud-website-dist-<run-number>
Install GitHub CLI if needed: cli/cli installation.
Authenticate GitHub CLI:
gh auth loginClone the private repository:
sudo install -d -m 0755 /opt/mnscloud
cd /opt/mnscloud
gh repo clone manaoscloud/mnscloud-website
cd /opt/mnscloud/mnscloud-websitenpm install
npm run devOpen http://localhost:4321.
The website includes a git-based admin surface powered by Decap CMS:
/admin
The admin edits repository content instead of writing to a database. Blog posts are stored as
Markdown files in src/content/blog/, uploaded media is stored in public/uploads/, and every
published change can be reviewed through Git history or Pull Requests depending on the GitHub
backend configuration.
Editable site content is stored in:
src/content/site/settings.json
src/content/site/home.json
src/content/site/modules.json
src/content/site/pages.json
src/content/site/modulePages.json
src/content/blog/
The admin exposes collections for global settings, navigation, CTAs, the home page, product modules, module detail pages, core pages, media, and blog posts. Any page or component that should be marketing-editable must read from these content files instead of hardcoding copy in Astro components.
For local CMS testing, run Decap's local backend in one terminal and the Astro dev server in another:
npm run cms
npm run devThen open http://localhost:4321/admin.
Production authentication is handled by the configured GitHub backend/OAuth provider. Do not add GitHub tokens, OAuth secrets, customer data, private domains, or infrastructure details to this repository.
There is no default username/password. That is intentional.
The admin writes to Git, so production access is controlled by GitHub:
- Invite the maintainer to the
manaoscloud/mnscloud-websiterepository or to the correct GitHub team. - Give the minimum permission needed for the role.
- The maintainer signs in through the configured GitHub OAuth/Git Gateway flow.
- Content changes are committed through the CMS/editorial workflow and remain reviewable in Git.
This avoids shipping password hashes, user tables, reset flows, or permanent credentials in the public website repository. If MNSCloud later needs local username/password accounts, that should be a separate private identity service or API-backed admin, not static website code.
A partner may build the website and host the generated dist/ files on their own server, CDN, or
static hosting provider. The public pages will work as static HTML/CSS/JS.
The public site URL can be configured in two places:
src/content/site/settings.json, used by rendered pages, metadata, and as the default Astro site URL.PUBLIC_SITE_URLat build time, used as an explicit deployment override for sitemap/canonical generation.
Example:
PUBLIC_SITE_URL=https://partner.example.com npm run buildFor partner white-label deployments, update the CMS-controlled site settings first:
{
"site": {
"url": "https://partner.example.com",
"supportEmail": "support@partner.example.com"
}
}The /admin screen is different: it is only the editor UI. To save content changes, it still needs a
writable Git backend and authentication provider.
Recommended partner flow:
- Fork or clone
manaoscloud/mnscloud-websiteinto the partner's GitHub organization. - Update
public/admin/config.ymlsobackend.repopoints to the partner repository. - Keep
site_urlanddisplay_urlinpublic/admin/config.ymlas/unless the deployment has a very specific reason to force an absolute external URL. This keeps "Go back to site" on the current domain. - Configure the Decap CMS GitHub OAuth/Git Gateway provider for the partner domain.
- Add marketing users as GitHub collaborators or members of a GitHub team with the minimum required repository permission.
- Editors access
/admin, authenticate through GitHub/OAuth, and create content through the editorial workflow. - A build/deploy pipeline publishes the updated static
dist/output to the partner server/CDN.
The admin is intended to let a partner launch quickly without rewriting the site. These areas must
remain editable from /admin:
- Global identity: public URL, default metadata, support email, API base URL, GitHub organization, repository URL, API docs URL, logo labels, and favicon/OG image paths.
- Navigation: header links, primary CTA, secondary CTA, footer columns, legal links, and social links.
- Home page: hero, trust signals, module cards, architecture section, blog section, and final CTA.
- Product structure: module cards and module detail pages for VoIP, Hosting, Monitoring, Cyber Security, and Support.
- Core pages: API docs, developers, security, contact, architecture, company, use cases, status, changelog, FAQ, and blog landing copy.
- Blog posts and uploaded public media.
The following values are intentionally not managed by CMS content because they are deployment or repository concerns that the CMS must know before it can load:
public/admin/config.ymlbackend.repopublic/admin/config.ymlsite_urlanddisplay_urlwhen a deployment intentionally needs an absolute external URL instead of the default/- OAuth/Git Gateway provider configuration
- CI/CD deployment secrets and hosting credentials
When adding new marketing pages, add their copy to src/content/site/*.json or blog Markdown and
then expose the fields in public/admin/config.yml. Do not hardcode partner-editable text directly
inside Astro pages.
If a partner requires standalone username/password accounts managed outside GitHub, that is no longer a purely static git-based CMS. It should be implemented as an API-backed private admin or a self-hosted headless CMS with database-backed users, roles, sessions, password reset, audit logs, and deployment webhooks.
npm run buildStatic output is generated in dist/.
The repository includes a manual GitHub Actions workflow that builds the static website and exposes
the generated dist/ folder as a downloadable artifact.
Use it when you want GitHub to generate the package and then upload the files manually to your hosting provider:
- Open the repository on GitHub.
- Click
Actions. - Select
Build Website Artifact. - Click
Run workflow. - Optionally enter
PUBLIC_SITE_URL, for examplehttps://manaos.cloud. - Wait for the workflow to finish.
- Open the completed run and download the artifact named
mnscloud-website-dist-<run-number>. - Extract it and upload the generated files to the web root of the hosting server.
The artifact is generated from dist/; it is the same output created locally by npm run build.
The workflow does not deploy automatically and does not require production hosting credentials.
The workflow uses GitHub official actions that run on the Node.js 24 action runtime to avoid
GitHub Actions Node.js 20 deprecation warnings.
The public website must be fully responsive before release. The header, CTAs, cards, module pages, blog, docs, and contact pages must work without horizontal document overflow at mobile, tablet, and desktop widths.
Run the automated viewport check with the Astro dev server running:
npm run dev
npm run check:responsiveThe check currently validates the primary public pages at 320px, 390px, 768px, and 1440px.
If a new public page is added, include it in scripts/responsive-check.mjs.
The website includes public pages designed to make the company and platform easier to evaluate:
/architecture/company/use-cases/status/changelog/faq
These pages are intentionally CMS-managed through src/content/site/pages.json and
public/admin/config.yml. They should communicate real operating posture, architecture boundaries,
public repository strategy, and customer-facing trust signals without exposing private control-plane
logic, customer data, credentials, or internal topology.
The website is the official Manaos Cloud site by default, but partner/fork deployments must not inherit hardcoded navigation back to the official domain.
Official domains are allowed only in:
src/content/site/settings.jsonas the official site content/configuration.astro.config.mjsas the final fallback when no site URL is configured.- Documentation examples.
Decap CMS must keep these values relative:
site_url: "/"
display_url: "/"Run:
npm run check:domainsFor the full release validation:
npm run checkThe website includes a compliance-ready trust and legal structure:
/trust/legal/privacy/legal/cookies/legal/terms/legal/data-processing/legal/subprocessors- Cookie consent banner and preferences modal
- Footer legal links and cookie settings entry point
Legal and privacy content is editable in:
src/content/site/legal.json
src/content/site/settings.json
The cookie consent component stores preferences in localStorage under
mnscloud_cookie_consent. Only necessary storage is enabled by default. Any future analytics,
marketing, embedded third-party widgets, or functional scripts must be gated behind the matching
consent category before loading.
The legal texts are templates for product readiness. They must be reviewed and approved by qualified legal counsel before production use in any jurisdiction.
Blog posts are static Markdown content:
src/content/blog/<slug>.md
Each post must include frontmatter with title, description, date, author, tags, status,
and optional featured/image fields. Published posts are generated under /blog/<slug>/ and are
included in the static build and sitemap.
Approved brand files belong in:
public/brand/
Current working assets:
mnscloud-logo.pngmnscloud-logo-light.pngmnscloud-wordmark-orange.pngmnscloud-wordmark-green.pngmnscloud-wordmark-stacked-green.pngmnscloud-watermark.pngfavicon.png
The current implementation follows brand_manual.pdf: Safety Orange #F5832E, Hunter Green
#1D5B31, Montserrat for body text, Oswald for titles, and clear-space/proportion rules for logo
usage. Preserve public-safe metadata only.
This website is public. Do not add secrets, customer data, production infrastructure details, provider credentials, database credentials, private business rules, or API-side authorization logic.
Future API integrations, such as contact forms or demo requests, must use public API endpoints with server-side validation.