{"id":48578079,"url":"https://github.com/weblancaster/personal-blog","last_synced_at":"2026-04-08T16:04:03.383Z","repository":{"id":342910695,"uuid":"1175422445","full_name":"weblancaster/personal-blog","owner":"weblancaster","description":"My personal blog - A simple yet clear website","archived":false,"fork":false,"pushed_at":"2026-03-08T00:39:54.000Z","size":150,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-08T04:42:54.583Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"CSS","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/weblancaster.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-07T17:33:52.000Z","updated_at":"2026-03-08T00:39:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/weblancaster/personal-blog","commit_stats":null,"previous_names":["weblancaster/personal-blog"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/weblancaster/personal-blog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weblancaster%2Fpersonal-blog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weblancaster%2Fpersonal-blog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weblancaster%2Fpersonal-blog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weblancaster%2Fpersonal-blog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/weblancaster","download_url":"https://codeload.github.com/weblancaster/personal-blog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/weblancaster%2Fpersonal-blog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31562697,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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-08T16:04:03.309Z","updated_at":"2026-04-08T16:04:03.372Z","avatar_url":"https://github.com/weblancaster.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# personal-blog\n\nPersonal portfolio and blog for [bymichaellancaster.com](https://bymichaellancaster.com), built with [Astro](https://astro.build). Outputs 100% static HTML — zero client-side JavaScript shipped by default.\n\n## Tech Stack\n\n- **[Astro](https://astro.build)** — Static site generator\n- **Markdown** — Blog post authoring format\n- **Vanilla CSS** — No framework, all design tokens live in `src/styles/global.css`\n- **GitHub Actions** — Automated build and deployment to GitHub Pages\n\n## Project Structure\n\n```\n/\n├── public/\n│   └── CNAME                          # Custom domain for GitHub Pages\n├── src/\n│   ├── layouts/\n│   │   ├── Layout.astro               # Global page wrapper (head, sidebar, SEO)\n│   │   └── BlogPost.astro             # Individual blog post layout\n│   ├── components/\n│   │   ├── Sidebar.astro              # Sidebar nav (scrollspy on homepage)\n│   │   ├── Footer.astro\n│   │   ├── BlogCard.astro             # Post preview card\n│   │   └── SectionHeader.astro        # Numbered section heading\n│   ├── pages/\n│   │   ├── index.astro                # Homepage (portfolio + latest posts)\n│   │   └── blog/\n│   │       ├── index.astro            # Full post listing page\n│   │       └── [...slug].astro        # Dynamic route — one page per post\n│   ├── content/\n│   │   ├── config.ts                  # Blog content collection schema (Zod)\n│   │   └── blog/                      # ← Your Markdown posts live here\n│   │       ├── intro-to-react.md\n│   │       └── desktop-nwjs.md\n│   └── styles/\n│       └── global.css                 # All CSS (tokens, layout, components, prose)\n├── astro.config.mjs\n├── package.json\n└── .github/workflows/deploy.yml       # GitHub Pages deployment pipeline\n```\n\n## Commands\n\nRun all commands from the project root:\n\n| Command             | Description                                              |\n| ------------------- | -------------------------------------------------------- |\n| `npm install`       | Install dependencies                                     |\n| `npm run dev`       | Start local dev server at `http://localhost:4321`        |\n| `npm run build`     | Build production site to `./dist/`                       |\n| `npm run preview`   | Preview the production build locally before deploying    |\n| `npm run astro`     | Run Astro CLI commands directly (e.g. `npm run astro check`) |\n\n## Writing a Blog Post\n\n1. Create a new Markdown file in `src/content/blog/`:\n\n   ```\n   src/content/blog/my-post-slug.md\n   ```\n\n   The filename becomes the URL: `/blog/my-post-slug/`\n\n2. Add frontmatter at the top of the file:\n\n   ```markdown\n   ---\n   title: \"Your Post Title\"\n   date: 2026-03-07\n   excerpt: \"A one or two sentence summary shown on listing pages.\"\n   tags: [\"react\", \"typescript\"]\n   readTime: \"5 min read\"\n   published: true\n   ---\n\n   Your post content in Markdown goes here.\n   ```\n\n3. Write the body in standard Markdown. Supported elements:\n\n   - Headings (`##`, `###`, `####`)\n   - Paragraphs, bold (`**text**`), italic (`*text*`)\n   - Ordered and unordered lists\n   - Inline code (`` `code` ``) and fenced code blocks (` ``` `)\n   - Blockquotes (`\u003e ...`)\n   - Horizontal rules (`---`)\n   - Images (`![alt](url)`)\n   - Links (`[text](url)`)\n\n4. Save the file. In dev mode (`npm run dev`) the post appears instantly at `http://localhost:4321/blog/my-post-slug/`. It will also appear in the \"Writing\" section on the homepage (latest 5 posts) and on the full listing at `/blog/`.\n\n5. Push to `main` — the GitHub Actions workflow builds and deploys automatically.\n\n### Frontmatter Reference\n\n| Field       | Type       | Required | Description                                            |\n| ----------- | ---------- | -------- | ------------------------------------------------------ |\n| `title`     | `string`   | Yes      | Post title                                             |\n| `date`      | `YYYY-MM-DD` | Yes    | Publication date (used for sorting)                    |\n| `excerpt`   | `string`   | Yes      | Short summary shown on cards and in meta descriptions  |\n| `tags`      | `string[]` | Yes      | Array of topic tags (e.g. `[\"react\", \"performance\"]`)  |\n| `readTime`  | `string`   | No       | Estimated read time (e.g. `\"5 min read\"`)              |\n| `published` | `boolean`  | No       | Defaults to `true`. Set to `false` to hide a draft.    |\n\n### Draft Posts\n\nSet `published: false` in the frontmatter to hide a post from all listings and prevent a page from being generated:\n\n```markdown\n---\ntitle: \"Work in Progress\"\ndate: 2026-03-07\nexcerpt: \"...\"\ntags: [\"draft\"]\npublished: false\n---\n```\n\n## Deployment\n\nThe site deploys automatically to GitHub Pages on every push to `main` via `.github/workflows/deploy.yml`.\n\n**One-time setup** (if not already configured):\n\n1. Go to the repository **Settings → Pages**\n2. Set **Source** to **GitHub Actions**\n3. If using a custom domain, ensure `public/CNAME` contains your domain name — it currently contains `bymichaellancaster.com`\n\nThe production build outputs to `dist/` and generates:\n- `dist/index.html` — Homepage\n- `dist/blog/index.html` — Post listing\n- `dist/blog/\u003cslug\u003e/index.html` — One page per post\n- `dist/sitemap-index.xml` + `dist/sitemap-0.xml` — Auto-generated sitemap\n\n## Local Development\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpen `http://localhost:4321` in your browser. Changes to `.astro` files, `.md` posts, and CSS hot-reload automatically.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fweblancaster%2Fpersonal-blog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fweblancaster%2Fpersonal-blog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fweblancaster%2Fpersonal-blog/lists"}