Skip to content

About

Drupal India Connect 2027 — event site (CFP, session review, schedule) built on Drupal 11 + Summit recipe

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

DrupalAsia Connect

Website for DrupalAsia Connect 2027 — the first pan-Asia Drupal event, at IIT Bombay, Powai, Mumbai, 21–23 January 2027.

Production: https://drupalasia.org

Stack

Drupal 11.3 (PHP 8.4, MariaDB 11.8)
Base theme event_horizon 2.x
Site theme web/themes/custom/drupal_india_connect
Page building Drupal Canvas 1.5
Event data event_platform_helper (event term, dates, location)
Also webform, smart_date, klaro (cookie consent)

There are no custom modules. All custom code is the sub-theme.

Local development

Requires DDEV.

ddev start && ddev composer install

The site needs a database — it is not built from config alone (see Content lives in the database). Import a dump from production or from a teammate:

ddev import-db --file=path/to/dump.sql.gz

If you use Claude Code, pulling a fresh copy from production is scripted as the db-sync-from-live skill — it backs up your local DB first, dumps the remote one over SSH into a throwaway temp location, cleans that up after downloading, imports locally, and checks for config drift. See .claude/skills/db-sync-from-live/SKILL.md. Connection details are supplied per-machine in a gitignored .claude/db-sync.local.env, never committed.

Then:

ddev drush cr && ddev launch

Local site: https://drupal-india-connect.ddev.site

settings.local.php

web/sites/default/settings.local.php is gitignored and holds local-only overrides. It is not required, but CSS/JS aggregation is worth turning off while doing front-end work — aggregated asset URLs carry long query strings that some content blockers drop, which makes stylesheet changes look like they are not applying:

$config['system.performance']['css']['preprocess'] = FALSE;
$config['system.performance']['js']['preprocess'] = FALSE;

On the production server the same file holds the database credentials, hash_salt and trusted_host_patterns. Do not commit it.

Layout

config/sync/                     exported configuration
design-system/                   brand system — tokens, guidelines, prototype
recipes/summit/                  site install recipe
web/themes/custom/
  drupal_india_connect/
    components/                  SDC components (see below)
    css/base.css                 design tokens, colour ramps
    css/global.css               overrides on top of event_horizon
    images/                      design assets that deploy with the code
    js/section-anchors.js        homepage anchor ids + scroll offset
    drupal_india_connect.theme   announcement bar, copyright, trademark

Design system

design-system/ holds the brand system: the colour, type and spacing tokens, guideline cards, component patterns, fonts and icons. Start with design-system/readme.md.

The guidelines are standalone HTML — open any of design-system/guidelines/*.card.html in a browser, no build step. The approved homepage prototype the build was matched against is at design-system/reference/DrupalAsia Connect Home.dc.html.

The one rule worth knowing before you touch colour: primary and secondary are derived, not written. Each ramp is a hue/saturation/lightness triple, and the steps are computed from it with calc(). Never hand-write a step, and never paste a hex into a component.

If you use Claude Code, the same system is wired up as a skill (/drupalasia-connect-design) — see .claude/skills/drupalasia-connect-design/SKILL.md.

Where the system and the built theme disagree, the theme wins; the build has deliberately diverged in a few places, listed at the end of design-system/readme.md.

Components

Standard SDC: a .component.yml schema beside a .twig template, with any .css/.js of the same name picked up automatically.

Components written for this site: hero, eyebrow, fact, media-placeholder, announcement-bar. The rest came with the theme bundle. Anything the base theme already provides should be used as-is — section, group, heading, text, button, badge and accordion all come from event_horizon.

Content lives in the database

The homepage is a Canvas page (canvas_page entity 1, "Home", 114 components). Its content is not in config/sync and is not in git.

That means:

  • A fresh checkout plus drush cim gives you a working site with an empty homepage. You need a database.
  • Copy changes, menu links, taxonomy terms and node content all move between environments by database sync, not by deploy.
  • Only theme files and configuration are deployed, and only by tagging a release (see below) — merging to main on its own ships nothing.

Deployment

Deploys are cut from a tag, never from a branch. Pushing to main does not ship anything by itself:

git tag 1.2.3        # semver, no `v` prefix — see .github/workflows/deploy.yml
git push origin 1.2.3

That push triggers .github/workflows/deploy.yml, which SSHes to the server and checks out that tag in detached HEAD (so a deploy can move backwards, not just forwards — the same workflow, run manually with an existing tag as input, is also how you roll back), then runs composer install --no-dev, a pre-deploy DB backup, drush updb, drush cim, drush cr.

Because the deploy runs drush cim, anything you changed through the admin UI must be exported to config/sync or the deploy will revert it. Check before tagging:

ddev drush config:status

See CLAUDE.md for how to export safely — a bare drush cex in this project has staged unrelated files and resurrected deleted configuration that broke production deploys.

main has GitHub branch protection: force-push and branch deletion are blocked at the remote. That protects history on the branch itself; it has no bearing on when a deploy happens, since only a tag push does that.

Changelog

CHANGELOG.md is a plain-language, day-by-day record of what changed on the site, written for the organising team. Claude writes it every night at 23:00 IST (.github/workflows/changelog.yml) from that day's commits on main, merged PRs, closed issues and the public sitemap, and the bot commits it straight to main. Days with no activity are skipped.

To write up a missed day, or redo one: Actions → Daily changelog → Run workflow, with the date. Re-running a date replaces that day's entry.

Before going live

Still outstanding:

  • Code of conduct and Privacy policy pages. The footer links to both are disabled because the pages do not exist; the privacy node (/privacy-policy) is an unedited Drupal stub.
  • News — the section and its nav links were removed because there are no published articles.
  • Sponsors — none yet. The band is an invitation to sponsor; the sponsor view stays in place for when there are real ones.
  • Mobile — the four-up "Why attend" grid does not collapse on phones.

About

Drupal India Connect 2027 — event site (CFP, session review, schedule) built on Drupal 11 + Summit recipe

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages