ECRcentral stores all content as YAML files under data/entries/. Each record is one file. Build scripts read those files and produce JSON artifacts consumed by the frontend. This document covers every field, every entity type, the vocabulary system, the JSON artifact format, and the legacy field conventions.
Each entry lives at a path like:
data/entries/{type}/{slug}.yaml
For example:
data/entries/fundings/embo-scientific-exchange-grants.yaml
data/entries/funders/embo.yaml
data/entries/travel-grants/gordion-knot-travel-awards.yaml
data/entries/resources/ten-simple-rules-writing-research.yaml
The slug in the filename is the canonical identifier. It is used in page URLs, in cross-references between records, and as the unique key in JSON indexes. Slugs are lowercase, hyphenated, ASCII-only, and must be unique within their type.
| Type | Directory | Schema file |
|---|---|---|
| Funder | data/entries/funders/ |
data/schema/funder.schema.json |
| Funding | data/entries/fundings/ |
data/schema/funding.schema.json |
| Travel Grant | data/entries/travel-grants/ |
data/schema/travel-grant.schema.json |
| Resource | data/entries/resources/ |
data/schema/resource.schema.json |
| Vocabulary | data/entries/vocab/ |
data/schema/vocab.schema.json |
These fields appear on every entry type.
| Field | Type | Required | Description |
|---|---|---|---|
slug |
string | yes | Unique identifier; must match the filename without .yaml. URL-safe, lowercase, hyphenated. |
name |
string | yes | Human-readable display name. |
status |
enum | yes | Lifecycle status: active, expired, archived, draft. Only active entries appear in search results by default. |
review_status |
enum | yes | Editorial review status: approved, pending, rejected. Only approved entries are shown to site visitors. |
featured |
boolean | no | When true, the entry may appear on the homepage featured section. Default: false. |
created_at |
date (YYYY-MM-DD) | no | Date the YAML file was first created. |
updated_at |
date (YYYY-MM-DD) | no | Date the entry was last meaningfully updated. |
notes |
string | no | Internal editorial notes, not shown on the site. |
Funders are organizations that offer funding opportunities or travel grants. They are referenced by slug from funding and travel-grant records.
| Field | Type | Required | Description |
|---|---|---|---|
slug |
string | yes | Unique ID, e.g. embo, wellcome-trust. |
name |
string | yes | Full official name of the organization. |
short_name |
string | no | Abbreviated name or acronym, e.g. EMBO. Shown in compact UI contexts. |
url |
string (URL) | yes | Official website URL. |
description |
string | no | One or two sentence description of the organization. |
country |
string | no | Country where the funder is headquartered. Use English country names. |
region |
string | no | Geographic region: Europe, North America, Asia, Africa, South America, Oceania, Global. |
funder_type |
enum | no | Organization type: government, charity, foundation, university, professional-society, intergovernmental, corporate, other. |
logo_path |
string | no | Relative path to logo file under apps/web/public/, e.g. logos/funders/embo.png. |
status |
enum | yes | active, archived. |
review_status |
enum | yes | approved, pending, rejected. |
featured |
boolean | no | Whether to feature on homepage. |
legacy_id |
integer | no | Primary key from the legacy MySQL database. Preserved for traceability. |
legacy_logo_path |
string | no | Original logo path from the legacy system. Used during logo migration. |
slug: embo
name: European Molecular Biology Organization
short_name: EMBO
url: https://www.embo.org
description: >
EMBO is an organization of more than 1,800 leading researchers that promotes
excellence in life sciences through grants, courses, and scientific exchange programmes.
country: Germany
region: Europe
funder_type: intergovernmental
logo_path: logos/funders/embo.png
status: active
review_status: approved
featured: false
legacy_id: 42
legacy_logo_path: /uploads/funders/embo_logo.pngFunding opportunities include fellowships, scholarships, research grants, awards, and other financial support for ECRs.
| Field | Type | Required | Description |
|---|---|---|---|
slug |
string | yes | Unique ID, e.g. embo-scientific-exchange-grants. |
name |
string | yes | Official name of the funding opportunity. |
url |
string (URL) | yes | Link to the application or official page. |
description |
string | no | Markdown-supported description of the opportunity. |
funders |
array of slug strings | yes | Slugs of funder records that offer this funding. At least one required. |
legacy_funder_name |
string | no | Raw funder name string from legacy import; kept when no funder record exists yet. |
funding_purposes |
array of vocab slugs | no | What the funding is for. Values from data/entries/vocab/funding-purpose/. |
career_levels |
array of vocab slugs | no | Who is eligible. Values from data/entries/vocab/career-level/. |
subjects |
array of vocab slugs | no | Relevant disciplines. Values from data/entries/vocab/subject/. |
applicant_countries |
array of strings | no | Countries from which applicants are eligible. Use Worldwide for no restriction. |
host_countries |
array of strings | no | Countries where the funded activity must take place. |
award_amount |
string | no | Free-text description of the award, e.g. Up to EUR 2,500 or Stipend of USD 30,000/year. |
duration |
string | no | Length of the funded period, e.g. 3–12 months, 1 year. |
deadline |
string | no | Application deadline description, e.g. Rolling, 15 January annually. |
deadline_date |
date (YYYY-MM-DD) | no | Machine-readable next deadline date for sorting and expiry detection. |
frequency |
string | no | How often the opportunity recurs: Annual, Bi-annual, Rolling, One-off. |
membership_required |
boolean | no | Whether membership of the funder organization is required to apply. Default: false. |
status |
enum | yes | active, expired, archived, draft. |
review_status |
enum | yes | approved, pending, rejected. |
featured |
boolean | no | Feature on homepage. |
created_at |
date | no | Date added to ECRcentral. |
updated_at |
date | no | Date last updated. |
legacy_id |
integer | no | Legacy MySQL primary key. |
slug: embo-scientific-exchange-grants
name: EMBO Scientific Exchange Grants
url: https://www.embo.org/funding-awards/scientific-exchange-grants/
description: >
EMBO Scientific Exchange Grants support short-term visits by scientists to
collaborate with colleagues at EMBO Member State institutions. Grants cover
travel and subsistence for visits of up to three months.
funders:
- embo
funding_purposes:
- collaboration
- research
career_levels:
- phd
- postdoc
- junior-faculty
subjects:
- life-sciences
applicant_countries:
- Worldwide
host_countries:
- EMBO Member States
award_amount: Up to EUR 2,500
duration: Up to 3 months
deadline: Rolling
frequency: Rolling
membership_required: false
status: active
review_status: approved
featured: false
created_at: 2024-01-15
updated_at: 2024-03-01
legacy_id: 318Travel grants cover costs associated with attending conferences, workshops, research visits, or other scientific travel.
| Field | Type | Required | Description |
|---|---|---|---|
slug |
string | yes | Unique ID, e.g. gordion-knot-conference-travel-award. |
name |
string | yes | Official name of the travel grant. |
url |
string (URL) | yes | Link to the application or official page. |
description |
string | no | Markdown-supported description. |
funders |
array of slug strings | yes | Slugs of offering funders. |
legacy_funder_name |
string | no | Raw funder name from legacy import. |
travel_purposes |
array of vocab slugs | no | What type of travel is supported. Values from data/entries/vocab/travel-purpose/. |
career_levels |
array of vocab slugs | no | Eligible career stages. Values from data/entries/vocab/career-level/. |
subjects |
array of vocab slugs | no | Relevant disciplines. |
applicant_countries |
array of strings | no | Countries of eligible applicants. |
destination_countries |
array of strings | no | Countries where travel must go. |
award_amount |
string | no | Amount or range, e.g. Up to EUR 1,000. |
deadline |
string | no | Deadline description. |
deadline_date |
date (YYYY-MM-DD) | no | Machine-readable deadline. |
frequency |
string | no | Annual, Bi-annual, Rolling, Per event. |
membership_required |
boolean | no | Whether funder membership is required. Default: false. |
status |
enum | yes | active, expired, archived, draft. |
review_status |
enum | yes | approved, pending, rejected. |
featured |
boolean | no | Feature on homepage. |
created_at |
date | no | |
updated_at |
date | no | |
legacy_id |
integer | no |
slug: isth-young-investigator-award-travel-grant
name: ISTH Young Investigator Award Travel Grant
url: https://www.isth.org/page/YIA
description: >
The ISTH Young Investigator Award provides travel support for early career
researchers to present their work at the ISTH Congress and attend scientific
sessions in haemostasis and thrombosis.
funders:
- isth
travel_purposes:
- conference
career_levels:
- phd
- postdoc
subjects:
- medicine
- haematology
applicant_countries:
- Worldwide
award_amount: Up to USD 1,500
deadline: March annually
deadline_date: 2025-03-01
frequency: Annual
membership_required: false
status: active
review_status: approved
featured: false
created_at: 2024-02-10
updated_at: 2024-02-10
legacy_id: 204Resources are tools, guides, databases, online courses, or other assets useful to ECRs that are not funding opportunities.
| Field | Type | Required | Description |
|---|---|---|---|
slug |
string | yes | Unique ID, e.g. mit-commkit. |
name |
string | yes | Name of the resource. |
url |
string (URL) | yes | Where to access the resource. |
description |
string | yes | What the resource is and who it is for. |
source |
string | yes | Publisher, institution, or author name. |
resource_categories |
array of vocab slugs | no | Type of resource. Values from data/entries/vocab/resource-category/. |
subjects |
array of vocab slugs | no | Relevant disciplines. |
career_levels |
array of vocab slugs | no | Who the resource targets. |
access |
enum | no | free, subscription, registration-required. Default: free. |
language |
string | no | Primary language of the resource. Default: English. |
status |
enum | yes | active, archived, draft. |
review_status |
enum | yes | approved, pending, rejected. |
featured |
boolean | no | Feature on homepage. |
created_at |
date | no | |
updated_at |
date | no | |
legacy_id |
integer | no |
slug: mit-commkit
name: MIT CommKit
url: https://mitcommlab.mit.edu/broad/use-the-commkit/
description: >
A collection of guides on scientific communication produced by MIT's
Communication Lab. Covers research articles, grant proposals, conference
abstracts, figures, and oral presentations.
source: MIT Communication Lab
resource_categories:
- science-communication
- academic-writing
subjects:
- all-disciplines
career_levels:
- phd
- postdoc
access: free
language: English
status: active
review_status: approved
featured: false
created_at: 2024-01-20
updated_at: 2024-01-20
legacy_id: 91Vocabularies define the controlled lists used in multi-select fields. They live under data/entries/vocab/{vocab-type}/ as individual YAML files.
| Vocabulary type | Directory | Used by |
|---|---|---|
career-level |
data/entries/vocab/career-level/ |
fundings, travel-grants, resources |
funding-purpose |
data/entries/vocab/funding-purpose/ |
fundings |
travel-purpose |
data/entries/vocab/travel-purpose/ |
travel-grants |
resource-category |
data/entries/vocab/resource-category/ |
resources |
subject |
data/entries/vocab/subject/ |
fundings, travel-grants, resources |
funder-type |
data/entries/vocab/funder-type/ |
funders |
region |
data/entries/vocab/region/ |
funders |
| Field | Type | Required | Description |
|---|---|---|---|
slug |
string | yes | Machine identifier used in entry arrays. |
label |
string | yes | Human-readable display label. |
description |
string | no | Optional clarification of what belongs in this category. |
sort_order |
integer | no | Controls display order in facet lists and checkboxes. |
parent |
string | no | Slug of a parent term (for hierarchical vocabularies). |
| Slug | Label |
|---|---|
bachelor |
Bachelor students |
master |
Master students |
phd |
PhD |
postdoc |
Postdoc |
junior-faculty |
Junior Faculty |
senior-faculty |
Senior Faculty |
md |
MD |
| Slug | Label |
|---|---|
fellowship |
Fellowship, scholarship or training |
research |
Research |
collaboration |
Collaboration |
publishing |
Publishing and editorial |
equipment |
Equipment |
award |
Award |
feasibility |
Feasibility Studies |
| Slug | Label |
|---|---|
conference |
Conference |
collaboration |
Collaboration |
workshop |
Workshop, training or course |
research-visit |
Research visit |
field-work |
Field work |
new-technique |
Learn new technique |
| Slug | Label |
|---|---|
career-development |
Career development |
reproducibility |
Reproducibility |
science-communication |
Science Communication |
academic-writing |
Academic writing |
policy |
Policy |
preprints |
Preprints |
publishing |
Publishing |
peer-review |
Peer review |
data-management |
Data management |
mental-health |
Mental health and wellbeing |
networking |
Networking |
funding-advice |
Funding advice |
other |
Other |
# data/entries/vocab/career-level/postdoc.yaml
slug: postdoc
label: Postdoc
description: Postdoctoral researchers, typically within 5 years of PhD completion.
sort_order: 4Funding and travel-grant records reference funders via the funders field, which is an array of funder slugs:
funders:
- embo
- hfspThe build scripts resolve these slugs to full funder objects when generating JSON artifacts. At validation time, validate_taxonomies.py checks that every slug in a funders array has a matching file in data/entries/funders/{slug}.yaml.
Similarly, vocabulary slugs in fields like career_levels, funding_purposes, and subjects are validated against the corresponding vocabulary directories.
When content was migrated from the legacy MySQL database, some data could not be cleanly normalized. Legacy fields are preserved in YAML to maintain traceability and allow future clean-up.
| Field | Appears on | Purpose |
|---|---|---|
legacy_id |
all types | Primary key (id) from the legacy MySQL table. Allows mapping back to the original database row. |
legacy_logo_path |
funders | The original path of the logo on the legacy server (e.g., /uploads/logos/embo.png). Used when fetching logos from the legacy server during migration. |
legacy_funder_name |
fundings, travel-grants | The raw funder name string from the legacy company or funder column, preserved when no matching funder YAML record has been created yet. |
Legacy fields are prefixed with legacy_ to make them visually distinct and to signal that they are not part of the canonical data model. They are ignored by the frontend and the build scripts, but should not be deleted until the migration is fully verified.
The scripts/build/ scripts read all YAML files and generate JSON artifacts in data/built/. These files are committed to the repository so the site works without a CI build step (GitHub Pages can serve them directly).
Do not edit files in data/built/ manually — regenerate them with make build.
A flat array of all approved, active records across all types, fully resolved (vocabulary labels included, funder objects embedded).
[
{
"slug": "embo-scientific-exchange-grants",
"type": "funding",
"name": "EMBO Scientific Exchange Grants",
"url": "https://www.embo.org/funding-awards/scientific-exchange-grants/",
"description": "EMBO Scientific Exchange Grants support...",
"funders": [
{ "slug": "embo", "name": "European Molecular Biology Organization", "short_name": "EMBO" }
],
"funding_purposes": ["Collaboration", "Research"],
"career_levels": ["PhD", "Postdoc", "Junior Faculty"],
"subjects": ["Life Sciences"],
"award_amount": "Up to EUR 2,500",
"deadline": "Rolling",
"status": "active",
"featured": false
}
]Aggregated facet counts for the search/filter UI.
{
"funding_purposes": [
{ "slug": "research", "label": "Research", "count": 412 },
{ "slug": "fellowship", "label": "Fellowship, scholarship or training", "count": 287 }
],
"career_levels": [
{ "slug": "postdoc", "label": "Postdoc", "count": 651 }
],
"subjects": [...],
"regions": [...]
}A MiniSearch-compatible JSON index for client-side full-text search. Contains tokenized, weighted fields for name, description, funder names, and subjects.
A curated array of records where featured: true, used to populate the homepage showcase section.
[
{
"slug": "embo-scientific-exchange-grants",
"type": "funding",
"name": "EMBO Scientific Exchange Grants",
"funder_name": "EMBO",
"award_amount": "Up to EUR 2,500"
}
]Index of all approved funder records, used to resolve funder slugs to display names in the UI.
The validation scripts enforce the following constraints:
- Every YAML file must parse without errors.
- Every record must have
slug,name,status, andreview_status. - The
slugmust exactly match the filename (without.yaml). - Slugs must be unique within each type directory.
- All funder slugs referenced in
fundersarrays must have a corresponding funder YAML file. - All vocabulary slugs must have a corresponding vocab YAML file of the correct type.
- All URL fields must be valid HTTP/HTTPS URLs.
statusmust be one of:active,expired,archived,draft.review_statusmust be one of:approved,pending,rejected.- Dates must be in
YYYY-MM-DDformat.