{"id":49669203,"url":"https://github.com/frozen4917/crystal-chalk","last_synced_at":"2026-05-24T10:00:41.954Z","repository":{"id":355581714,"uuid":"1225736765","full_name":"frozen4917/crystal-chalk","owner":"frozen4917","description":"Lightweight self-hostable markdown blog server in Ruby. Drop .md files in a folder, configure a .yml, and your blog is live","archived":false,"fork":false,"pushed_at":"2026-05-04T09:26:06.000Z","size":113,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-06T19:50:41.097Z","etag":null,"topics":["blog","markdown","ruby","self-hosted","sinatra"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/frozen4917.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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-04-30T15:28:26.000Z","updated_at":"2026-05-04T09:24:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/frozen4917/crystal-chalk","commit_stats":null,"previous_names":["frozen4917/crystal-chalk"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/frozen4917/crystal-chalk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frozen4917%2Fcrystal-chalk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frozen4917%2Fcrystal-chalk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frozen4917%2Fcrystal-chalk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frozen4917%2Fcrystal-chalk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frozen4917","download_url":"https://codeload.github.com/frozen4917/crystal-chalk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frozen4917%2Fcrystal-chalk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33429192,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"online","status_checked_at":"2026-05-24T02:00:06.296Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["blog","markdown","ruby","self-hosted","sinatra"],"created_at":"2026-05-06T19:43:25.491Z","updated_at":"2026-05-24T10:00:41.927Z","avatar_url":"https://github.com/frozen4917.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Crystal Chalk\n\nA lightweight, self-hostable markdown blog server written in Ruby. Drop `.md` files into a folder, configure a YAML file, and your blog is live. No database, no build step, no accounts.\n\n---\n\n## Features\n\n- Drop a `.md` file in your pages folder, and it is immediately live\n- Frontmatter support: title, date, description, cover image, draft mode\n- Syntax-highlighted code blocks with configurable Rouge themes\n- Theming via `settings.yml`: colours, gradient, favicon\n- File watcher to reflect changes to edited posts instantly without a server restart\n- Mobile responsive\n- Minimal, readable default design\n\n---\n\n## Requirements\n\n- Ruby 4.0+\n- Bundler\n\n---\n\n## Quick Start\n\n1. **Clone the repo**\n    ```bash\n    git clone https://github.com/frozen4917/crystal-chalk.git\n    cd crystal-chalk\n    ```\n\n2. **Install the required gems**\n    ```bash\n    bundle install\n    ```\n\n3. **Run the server**\n    ```bash\n    rake\n    ```\n\nThen open `http://localhost:4567` (or the port you configured) in your browser.\n\n\u003e [!TIP]\n\u003e The server starts in development mode by default. Use `rake prod` for production.\n\n---\n\n## Writing Posts\n\nNo long, boring explanation of how to write Markdown or format your images here. The best way to learn how Crystal Chalk handles content is to see it in action. Add a `.md` file to the `pages/` directory and get started! Just save the file and refresh the page. Changes are reflected instantly without a server restart.\n\n\u003e [!TIP]\n\u003e Run the development server and check out the included example files! We have provided [`pages/welcome.md`](pages/welcome.md), [`pages/markdown-showcase.md`](pages/markdown-showcase.md), and [`pages/draft-example.md`](pages/draft-example.md). These files demonstrate everything you need to know about formatting, code blocks, and site features.\n\n---\n\n## Configuration\n\nEverything lives in [`config/settings.yml`](config/settings.yml):\n\n### General Settings\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `site_title` | Displayed in the header and browser tab | `\"My Blog\"` |\n| `site_description` | Used in OG meta tags for the index page | `\"\"` |\n| `site_url` | Full URL of your blog, used for host authorisation in production or OG tags. E.g. \"https://blog.site.com/\" | `\"\"` |\n| `extra_hosts` | Additional allowed hostnames, e.g. www variants | `[]` |\n| `og_image` | Fallback OG image for the index page | `\"\"` |\n| `port` | Port the server listens on | `4567` |\n| `pages_dir` | Directory where `.md` files are read from | `\"pages\"` |\n| `code_theme` | Rouge syntax highlight theme for code blocks | `\"github.dark\"` |\n\n### Theme Settings\nVisual settings must be nested under the `theme:` key in your `settings.yml`.\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `background_color` | Page background | `\"0a0a0a\"` |\n| `text_color` | Main text colour | `\"e8e8f0\"` |\n| `accent_color` | Links, hover states, borders | `\"36339e\"` |\n| `gradient_color` | Top gradient glow colour | `\"727fcd\"` |\n| `enable_gradient` | Toggle the top gradient on or off | `true` |\n| `favicon` | Path to favicon, e.g. `/images/favicon.png` | `\"favicon.ico\"` |\n\nTo see all available code themes:\n```bash\nrougify help style\n```\n\nChanges to `settings.yml` take effect on server restart.\n\n---\n\n## Rake Tasks\n\n```bash\nrake                # Start in development mode\nrake dev            # Same as rake\nrake prod           # Start in production mode\nrake routes         # Print all registered routes\nrake clean          # Delete generated rouge.css\n```\n\n---\n\n## Deployment\n\nSee [ADVANCED.md](ADVANCED.md) for full deployment instructions, including Caddy, Nginx, systemd, and subdomain setup.\n\n\u003e [!WARNING]\n\u003e In production, set `site_url` in `settings.yml` to your blog's full URL. Crystal Chalk uses this to enforce host authorisation, block unauthorised requests, and for OG tags.\n\n---\n\n## Why Ruby?\n\nCrystal Chalk was built with Ruby and Sinatra deliberately, partly to learn Ruby beyond the usual JavaScript and Python stack, and partly because Sinatra maps very cleanly to this kind of lightweight server. The codebase is readable enough that you do not need to know Ruby to follow it.\n\nIf you are more familiar with Node or Python, the concepts translate directly. The architecture is straightforward: a config loader, a markdown renderer, a post cache, and a few routes.\n\n---\n\n## Licence\n\n[MIT](LICENSE) - Frozen, 2026","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrozen4917%2Fcrystal-chalk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrozen4917%2Fcrystal-chalk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrozen4917%2Fcrystal-chalk/lists"}