Personal blog and portfolio website of Jessica Temporal β Sr. Dev Advocate, podcaster, and creator. Built with Jekyll and the Ethereal Ink theme, hosted on Netlify.
π Live site: jtemporal.com
This site features:
- Technical blog posts about Python, data science, Git, and open source
- Books, talks, videos, series, and social links
- Hacktoberfest project collections (2019β2025)
- Multi-language support (Portuguese and English, with French infrastructure)
- Static site generator: Jekyll 4.3
- Styling: Tailwind CSS (Ethereal Ink design system) with Typography plugin
- Syntax highlighting: Rouge (with line numbers)
- Hosting: Netlify (deploys from
main; PR deploy previews) - Domain: jtemporal.com
- Analytics: Google Analytics & PostHog
- Responsive layout with light/dark mode
- Multi-language content (PT/EN) with scalable architecture
- Reading time estimation
- Post tag banners, series pages, and listing pages for talks, videos, and books
- Blog post pagination
- Language switcher
- Per-post OG social cards (
images/og/<slug>.png) - Lil Jess, a friendly sidekick always visible in the corner (dismiss with β; type
jessor 5 footer taps to bring her back)
See MULTI_LANGUAGE_SYSTEM.md for architecture, translation management, adding languages, and troubleshooting.
See LIL_JESS.md for always-on visibility, dismiss/re-summon, reactions, and how to tweak her moods and lines.
See AGENTS.md for hidden YouTube short transcript posts, git worktree conventions, and OG card generation.
- Ruby 3.4.1 (see
.ruby-version) - Bundler
- Node.js & npm (for Tailwind CSS builds and OG card generation)
- Git
-
Clone the repository
git clone https://github.com/jtemporal/jtemporal.github.io.git cd jtemporal.github.io -
Install dependencies
bundle install npm install
-
Run the development server
Recommended β builds CSS and starts Jekyll with the dev config:
npm run dev
Or run the steps separately:
npm run build:css bundle exec jekyll serve --config _dev_config.ymlCSS auto-rebuilds via
_plugins/build_css.rbwhile Jekyll is running. -
Open the site
| Command | Description |
|---|---|
npm run dev |
Build CSS and serve with _dev_config.yml |
npm run build:css |
Compile Tailwind β assets/css/main.css |
npm run watch:css |
Watch and rebuild CSS |
npm run og:generate -- _posts/<file>.md |
Generate OG card for one post |
npm run og:generate:all |
Generate OG cards for all posts |
bundle exec jekyll build |
Production build |
bundle exec jekyll serve --future |
Include future-dated posts |
bundle exec jekyll clean |
Remove _site and cache |
βββ _posts/ # Blog posts
βββ _books/ # Book collection (en/, pt/)
βββ _drafts/ # Draft posts
βββ _hacktoberfest_projects_*/ # Hacktoberfest listings by year
βββ _includes/ # Reusable templates
βββ _layouts/ # Page layouts
βββ _plugins/ # Jekyll plugins (CSS, OG images, Rouge, series)
βββ _data/ # YAML data (socials, localization, etc.)
βββ src/styles/ # Tailwind source (tailwind.css, theme.css, syntax.css)
βββ assets/css/ # Compiled CSS
βββ images/ # Image assets
βββ images/og/ # Per-post OG social cards
βββ og-templates/ # HTML template for OG card generation
βββ scripts/ # OG generation, image optimization helpers
βββ slides/ # Presentation slides
Design mockups from Stitch live in stitch_bilingual_blog_post_page_v1/ locally for reference β that folder is gitignored and not part of the repository.
Create new posts in _posts/ using:
YYYY-MM-DD-post-title.md
---
layout: post
title: "Your post title"
date: 2025-08-30
image: /images/covers/tutorial.webp
tags: [tag1, tag2]
lang: en # or pt
translations:
- lang: pt
url: "/caminho-para-traducao-em-portugues"
---
Your post content here...For translation details, see MULTI_LANGUAGE_SYSTEM.md.
Every new post (blog post, type: video, or type: talk) needs its own OG card. Do not reuse a generic cover as the social preview.
# Single post
npm run og:generate -- _posts/YYYY-MM-DD-<slug>.md
# Bilingual pair
npm run og:generate -- _posts/YYYY-MM-DD-<slug-en>.md _posts/YYYY-MM-DD-<slug-pt>.mdThis writes images/og/<slug>.png. Commit the PNG with the post. The _plugins/og_image.rb plugin uses that file as the social/featured image when present.
Theme cues come from front matter (type, tags, image). See AGENTS.md for full details.
- Keep originals under
/images/ - Optimize with
python scripts/image_optmizer.py(converts to WebP) - Prefer WebP paths in content
Book content lives in _books/en/ and _books/pt/.
Organized by year in _hacktoberfest_projects_YYYY/.
- Production config:
_config.yml - Development config:
_dev_config.yml(local URLs, dev-only excludes) - Netlify:
netlify.toml(build, deploy previews, caching headers) - Styling:
src/styles/tailwind.css,tailwind.config.js,src/styles/theme.css
- Fork jtemporal/jtemporal.github.io
- Create a feature branch (
git checkout -b feature/my-change) - Commit your changes
- Push and open a pull request
See LICENCE.md.
- Website: jtemporal.com
- Contact form: English Β· PortuguΓͺs
- Twitter: @jesstemporal
- GitHub: @jtemporal
Made with β€οΈ by Jessica Temporal