Keshav Bhardwaj

cv.json Documentation

Overview

cv.json is the canonical, public, machine-readable source of truth for Keshav Bhardwaj’s professional CV.

Canonical location:

/assets/api/json/cv.json

Canonical URL:

https://keshavbhardwaj.in/assets/api/json/cv.json

The file is designed to be consumed by:

The JSON contains professional facts and content metadata, not instructions for how the CV should look.


Design Principles

1. Single source of truth

Professional information should be entered here once and reused by all CV outputs.

The website, PDF generator, structured data, and other consumers should read from this file rather than maintaining separate copies of the same information.

2. Data vs. presentation

cv.json describes what is true about the CV, not how it should be displayed.

Do not add presentation-specific fields such as:

"show_on_page_1": true
"sidebar": true
"font_size": 10
"pdf_section": "sidebar"

The HTML and PDF templates are responsible for layout, typography, ordering, page breaks, and visual treatment.

3. Public-CV control with pubcv

pubcv is an in-house content-publication switch.

"pubcv": true

means the item is eligible for inclusion in the public CV.

"pubcv": false

means the item is retained in the canonical data but should not be included in the public CV presentation.

pubcv does not mean:

It only controls whether the item is intended for the public CV.


Top-level structure

The current top-level structure is:

metadata
person
professional_summary
experience
education
research
works
projects
honours
professional_development
skills
languages
additional_information
professional_memberships
service_and_volunteering
presentations
conferences
teaching
grants
references
declaration

Each section is described below.


metadata

Contains information about the JSON document itself.

"metadata": {
  "schema_version": "1.0",
  "last_updated": "2026-09-05",
  "language": "en-IN",
  "canonical_url": "https://keshavbhardwaj.in/assets/api/json/cv.json"
}

Fields

Field Type Meaning
schema_version string Version of the CV JSON structure
last_updated string Date on which the canonical data was last updated
language string Language/locale of the CV content
canonical_url string Public canonical URL of the JSON document

Language

The current locale is:

en-IN

Use Indian English conventions in authored content and schema keys where appropriate.

Examples:

However, official organisation names must not be altered merely to enforce spelling conventions.


person

Contains identity, contact, profile, and basic personal information.

person
├── first_name
├── last_name
├── preferred_name
├── honorific
├── headline
├── summary
├── location
├── nationality
├── date_of_birth
├── contact
├── profiles
└── photo

contact

Contains public contact details.

"contact": {
  "email": [],
  "phone": null,
  "website": ""
}

email is an array because more than one public professional email address may be available.

Do not add private contact information to this public file.

profiles

Contains external professional/academic profile URLs.

Examples include:

Unavailable profiles should use null rather than invented URLs.

photo

Contains the public profile photograph reference:

"photo": {
  "url": "/assets/img/profile.webp",
  "alt": "Keshav Bhardwaj"
}

professional_summary

Contains reusable professional summaries.

"professional_summary": {
  "short": "...",
  "long": "..."
}

short

A concise summary suitable for:

long

A fuller professional summary suitable for:

Avoid maintaining another duplicate summary elsewhere in the JSON.


experience

An ordered list of professional employment and work experience.

Each entry uses a stable id.

Typical structure:

{
  "id": "unique-experience-id",
  "organisation": "...",
  "department": null,
  "role": "...",
  "employment_type": "...",
  "start_date": "YYYY-MM",
  "end_date": null,
  "current": true,
  "location": "...",
  "url": "...",
  "description": "...",
  "highlights": [],
  "research_areas": [],
  "projects": []
}

Important fields

Field Meaning
id Stable machine-readable identifier
organisation Employer/organisation
department Department, division, centre, etc.
role Position held
employment_type Full Time, Internship, etc.
start_date Start date
end_date End date; null for ongoing roles
current Explicit current-status indicator
location Location of the role
url Relevant official organisation/page URL
description Short description
highlights Key responsibilities or achievements
research_areas Research/policy areas associated with the role
projects Named projects associated with the role

Project references

Where a project has its own entry in projects, prefer using its stable project ID rather than duplicating project data.


education

Contains academic and educational history.

Each record may contain:

id
institution
degree
level
field
specialisation
subjects
start_date
end_date
location
url
grade
status
thesis
highlights

level

Represents the educational category.

The current data uses arrays such as:

"level": [
  "Postgraduate",
  "Masters"
]

and:

"level": [
  "Undergraduate",
  "Bachelors"
]

If this structure is retained, values should remain consistent.

status

Examples:

completed
withdrawn

A withdrawn programme should remain factually represented as withdrawn; it should never be presented as a completed degree.

specialisation

Use the Indian-English spelling consistently.


research

Contains research interests and structured research areas.

research
├── research_interests
└── research_areas

research_interests

A concise list of subjects and topics of research interest.

research_areas

Structured descriptions of major research domains.

Each area has:

id
area
description
keywords

The id should remain stable once established.


works

Contains publications and other scholarly/research works.

Typical fields:

id
type
status
title
authors
venue
publication_date
publisher
volume
issue
pages
doi
isbn
url
description
keywords
pubcv

status

Describes the factual publication status.

Examples:

published
unpublished

Do not use status to mean whether the work appears on the public CV.

That is the purpose of pubcv.

pubcv

Controls inclusion in the public CV.

"pubcv": true

or:

"pubcv": false

projects

Contains structured descriptions of professional or research projects.

Typical fields:

id
name
status
role
organisation
start_date
end_date
description
methods
outcomes
url
pubcv

status

Describes the project’s factual state, such as:

ongoing
completed

methods

