How the Notion-synced blog at eldur.studio/resources/ works, and how to operate it.
You write in Notion. A GitHub Action picks it up automatically.
Notion DB (Status = Published)
↓ GitHub Action (every 2h or manual trigger)
↓ notion-sync.js → _posts/YYYY-MM-DD-slug.md
↓ git commit + push to main
GitHub Pages → Jekyll rebuild (automatic on push)
↓
eldur.studio/resources/ ← listing page
eldur.studio/resources/[slug]/ ← individual posts
resources/images/, commit to main, use the raw URL:
https://raw.githubusercontent.com/UberVero/ES2website/main/resources/images/your-image.pngDatabase ID: ce0d53fdc6a2489a8201330e13bd3515
| Property | Type | Required | Notes |
|---|---|---|---|
| Title | Title | ✓ | Post headline |
| Slug | Text | ✓ | URL path — lowercase, hyphens only, e.g. ai-agents-b2b |
| Status | Select | ✓ | Draft or Published — only Published posts sync |
| Published Date | Date | ✓ | Sets post URL and sort order |
| Description | Text | Excerpt for cards + og:description | |
| Author | Text | Byline (e.g. Veronica) | |
| Post Type | Select | Article, Guide, Case Study, Tutorial | |
| Category | Select | Guides, Case Studies, AI & Automation, Strategy | |
| Tags | Multi-select | AI Agents, B2B Marketing, One-Person Team, Strategy, Automation | |
| Featured Image URL | URL | Stable URL only — use resources/images/ in repo or external CDN. Notion S3 URLs expire. |
|
| Last Modified Date | Date | Optional, for dateModified in schema.org |
Edit in Notion — any field. The next sync detects the change via notion_id in the Markdown
front matter and overwrites the file in place. No duplicate posts.
If you change the Slug or Published Date: the old file is deleted and a new one is created at the new URL. The old URL will 404. Update any links before changing slugs on live posts.
Change Status → Draft in Notion. The sync will no longer update the post, but the existing
_posts/ file stays live until you delete it from the repo manually.
| File | Purpose |
|---|---|
scripts/notion-sync.js |
Queries Notion API, converts pages to Jekyll Markdown |
.github/workflows/notion-sync.yml |
GitHub Action: 2h schedule + manual trigger |
_config.yml |
Jekyll config: permalinks, plugins, excludes |
_layouts/post.html |
Post template with JSON-LD schema and og: tags |
resources/index.html |
Listing page at /resources/ |
resources/images/ |
Blog images committed to repo — served via GitHub raw URLs |
_posts/ |
Auto-generated files — do not edit manually |
styles.css |
All styles including post prose and resource cards |
Repo → Settings → Secrets and variables → Actions:
| Secret | Value |
|---|---|
NOTION_API_KEY |
Notion integration token (notion.so/my-integrations) |
NOTION_DATABASE_ID |
ce0d53fdc6a2489a8201330e13bd3515 |
If you ever need to rebuild this from scratch:
NOTION_API_KEY and NOTION_DATABASE_ID as repository secretsPost not appearing after sync
Published in NotionSync fails: 401 Unauthorized
Sync fails: 403 on git push
Images broken
resources/images/ in the repo: add file, commit to main, paste the raw.githubusercontent.com URL into NotionFonts broken on post pages
styles.css must be root-relative: url('/fonts/...') not url('fonts/...')Each post automatically gets (via jekyll-seo-tag + manual additions in _layouts/post.html):
<title>, og:title, og:description, og:image, og:urltwitter:card: summary_large_imagearticle:published_time, article:tag, article:sectionarticleBody
— key for AI citation engines (Perplexity, ChatGPT, etc.)TechArticle co-type when Post Type = GuideNo per-post SEO config needed beyond filling in the Notion properties.
The Action runs at minute 0 of every even hour UTC: 0 */2 * * *
Maximum delay from publishing in Notion to going live: ~2 hours. Use the manual trigger for immediate publishing.