Website for DrupalAsia Connect 2027 — the first pan-Asia Drupal event, at IIT Bombay, Powai, Mumbai, 21–23 January 2027.
Production: https://drupalasia.org
| 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.
Requires DDEV.
ddev start && ddev composer installThe 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.gzIf 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 launchLocal site: https://drupal-india-connect.ddev.site
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.
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/ 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.
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.
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 cimgives 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
mainon its own ships nothing.
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.3That 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:statusSee 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.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.
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.