{"id":47796162,"url":"https://github.com/matrixorigin/matrixorigin-blog","last_synced_at":"2026-04-03T16:24:16.199Z","repository":{"id":347294478,"uuid":"1193459993","full_name":"matrixorigin/matrixorigin-blog","owner":"matrixorigin","description":"matrixorigin blog content management","archived":false,"fork":false,"pushed_at":"2026-03-27T09:24:03.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-27T20:38:31.961Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/matrixorigin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-27T08:47:39.000Z","updated_at":"2026-03-27T09:24:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/matrixorigin/matrixorigin-blog","commit_stats":null,"previous_names":["matrixorigin/matrixorigin-blog"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/matrixorigin/matrixorigin-blog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrixorigin%2Fmatrixorigin-blog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrixorigin%2Fmatrixorigin-blog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrixorigin%2Fmatrixorigin-blog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrixorigin%2Fmatrixorigin-blog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matrixorigin","download_url":"https://codeload.github.com/matrixorigin/matrixorigin-blog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrixorigin%2Fmatrixorigin-blog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31362723,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T15:19:21.178Z","status":"ssl_error","status_checked_at":"2026-04-03T15:19:20.670Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-03T16:24:15.548Z","updated_at":"2026-04-03T16:24:16.185Z","avatar_url":"https://github.com/matrixorigin.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# MatrixOrigin Blog\n\nThis repository is the **shared content source** for blog posts across MatrixOrigin projects.\n\nEach project has its own top-level directory. Each project's backend only watches its own directory and ignores the rest.\n\n```\nmemoria/          ← Memoria articles → synced to thememoria.ai/blog.html\n  introducing-memoria/\n    index.md\n    images/\n    videos/\nproject-b/        ← Future projects get their own directory\n  their-article/\n    index.md\n```\n\n---\n\n## Memoria Blog\n\nArticles in `memoria/` are automatically published to [thememoria.ai/blog.html](https://thememoria.ai/blog.html).\n\nThe Memoria backend watches this directory via GitHub Webhook and a periodic poller (every 5 minutes as fallback). Push a change → article updates within seconds.\n\n---\n\n## How to publish a new Memoria article\n\n### 1. Create a directory under `memoria/`\n\n```\nmemoria/\n  your-article-slug/       ← directory name becomes the URL slug\n    index.md               ← article content (required)\n    images/                ← optional: images referenced in the article\n      cover.png\n    videos/                ← optional: videos referenced in the article\n      demo.mp4\n```\n\n**Slug naming rules** (strictly enforced — invalid slugs are ignored):\n- Only lowercase ASCII letters (`a–z`), digits (`0–9`), and hyphens (`-`)\n- Must start and end with a letter or digit (no leading/trailing hyphens)\n- Maximum 120 characters\n- ✅ `introducing-memoria`, `release-v2-0`, `how-to-use-mcp`\n- ❌ `Introducing_Memoria` (uppercase + underscore), `-draft` (leading hyphen), `my article` (space)\n\n### 2. Write `index.md` with front matter\n\nEvery `index.md` must start with a YAML front matter block:\n\n```markdown\n---\ntitle: \"Your Article Title in English\"\ntitle_zh: \"中文标题\"\ndate: \"2026-04-01\"\ntag: \"Announcement\"\ntag_zh: \"公告\"\nstatus: \"draft\"\ndescription: \"One-sentence summary in English, shown on the blog list page.\"\ndescription_zh: \"中文摘要，显示在博客列表页。\"\n---\n\nYour Markdown content starts here...\n```\n\n#### Front matter fields\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `title` | **Yes** | English title (max 500 chars) |\n| `date` | **Yes** | ISO date `YYYY-MM-DD` — used for chronological sorting |\n| `status` | **Yes** | `draft` = not visible · `published` = live on website |\n| `title_zh` | No | Chinese title (shown when user switches to 中文) |\n| `tag` | No | English tag label, e.g. `Announcement`, `Tutorial`, `Case Study` |\n| `tag_zh` | No | Chinese tag label |\n| `description` | No | English summary shown on article list (~150 chars) |\n| `description_zh` | No | Chinese summary |\n\n\u003e **Important:** `status` is case-sensitive. `published` works; `Published` or `PUBLISHED` will be treated as `draft`.\n\n### 3. Add images (optional)\n\nPlace images in the `images/` subdirectory and reference them with a relative path:\n\n```markdown\n![A descriptive alt text](./images/cover.png)\n```\n\nSupported formats: **PNG, JPEG, GIF, WebP, SVG**\n\nWhen the article is published, the backend automatically:\n1. Downloads the image from this repository\n2. Uploads it to Aliyun OSS for fast CDN delivery\n3. Replaces `./images/\u003cfilename\u003e` with the permanent OSS URL in the stored content\n\n\u003e **Note:** Always use the `./images/` prefix (with `./`). Paths like `images/cover.png` (without `./`) are not recognized.\n\n### 4. Add videos (optional)\n\nPlace video files in the `videos/` subdirectory and reference them using Markdown image syntax:\n\n```markdown\n![Product demo video](./videos/demo.mp4)\n```\n\nSupported formats: **MP4, WebM, MOV, OGG**\n\nThe backend uploads the video to OSS (same as images), and the frontend automatically renders it as an HTML5 `\u003cvideo controls\u003e` player instead of an `\u003cimg\u003e` tag.\n\n**For large videos (\u003e 50 MB), prefer embedding from an external platform:**\n\n```html\n\u003c!-- YouTube embed --\u003e\n\u003ciframe width=\"100%\" height=\"400\"\n  src=\"https://www.youtube.com/embed/VIDEO_ID\"\n  frameborder=\"0\" allowfullscreen\u003e\u003c/iframe\u003e\n\n\u003c!-- Bilibili embed --\u003e\n\u003ciframe width=\"100%\" height=\"400\"\n  src=\"https://player.bilibili.com/player.html?bvid=BVID\"\n  frameborder=\"0\" allowfullscreen\u003e\u003c/iframe\u003e\n```\n\n### 5. Publish\n\nChange `status: \"draft\"` to `status: \"published\"` and push:\n\n```bash\ngit add .\ngit commit -m \"publish: your-article-slug\"\ngit push\n```\n\nThe website updates within a few seconds via GitHub Webhook.\n\nTo **unpublish**, change `status` back to `\"draft\"` and push.\n\n---\n\n## Editing an existing article\n\nEdit `index.md` and push. The backend detects the file SHA change and re-syncs automatically. Only modified articles are re-processed; unchanged ones are skipped.\n\n---\n\n## Deleting an article\n\nRemove the entire article directory and push. On the next sync, the backend marks the article as deleted and it disappears from the website.\n\n```bash\ngit rm -r memoria/your-article-slug/\ngit commit -m \"remove: your-article-slug\"\ngit push\n```\n\n---\n\n## Directory structure example\n\n```\nmemoria/\n  introducing-memoria/\n    index.md\n    images/\n      hero.png\n      architecture.svg\n  how-to-use-mcp/\n    index.md\n    images/\n      screenshot.png\n    videos/\n      setup-demo.mp4\n```\n\n---\n\n## Writing tips\n\n- **Bilingual content**: Write both English and Chinese fields in the front matter. The website has a language toggle; the article body is single-language.\n- **Markdown support**: Full CommonMark + GFM — tables, code blocks with syntax highlighting, blockquotes, task lists, etc.\n- **Image size**: Keep individual images under 10 MB. The backend handles files of any size (GitHub's 1 MB inline limit is bypassed via `download_url`).\n- **Video size**: Keep local videos under 50 MB. For larger videos, use an external platform (YouTube / Bilibili) and embed via `\u003ciframe\u003e`.\n- **Preview locally**: Use any Markdown editor (VS Code, Typora, Obsidian) to preview before publishing. Front matter is displayed as a table in most editors.\n- **Slug naming**: Use descriptive, URL-friendly slugs: `memoria-v2-release`, `cursor-memory-tutorial`, `mcp-quick-start`.\n- **Date matters**: Articles are sorted by `date` (newest first). Make sure the date reflects the intended publication order.\n\n---\n\n## Frequently asked questions\n\n**Q: I pushed but the article didn't appear on the website.**\n- Check that `status` is exactly `\"published\"` (lowercase)\n- Check that the directory slug is valid (lowercase, no spaces, no underscores)\n- Wait up to 5 minutes for the periodic poller to run\n\n**Q: My image isn't showing.**\n- Make sure the file is in the `images/` subdirectory (not in the root of the article directory)\n- Make sure the reference uses `./images/filename` (with `./`)\n- Check that the file extension is one of: `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg`\n\n**Q: Can I rename an article directory?**\n- Yes, but the old slug will be marked as deleted and a new slug will be created. Any external links to the old URL (`blog.html#old-slug`) will break.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrixorigin%2Fmatrixorigin-blog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatrixorigin%2Fmatrixorigin-blog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrixorigin%2Fmatrixorigin-blog/lists"}