The official website for PyData Indore, a local chapter of the global PyData network.
π Live Site: https://indore.pydata.org
PyData Indore is part of the global PyData network, an educational program of NumFOCUS, a 501(c)(3) nonprofit organization. We bring together data enthusiasts, practitioners, and researchers in Central India to share ideas and learn from each other. Our community focuses on Python, data science, machine learning, and open-source technologies.
This site is built with Jekyll β the same static-site generator GitHub Pages runs. Pages are Liquid templates with YAML front matter, and the nav, footer, and <head> come from shared layouts and includes.
β οΈ You need to run Jekyll β a plain static file server will not work. Opening the.htmlfiles directly, or serving them withpython -m http.server/npx serve/ VS Code Live Server, shows raw front matter and no navigation or footer, because nothing has processed the templates.
- Ruby 3.x with development headers β installation guide (on Windows, use RubyInstaller with Devkit)
- Bundler:
gem install bundler
Check what you have:
ruby -v # should be 3.x
bundle -v# 1. Clone your fork
git clone https://github.com/pydataindore/pydataindore.github.io.git
cd pydataindore.github.io
# 2. Install dependencies β first time, and after any Gemfile change
bundle install
# 3. Start the dev server
bundle exec jekyll serveOpen http://localhost:4000.
Edits to .html, .css, and .js files rebuild automatically β just refresh. The dev server sends no-cache headers (configured in _config.yml), so you should not need a hard refresh.
Useful flags:
| Command | What it does |
|---|---|
bundle exec jekyll serve --livereload |
Auto-refreshes the browser on save |
bundle exec jekyll serve --port 4001 |
Use a different port |
bundle exec jekyll serve --no-watch |
Serve without rebuilding on change |
bundle exec jekyll build |
Build once into _site/ without serving |
_config.yml is the exception β Jekyll does not watch it. Restart the server after editing it.
Local runs use the development environment, so Google Analytics never loads and no hits are sent. To build exactly what GitHub Pages will publish:
# macOS / Linux
JEKYLL_ENV=production bundle exec jekyll build
# Windows PowerShell
$env:JEKYLL_ENV="production"; bundle exec jekyll buildThe site renders unstyled β white background, giant logo, no layout.
Your _site/ output is stale or corrupt. This happens most often when jekyll build is run while jekyll serve is already watching, since both write to _site/ at once. Stop every Jekyll process, then:
rm -rf _site .jekyll-cache
bundle exec jekyll buildBecause _site/ is generated and gitignored, deleting it is always safe.
bundle install fails to build native extensions. Your Ruby install is missing development headers β on Windows, reinstall Ruby using RubyInstaller with Devkit.
cannot load such file -- webrick. Run bundle install; webrick is in the Gemfile for exactly this reason on Ruby 3.x.
Deployment is automatic β there is no build step to run and no GitHub Actions workflow.
- Merge to
mainonpydataindore/pydataindore.github.io - GitHub Pages rebuilds the site with the
github-pagesgem (Settings β Pages β Deploy from a branch βmain/ root) - The change is live at https://indore.pydata.org, usually within a couple of minutes
Things to know:
- The custom domain comes from the
CNAMEfile at the repo root. Deleting or editing it breaksindore.pydata.orgβ leave it alone. - Only plugins on the GitHub Pages allowlist will run. The
Gemfilepins thegithub-pagesgem so your local build matches production; add only allowlisted plugins (the site enablesjekyll-sitemapin_config.yml), never arbitrary ones. - Never commit
_site/. It is build output and is gitignored. - If a deploy looks wrong, check the repo's Actions tab β the
pages-build-deploymentrun reports Jekyll build failures there.
The <head> in _layouts/default.html builds SEO and social tags for every page from its front matter, so individual pages rarely need to touch them.
- Sitemap β generated automatically by the
jekyll-sitemapplugin at build time (/sitemap.xml). Nothing to maintain; any page with front matter is included. Addsitemap: falseto a page's front matter to exclude it. robots.txtβ at the repo root, allows all crawlers and points them at the sitemap.- Canonical + Open Graph + Twitter tags β emitted per page from
title,description, andimage.og:urland the canonical link use the page's pretty URL. - Structured data β
_includes/structured-data.htmladds sitewideOrganization+WebSiteJSON-LD. Event detail pages are good candidates for adding their ownEventschema on top. - Social preview image β defaults to the PyData Indore logo card. Override per page with
image:in front matter, and use a raster (JPG/PNG) β SVG is ignored by Facebook, LinkedIn, WhatsApp, and X.
The logo lives at Assets/images/Logos/PyData_Indore/:
| File | Used for |
|---|---|
PyData-Indore.svg |
Nav logo, share-page avatar, and the modern SVG favicon |
PyData-Indore-og.png (1200Γ630) |
Default social-share preview (_config.yml) |
PyData-Indore-icon-512.png |
PNG favicon fallback + schema.org logo |
PyData-Indore-icon-180.png |
apple-touch-icon |
The three PNGs are rasterized from the SVG. To regenerate them after a logo change, render the SVG with a headless browser (e.g. Playwright/Chromium) and recompose onto the target canvases with Pillow β no cairosvg or ImageMagick required.
pydataindore.github.io/
βββ _config.yml # Site-wide settings, defaults, plugins, build config
βββ Gemfile # Pins the github-pages gem (matches production)
βββ CNAME # Custom domain β do not remove
βββ robots.txt # Allows crawlers, points to the sitemap
β
βββ _layouts/
β βββ default.html # The page shell: <head>, meta/OG tags, canonical, favicons, scripts
βββ _includes/
β βββ nav.html # Navigation (edit links here, once)
β βββ footer.html # Footer
β βββ structured-data.html # JSON-LD (Organization + WebSite) for SEO
β βββ announcement.html # Site-wide moving announcement ticker (currently off β see _layouts/default.html)
β βββ cookie-consent.html # Consent banner (gates analytics)
β βββ analytics.html # GA4 β production builds only
β
βββ index.html # Homepage
βββ about.html # About PyData and our chapter
βββ events.html # Upcoming and past events
βββ team.html # Team & organizers
βββ sponsors.html # Sponsors and partners
βββ contact.html # Contact form and FAQs
βββ volunteer.html # Volunteer & co-organizer framework
βββ code-of-conduct.html # Community guidelines
βββ privacy-policy.html # Privacy policy
βββ share.html # Link-hub page for socials / QR
β
β # Event detail pages β one per event
βββ meet-1.html # Meet #1 (23 May 2026)
βββ hack-days.html # PyData Indore Hack Days (18 Jul 2026)
βββ ikigai-2026.html # IKIGAI 2026 β community partnership
β
βββ Assets/
β βββ CSS/
β β βββ style.css # Main stylesheet β shared by every page
β β βββ hack-days.css # Page-specific (loaded via `extra_css`)
β β βββ ikigai-2026.css # Page-specific (loaded via `extra_css`)
β βββ JavaScript/
β β βββ main.js # Nav, theme switcher, carousels, forms
β βββ images/
β βββ Logos/
β β βββ PyData_Indore/ # Brand logo: PyData-Indore.svg + og/icon rasters
β β βββ ... # Partner & sponsor logos
β βββ Team/ # Team photos
β βββ Meetup1/ HackDays/ IKIGAI/ # Per-event assets
β βββ ...
β
βββ _site/ # Build output (incl. generated sitemap.xml) β gitignored
βββ README.md # This file
- Modern Dark Theme: Electric Lime (#a3e635) with Hot Magenta (#e879f9) accents on near-black (#080808)
- Typography: Google Fonts (Space Mono, Syne) for modern, readable text
- Visual Effects: Grain overlay texture and floating shape animations
- Responsive Design: Mobile-first approach, works seamlessly on all devices
- Smooth Animations: Scroll-triggered effects, hover transitions, and interactive elements
- Accessible: Following WCAG guidelines with proper ARIA labels
- Fast Loading: No heavy frameworks, pure HTML/CSS/JavaScript
- Modern UI: Card-based layouts, gradient backgrounds, and glassmorphism effects
- Jekyll + Liquid: Static site generation β shared layouts, includes, and pretty URLs
- HTML5: Semantic markup
- CSS3: Custom properties, Grid, Flexbox, animations
- JavaScript (ES6+): Vanilla JS for interactivity β no frameworks, no bundler
- Google Fonts: Space Mono and Syne font families
- GitHub Pages: Hosting and automatic builds, on the custom domain
indore.pydata.org
- Events: Edit
events.htmlfor the listing. Events with their own page (hack-days.html,ikigai-2026.html, β¦) also get a preview card onindex.html - Sponsors: Update
sponsors.htmlwith sponsor information - Team Members: Update
team.html - Contact info & social links: Edit
_includes/footer.htmlβ it is shared by every page - Navigation: Edit
_includes/nav.html - Images: Add to
Assets/images/(per-event subfolder where it makes sense) and reference with a root-relative path, e.g./Assets/images/IKIGAI/poster.jpeg
The CSS uses custom properties (CSS variables) for easy theming:
:root {
--color-primary: #a3e635; /* Electric Lime */
--color-primary-dark: #84cc16; /* Darker Lime */
--color-primary-light: #d9f99d; /* Lighter Lime */
--color-accent: #e879f9; /* Hot Magenta */
--color-accent-light: #f0abfc; /* Light Magenta */
--color-accent-dark: #d946ef; /* Dark Magenta */
--color-dark: #080808; /* Near-black background */
--color-dark-soft: #0f0f0f; /* Soft dark surface */
}The site also ships alternate themes (cyberpunk, coral, amber) as [data-theme="β¦"] overrides on :root, toggled by the floating switcher that main.js injects. Always style with these variables rather than hardcoded hex values β anything hardcoded will ignore the user's chosen theme.
You can customize the theme by modifying these variables in Assets/CSS/style.css.
Create an .html file at the repo root containing only your page content β no <html>, <head>, <nav>, or <footer>. Those come from _layouts/default.html. Start it with YAML front matter:
---
permalink: "/your-page/" # the URL β trailing slash, no .html
title: "Your Page | PyData Indore" # <title> + OG/Twitter title
description: "One or two sentences." # meta description + social preview
active: "events" # which nav item to highlight
extra_css: "/Assets/CSS/your-page.css" # optional, page-specific styles
image: "/Assets/images/your-og-image.jpg" # optional, social preview image
---Front matter reference:
| Key | Required | Notes |
|---|---|---|
permalink |
yes | Pretty URL, e.g. /hack-days/. Always link to pages this way β never page.html. |
title |
yes | Shown in the browser tab and social previews. |
description |
yes | Used for SEO and link previews. |
active |
yes | One of home, about, events, team, coc, sponsors. Event pages use events. |
extra_css |
no | Only for genuinely page-specific styling; shared styles belong in style.css. |
image |
no | Social-preview image. Must be a raster (JPG/PNG) β social platforms ignore SVG. Defaults to the PyData Indore logo card (PyData-Indore-og.png, set in _config.yml). |
The layout is applied automatically by the defaults in _config.yml β you do not need to declare it.
To add the page to the main navigation, edit _includes/nav.html β once. It is shared by every page, so there is no longer any need to update links file by file.
- All events should follow the NumFOCUS Code of Conduct
- Use inclusive language
- Keep content professional and educational
- Credit speakers and contributors appropriately
We welcome contributions! Here's how to help:
- Fork the repository
- Add the upstream remote (only needed once):
git remote add upstream https://github.com/pydataindore/pydataindore.github.io.git
- Create a feature branch from the latest upstream:
git fetch upstream git checkout -b feature/your-feature upstream/main
- Make your changes, then check them locally before committing:
Look at the page you changed at both desktop and mobile widths, and click through any links you added. See Quick Start if this is your first run.
bundle exec jekyll serve # then open http://localhost:4000
- Commit:
git commit -m 'PYD-XX Description of change' - Push to your fork and open a Pull Request:
git push origin feature/your-feature
Important β Squash & Merge: This repo uses Squash and Merge for all PRs. After your PR is merged, your local commits will have different hashes from upstream. Clean up your fork with:
git fetch upstream git reset --hard upstream/main git push --force-with-lease origin main
β οΈ Do not use GitHub's "Sync fork" button β it creates merge commits that permanently pollute your history.
- π¨ Design improvements and UI/UX enhancements
- π± Mobile experience optimizations
- βΏ Accessibility improvements (WCAG compliance)
- π Content translation (Hindi and other languages)
- πΈ Event photos and graphics
- π§ͺ Testing and bug fixes
- π Documentation improvements
- π Performance optimizations
Thanks to everyone who has contributed to this project!
![]() Sumit S Chawla Organizer & Lead Dev |
![]() Jagdish Prajapati Contributor |
Want to see your avatar here? Contribute to the project!
- Email: indore@pydata.org
- LinkedIn: PyData Indore
- Instagram: @pydata.indore
- GitHub: @pydataindore
- Meetup: PyData Indore
- Code of Conduct Issues: admin@pydata.org
This project is licensed under the MIT License. See the LICENSE file for details (if available).
- Navigation and footer live in
_includes/β editnav.htmlorfooter.htmlonce, not every page - Link with pretty URLs:
/events/, not/events.html. Use root-relative paths (/Assets/...) so links work from nested URLs - Styling is centralized in
Assets/CSS/style.css. Reach for a page-specific file viaextra_cssonly when the styles genuinely belong to one page - Theming uses CSS custom properties with
[data-theme="β¦"]overrides, so usevar(--color-primary)and friends rather than hardcoding hex values β otherwise the theme switcher won't affect your work - JavaScript is centralized in
Assets/JavaScript/main.jsβ vanilla, no build step - Optimize images before committing. Resize to roughly 2Γ their displayed width and export as JPEG/WebP; multi-MB files slow the site down noticeably
- Analytics only run in production and only after consent, so local development never sends hits
- Hacktoberfest popup clicks:
hacktoberfest_register_clickcounts clicks to MLH andhacktoberfest_details_clickcounts clicks to the event page. Both includeevent_id: hacktoberfest_2026,placement: home_popup, andlink_url. These measure clicks, not completed registrations. New visitors see the cookie banner first, then the popup after either Accept or Decline; only accepted analytics consent enables click tracking. Visitors with an existing cookie choice can see the popup immediately. The popup appears only once per browser, with its seen flag saved when shown (not while waiting for consent). Clearingpydata-hacktoberfest-2026-promo-seenin browser local storage lets you preview the popup again before its expiry. Events use the existing production GA4 property; local builds do not send them. - Never commit
_site/β it is generated output
- PyData Global for the global network and support
- NumFOCUS for fiscal sponsorship
- All our volunteers and community members
- Our sponsors who make events possible
Made with β€οΈ by the PyData Indore community

