Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.git
_site
.jekyll-cache
.jekyll-metadata
vendor
.bundle
Gemfile.lock
node_modules
assets/lib
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ node_modules
package-lock.json

# IDE configurations
.claude
.idea
.vscode/*
!.vscode/settings.json
Expand Down
17 changes: 17 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
FROM ruby:3.2-slim

RUN apt-get update -qq && apt-get install -y --no-install-recommends \
build-essential \
git \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /srv/jekyll

COPY Gemfile ./
RUN bundle install

COPY . .

EXPOSE 4000

CMD ["bundle", "exec", "jekyll", "serve", "--host", "0.0.0.0", "--port", "4000"]
58 changes: 58 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,61 @@ Personal blog covering platform engineering, Kubernetes, and AI/ML infrastructur
Built with [Jekyll](https://jekyllrb.com) + [Chirpy](https://github.com/cotes2020/jekyll-theme-chirpy), hosted on GitHub Pages.

🌐 [allexistence.github.io](https://allexistence.github.io)

## 1. Local development

Requires [Docker](https://www.docker.com/) — no local Ruby/Jekyll install needed.

```bash
docker compose up
```

Open [http://localhost:4000](http://localhost:4000). Edit any file and refresh the page — Jekyll
auto-rebuilds on save. If you edit `_config.yml`, restart instead of just refreshing:

```bash
docker compose restart
```

Stop the server with `Ctrl+C`, or `docker compose down` if it's running in the background. If you
add a gem to the `Gemfile`, rebuild the image:

```bash
docker compose up --build
```

## 2. How to add a post

Create a new file in [`_posts/`](_posts/), inside a folder named after the post's date, e.g.:

```
_posts/YYYY-MM-DD/YYYY-MM-DD-a-short-slug.md
```

The date must appear in both the folder name (for organization) and the filename itself — Jekyll
only recognizes a post by its filename, not its folder, so the date prefix on the file is required
either way.

Add front matter at the top of the file:

```yaml
---
title: "Post Title"
date: 2026-08-15 09:00:00 +0800
categories: [Category Name]
tags: [tag-one, tag-two, tag-three]
---
```

Then write the post in Markdown below the front matter. A few notes:

- **Categories** are broad sections (shown on the `/categories/` page) — keep each post to one or
two.
- **Tags** are finer-grained keywords (shown on the `/tags/` page) — reuse existing tags where they
fit so the tag cloud stays useful; check `/tags/` for what already exists.
- The homepage shows the 4 most recent posts with a "See more posts" button — no extra config
needed, new posts just appear at the top automatically, newest first.
- Comments and emoji reactions are enabled by default on every post (via giscus) — nothing to turn
on per post.
- To link out to an externally-hosted post instead of writing one here, see any of the existing
Medium-redirect posts in `_posts/` for the pattern (a `<script>` redirect plus a fallback link).
63 changes: 63 additions & 0 deletions STRUCTURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Folder Structure

Quick reference for where things live in this repo. The site is Jekyll + the
[Chirpy](https://github.com/cotes2020/jekyll-theme-chirpy) theme (installed as a gem, not
vendored — its source isn't in this repo).

```
.
├── _posts/ # blog posts, one folder per date
│ └── YYYY-MM-DD/
│ └── YYYY-MM-DD-slug.md
├── _tabs/ # nav pages (Home is built-in, not a tab)
│ ├── about.md
│ ├── categories.md
│ └── tags.md
├── _data/
│ ├── contact.yml # sidebar social icons (GitHub, LinkedIn, RSS)
│ └── share.yml # post-sharing platform links
├── _includes/ # theme overrides — only files that differ from
│ └── footer.html # the gem's defaults live here. footer.html adds the
│ # floating Buy Me a Coffee widget sitewide.
├── _layouts/ # same idea: theme layout overrides
│ └── home.html # replaces the numbered pager with a single
│ # "See more posts" button
├── _plugins/
│ └── posts-lastmod-hook.rb # theme plugin, untouched
├── assets/
│ ├── img/avatar.jpg
│ └── lib/ # theme's static assets (fonts, JS libs) — a git
│ # submodule per .gitmodules, but NOT required:
│ # self-hosting is disabled in _config.yml, so the
│ # site loads these from a CDN instead. Safe to
│ # leave uninitialized.
├── _config.yml # main site config — theme options, nav, comments,
│ # social links, pagination, etc.
├── Dockerfile # local preview image (Ruby + bundler + gems baked in)
├── docker-compose.yml # `docker compose up` → http://localhost:4000
├── .dockerignore
├── Gemfile # Ruby gem dependencies (jekyll-theme-chirpy, etc.)
├── README.md # local dev instructions + how to add a post
└── STRUCTURE.md # this file
```

## What's config vs. content

- **Config** (`_config.yml`, `_data/`) — site-wide settings: title, social links, comments
provider (giscus), pagination, nav order.
- **Content** (`_posts/`, `_tabs/`) — the actual pages. Adding a post is just adding a file to
`_posts/` (see [README.md](README.md) for the exact format).
- **Theme overrides** (`_includes/`, `_layouts/`) — only touch these if you're changing something
the theme doesn't expose via `_config.yml`. Everything else about the theme's look/behavior
comes from the `jekyll-theme-chirpy` gem and isn't in this repo at all.

## Categories & tags

These are **not** configured anywhere — they're derived automatically from the `categories:` and
`tags:` front matter across all posts. A category/tag only appears on `/categories/` or `/tags/`
once at least one published post uses it.

## Not committed (gitignored)

`.bundle`, `vendor`, `Gemfile.lock`, `.jekyll-cache`, `_site`, `.claude` (this harness's local
session state) — all local build artifacts / caches, regenerated automatically.
25 changes: 11 additions & 14 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,13 @@ linkedin:
social:
# Change to your full name.
# It will be displayed as the default author of the posts and the copyright owner in the Footer
name: dummy
email: dummy # change to your email address
name: Rishabh
email: imrishabh27@gmail.com
fediverse_handle: # fill in your fediverse handle. E.g. "@username@domain.com"
links:
# The first element serves as the copyright owner's link
- https://twitter.com/username # change to your Twitter homepage
- https://github.com/allexistence # change to your GitHub homepage
# Uncomment below to add more social links
# - https://www.facebook.com/username
# - https://www.linkedin.com/in/username
- https://www.linkedin.com/in/imrishabh27

# Site Verification Settings
webmaster_verifications:
Expand Down Expand Up @@ -93,25 +90,25 @@ toc: true

comments:
# Global switch for the post-comment system. Keeping it empty means disabled.
provider: # [disqus | utterances | giscus]
provider: giscus # [disqus | utterances | giscus]
# The provider options are as follows:
disqus:
shortname: # fill with the Disqus shortname. › https://help.disqus.com/en/articles/1717111-what-s-a-shortname
shortname: # fill with the Disqus shortname once created, see the note below › https://help.disqus.com/en/articles/1717111-what-s-a-shortname
# utterances settings › https://utteranc.es/
utterances:
repo: # <gh-username>/<repo>
issue_term: # < url | pathname | title | ...>
# Giscus options › https://giscus.app
giscus:
repo: # <gh-username>/<repo>
repo_id:
category:
category_id:
repo: allexistence/allexistence.github.io # <gh-username>/<repo>
repo_id: R_kgDOSqIu-Q
category: Announcements # the Discussions category to use
category_id: DIC_kwDOSqIu-c4DDb7b
mapping: # optional, default to 'pathname'
strict: # optional, default to '0'
input_position: # optional, default to 'bottom'
lang: # optional, default to the value of `site.lang`
reactions_enabled: # optional, default to the value of `1`
reactions_enabled: 1 # shows emoji reactions on every post

# Self-hosted static assets, optional › https://github.com/cotes2020/chirpy-static-assets
assets:
Expand All @@ -131,7 +128,7 @@ pwa:
deny_paths:
# - "/example" # URLs match `<SITE_URL>/example/*` will not be cached by the PWA

paginate: 10
paginate: 4

# The base URL of your site
baseurl: ""
Expand Down
36 changes: 4 additions & 32 deletions _data/contact.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,10 @@
- type: github
icon: "fab fa-github"

- type: twitter
icon: "fa-brands fa-x-twitter"

- type: email
icon: "fas fa-envelope"
noblank: true # open link in current tab
- type: linkedin
icon: "fab fa-linkedin"
url: "https://www.linkedin.com/in/imrishabh27" # rel="me" will be applied for verification

- type: rss
icon: "fas fa-rss"
noblank: true
# Uncomment and complete the url below to enable more contact options
#
# - type: mastodon
# icon: 'fab fa-mastodon' # icons powered by <https://fontawesome.com/>
# url: '' # Fill with your Mastodon account page, rel="me" will be applied for verification
#
# - type: linkedin
# icon: 'fab fa-linkedin' # icons powered by <https://fontawesome.com/>
# url: '' # Fill with your Linkedin homepage
#
# - type: stack-overflow
# icon: 'fab fa-stack-overflow'
# url: '' # Fill with your stackoverflow homepage
#
# - type: bluesky
# icon: 'fa-brands fa-bluesky'
# url: '' # Fill with your Bluesky profile link
#
# - type: reddit
# icon: 'fa-brands fa-reddit'
# url: '' # Fill with your Reddit profile link
#
# - type: threads
# icon: 'fa-brands fa-threads'
# url: '' # Fill with your Threads profile link
noblank: true # open link in current tab
63 changes: 63 additions & 0 deletions _includes/footer.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<!-- The Footer -->

<footer
aria-label="Site Info"
class="
d-flex flex-column justify-content-center text-muted
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
"
>
<p>
{{- '©' }}
<time>{{ 'now' | date: '%Y' }}</time>

{% if site.social.links %}
<a href="{{ site.social.links[0] }}">{{ site.social.name }}</a>.
{% else %}
<em class="fst-normal">{{ site.social.name }}</em>.
{% endif %}

{% if site.data.locales[include.lang].copyright.brief %}
<span
data-bs-toggle="tooltip"
data-bs-placement="top"
title="{{ site.data.locales[include.lang].copyright.verbose }}"
>
{{- site.data.locales[include.lang].copyright.brief -}}
</span>
{% endif %}
</p>

<p>
{%- capture _platform -%}
<a href="https://jekyllrb.com" target="_blank" rel="noopener">Jekyll</a>
{%- endcapture -%}

{%- capture _theme -%}
<a
data-bs-toggle="tooltip"
data-bs-placement="top"
title="v{{ theme.version }}"
href="https://github.com/cotes2020/jekyll-theme-chirpy"
target="_blank"
rel="noopener"
>Chirpy</a>
{%- endcapture -%}

{{ site.data.locales[include.lang].meta | replace: ':PLATFORM', _platform | replace: ':THEME', _theme }}
</p>
</footer>

<!-- Buy Me a Coffee floating widget (sitewide) -->
<script
data-name="BMC-Widget"
data-cfasync="false"
src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js"
data-id="allexistence"
data-description="Support me on Buy me a coffee!"
data-message=""
data-color="#FFDD00"
data-position="Right"
data-x_margin="18"
data-y_margin="18"
></script>
Loading
Loading