Skip to main content
Glama
india-compliance-calendar
by dgomesbr
README.md
# India Compliance Calendar

A single pane of glass for Indian statutory deadlines, built for an in-house
compliance team: what is due, what is at risk, and what each filing costs if it
is late. Every date cites the act, rule, notification or circular it comes from.

**Live site:** https://dgomesbr.github.io/india-compliance-calendar/

It is our own take on the [corplawupdates.in calendar](https://www.corplawupdates.in/calendar):
the same idea, rebuilt from primary government sources as structured, recurring
rules, with no content copied from any commercial site.

## What it does

- **Risk first.** The overview opens on the chosen horizon with overdue and
  due-this-week items at the top, the counts by state set large on the cover
  (each one filters the table), and the costliest-if-late list beside the table.
- **Any horizon.** 1 week, 2 weeks, 1 month, 1 quarter, to year end, to FY end,
  or a custom range from up to 15 months back to up to 24 months ahead. Items
  that fell due before the team began tracking show as "before tracking", and
  the tracking date can be moved back to review last year's filings.
- **Your financial year.** Indian law sets April to March, but a company that
  must follow another year to consolidate with a group abroad (as its holding
  company, subsidiary or associate) can have it approved by the Tribunal (section
  2(41), Companies Act), and an LLP by the Central Government (section 2(1)(l),
  LLP Act). Set the year's start and end in the
  profile and everything that counts from it moves: the AGM and the filings that
  run from it, cost audit, LLP returns, SEBI results and annual filings, the FEMA
  activity certificate, the "FY end" horizon and the report's quarters and years.
  Income tax, TDS and GST stay April to March, as the law requires.
- **Chains.** When one deadline runs from another, the calendar knows. AOC-4,
  MGT-7, ADT-1 and MGT-15 run from the AGM; CSR-2 from AOC-4; the SEBI annual
  report and BRSR from the AGM date; Form 16A and 27D from their TDS and TCS
  statements; the tax audit and transfer-pricing reports one month before their
  return; the GST credit cut-off moves up to the day GSTR-9 is filed. Mark the
  AGM held on its real date and its whole chain moves with it. Every entry shows
  where its date comes from and what runs from it, in the table, the detail
  panel, the entry pages, the exports and the calendar feeds.
- **Order by fine.** Sort by due date, by penalty exposure (the fixed cost of a
  30-day delay: late fees and flat penalties, with interest shown separately),
  or by law.
- **The timeline.** One lane per law across the horizon; each due date is a
  mark sized by its penalty exposure and coloured by its state, so it is clear
  which law is heavy when. Select a mark to filter the table. Keyboard and
  screen-reader accessible.
- **Cost of a delay.** For filings whose late fee grows by the day, the detail
  panel and each entry page chart the fixed cost against days late, with a
  slider, a hover readout and the same values as a table.
- **Our obligations only.** An entity profile (type, GST mode, TDS, employees,
  audit, transfer pricing, foreign investment, import/export, states) filters
  everything, including state professional tax and labour welfare fund.
- **Mark filed, with owner and acknowledgement.** Stored in the browser; teams
  share records by exporting and importing JSON.
- **Event planner.** Enter an AGM, allotment, director change, charge or foreign
  investment date and get every downstream deadline (AOC-4, MGT-7, ADT-1, PAS-3,
  FC-GPR, DIR-12, CHG-1 ...), then add them to the calendar.
- **Board report.** A printable status for any quarter, FY or custom period:
  filed, overdue, pending, not recorded. Copy it for Excel (tab-separated, pastes
  straight into columns) or download a CSV that Excel opens cleanly, with each
  item's 30-day cost in rupees and in the reference currency.
- **Amounts in CAD or USD for reference.** Every penalty amount shows a Canadian
  dollar figure (or US dollars, a switch in the masthead and the profile) at the
  Bank of Canada's daily rate, with the rupee figure, which the law fixes, in
  brackets.
- **Regulator feed.** A daily GitHub Actions job collects official RSS feeds into
  an updates page and an RSS feed of its own.
- **Holidays kept current.** Indian holidays move during the year (festivals
  follow the moon; the Centre, the states and RBI declare or shift days), so on the
  1st of every month `update-holidays.yml` refreshes the lists from RBI's holiday
  matrix, the National Portal of India's copy of the DoPT list and NSE's holiday
  API, and the calendars abroad from their authorities' feeds. A date corrected by
  hand from a later order is never moved back; it is flagged on the Updates page.
- **Holidays abroad.** Canada federal statutory holidays, Ontario public and bank
  holidays, and US federal and Federal Reserve holidays sit beside the Indian
  ones in the month calendar and the overview, for teams that pay, file or meet
  across borders, with ICS feeds of their own. They never move an Indian due date.
- **Subscribe and export.** ICS feeds for everything, per law and per audience,
  with reminders 7 days and 1 day before; single-event downloads; CSV.
- **Built for agents too.** A static JSON API, `llms.txt`, and an MCP server so
  AI agents can ask what is due and what it costs.

## Data

Rules live in [`data/rules`](data/rules), one YAML file per law area: income tax,
GST, MCA and LLP, SEBI LODR, RBI and FEMA, labour (EPF, ESI, labour codes), state
levies (professional tax, labour welfare fund), foreign trade and other
regulators. Each rule has a schedule, applicability, the law, a structured
penalty model, sources, a verified date and a confidence level. Notified
extensions are recorded per period with their circular. Dates past the verified
window are shown as projected. See [docs/DATA_MODEL.md](docs/DATA_MODEL.md).

Holidays (central gazetted and restricted, exchange and bank holidays where
published) are in [`data/holidays`](data/holidays). The survey of open datasets
and official sources behind the calendar is in
[docs/DATA_SOURCES.md](docs/DATA_SOURCES.md) and on the site's Sources page.

This is information, not legal advice. Laws, forms and portals change; confirm
on the official portal before you file. Found a wrong date?
[Open a correction](https://github.com/dgomesbr/india-compliance-calendar/issues/new?labels=correction)
with the official source.

## API, feeds and MCP

| What | Where |
|---|---|
| Rules, holidays, events in one file | `/api/v1/bundle.json` |
| Dated occurrences, current FY to 25 months ahead | `/api/v1/occurrences.json` |
| Rules, holidays, events, updates, sources, meta | `/api/v1/{rules,holidays,events,updates,sources,meta}.json` |
| Calendar feeds | `/ics/all.ics`, `/ics/<law>.ics`, `/ics/for-<audience>.ics`, `/ics/rules/<id>.ics` |
| Regulator updates | `/updates.xml` |
| Agent orientation | `/llms.txt` |

MCP server (Node 22.18 or later, no dependencies, reads the published data):

```sh
git clone https://github.com/dgomesbr/india-compliance-calendar
claude mcp add india-compliance-calendar -- node ./india-compliance-calendar/mcp/server.ts
```

Tools: `upcoming_obligations`, `get_obligation`, `search_obligations`,
`event_deadlines`, `check_date`, `list_holidays`, `regulatory_updates`. Set
`ICC_DATA_URL` to a fork's `bundle.json` or a local file. See
[mcp/README.md](mcp/README.md).

## Development

```sh
npm ci
npm run dev        # http://localhost:4321/india-compliance-calendar/
npm test           # engine, data validation, feed parser, MCP server
npm run validate   # data checks only
npm run feeds      # collect regulator feeds into data/updates.json
npm run build      # static site in dist/
```

Stack: Astro 7 with Preact islands, TypeScript, YAML data, no backend. The date
engine in `src/lib` is plain erasable TypeScript shared by the build, the browser
and the MCP server.

## Deployment

`.github/workflows/deploy.yml` validates, tests, collects feeds and deploys to
GitHub Pages on every push to `main` and daily at 06:00 IST, so date windows and
feeds stay current. `refresh-sources.yml` runs every other day: it compares the
Income Tax e-Filing tax calendar and the GST portal's current dates with the
rules, checks the holiday calendars abroad against their statutory rules and
open datasets (drafting a coming year from the rule until its authority
publishes it), checks every cited link, and commits the results to
`data/source-status.json`, which the Sources page shows. Forks
can publish elsewhere with `ICC_SITE` and `ICC_BASE`.

## Design

Designed with the Impeccable process: product context in [PRODUCT.md](PRODUCT.md),
the visual system in [DESIGN.md](DESIGN.md). The world is a listed company's
annual report: a navy masthead over white working pages, ruled tables with
tabular figures, one cobalt for actions, state tints only where state is the
message, and two charts: the timeline that tells the year, and the cost of a
delay for a single filing. Each law has its own colour, shown only as a swatch
beside its name. Motion explains change (rows glide, figures count, the timeline
assembles from Today) and gives way to plain fades under reduced motion.

## Licence

Code: MIT. Compiled data in `data/`: CC BY 4.0. Government source material keeps
its own terms. Fonts: Archivo and Fragment Mono, SIL Open Font License.