Describes methods or kinds of work involved.

outcomes

Records concrete outcomes where available.

An empty array is preferable when there are currently no documented outcomes.


honours

Contains scholarships, fellowships, awards, recognitions, and similar distinctions.

Typical fields:

id
type
name
issuer
date
status
description
url
pubcv

Important distinction

status describes the actual status of the honour.

For example:

awarded
unclaimed

pubcv independently controls whether it appears on the public CV.

Therefore:

"status": "awarded",
"pubcv": true

is different from:

"status": "unclaimed",
"pubcv": false

professional_development

Contains courses, specialisations, training programmes, workshops, and other professional-development activities.

Typical fields:

id
type
name
provider
platform
venue
length
date
status
credential_id
url
pubcv

Not every field applies to every entry.

Use null when a value is genuinely unavailable.

type

Examples currently used include:

course
specialisation
honours_course
training
workshop
capacity building program

The type should describe what the activity actually was, rather than how it should be displayed.


skills

Groups professional capabilities.

Current categories include:

research_and_analysis
policy_and_governance
technology_and_digital
programming
software_and_tools
communication_and_editorial

Skills that have meaningful proficiency information may use objects:

{
  "name": "Python 3",
  "proficiency": "Beginner"
}

Other capability lists may remain simple strings where a proficiency rating would be artificial or unnecessary.

Do not add proficiency ratings merely for visual consistency.


languages

Contains language capabilities.

Typical structure:

{
  "language": "English",
  "proficiency": "Fluent",
  "reading": null,
  "writing": null,
  "speaking": null
}

reading, writing, and speaking should remain null unless separate proficiency information is actually known.

Do not infer language proficiency from education, nationality, location, or other fields.


additional_information

Contains supplementary professional/personal CV information that does not naturally belong elsewhere.

Current structure:

additional_information
├── interests
├── foreign_travel
└── other

interests contains personal interests appropriate for a public CV.

The current interests include:


Empty collection sections

The following sections are deliberately present even when currently empty:

professional_memberships
service_and_volunteering
presentations
conferences
teaching
grants

They provide stable extension points for future CV data.

An empty array means:

There are currently no records in this category.

Do not invent placeholder records simply to populate the section.


references

Contains professional references where applicable.

Current structure:

"references": {
  "available": false,
  "note": null,
  "people": []
}

Because this is a public JSON endpoint, references should only be added when their publication is appropriate and authorised.

Do not put private referee contact details into the public JSON without permission.


declaration

Optional declaration/signature information.

Current structure:

"declaration": {
  "text": null,
  "date": null,
  "signature": null
}

This section is retained for compatibility with formal CV formats but need not be populated for ordinary web use.


Date convention

Dates should be represented as strings using ISO-style precision appropriate to the information actually known.

Examples:

"date": "2026-07-31"
"start_date": "2026-05"
"start_date": "2021"

Rules


Null vs. empty array

Use these deliberately.

null

Use when a field is applicable but its value is unavailable or not known.

Example:

"url": null

[]

Use when the field represents a collection and there are currently zero items.

Example:

"projects": []

Do not replace all nulls with empty strings.


Stable IDs

Records that have an id should have a stable, unique identifier.

Example:

"id": "cag-interlink"

IDs should:

Changing an ID can break references from other parts of the site.


pubcv rules

pubcv is the principal public-CV inclusion switch.

true

The record may be rendered in the public CV.

false

The record should remain in the canonical data but should be omitted from the public CV.

Important

pubcv is content metadata, not presentation metadata.

The renderer decides:

The JSON only answers:

Should this record be considered part of the public CV?


Renderer responsibilities

Consumers of cv.json should handle presentation independently.

For example:

cv.json
   │
   ├── /cv/ HTML
   │
   ├── CV PDF
   │
   ├── Schema.org
   │
   └── Other machine-readable consumers

The renderer may:

The renderer must not modify the canonical JSON.


Validation requirements

Before deployment, cv.json should be validated as JSON.

The build should fail if:

A deployment should never publish a partially broken CV.


Updating the CV

When adding or changing professional information:

  1. Edit assets/api/json/cv.json.
  2. Preserve the existing structure.
  3. Use the established field names.
  4. Use Indian-English schema spelling (organisation, specialisation, etc.).
  5. Use ISO-style date strings.
  6. Add a stable id to new structured records.
  7. Set pubcv deliberately where the category supports it.
  8. Do not add PDF/layout instructions.
  9. Validate the JSON.
  10. Commit the change.

Generated HTML and PDF outputs should be produced by the deployment/build process rather than maintained separately.


What does not belong in cv.json

Do not add:

The file is public and should be treated accordingly.


Schema evolution

The current schema version is:

1.0

For backwards-compatible additions, the schema version may remain unchanged if the consuming templates can safely ignore the new field.

For structural or breaking changes, increment the schema version.

Examples of potentially breaking changes:

When changing the schema, update this documentation and all consumers together.


Current canonical data model

At a high level:

cv.json
│
├── metadata
│
├── person
│   ├── contact
│   ├── profiles
│   └── photo
│
├── professional_summary
│
├── experience
│
├── education
│
├── research
│   ├── research_interests
│   └── research_areas
│
├── works
│
├── projects
│
├── honours
│
├── professional_development
│
├── skills
│
├── languages
│
├── additional_information
│
├── professional_memberships
├── service_and_volunteering
├── presentations
├── conferences
├── teaching
├── grants
│
├── references
└── declaration

The canonical principle is:

cv.json contains the facts. The renderer decides the presentation. pubcv decides whether an eligible record belongs in the public CV.