SciMD — Scientific Markdown for the AI Era
Project description
SciMD — Scientific Markdown for the AI Era
An open document format designed for humans to write, machines to understand, and science to advance.
The Problem
Modern scientific and technical documents are trapped in formats designed for printing, not understanding:
- PDFs require OCR to extract text, losing structure and introducing errors
- Charts as images are opaque to AI — a bar chart becomes meaningless pixels
- Figures without context force models to hallucinate interpretations
- Unstructured text makes RAG retrieval imprecise and chunk boundaries arbitrary
- Formulas as images cannot be parsed, searched, or validated
The result: AI models hallucinate, RAG systems retrieve noise, and training pipelines waste compute on lossy format conversions.
The Solution
SciMD (.smd) is a plain-text, human-readable document format that solves these problems by design:
| Problem | SciMD Solution |
|---|---|
| OCR errors | Plain text with Markdown — no conversion needed |
| Opaque charts | Author provides tabular data + interpretation |
| Ambiguous figures | Mandatory author descriptions for every image |
| Poor RAG chunking | Semantic sections with unique IDs and metadata |
| Formula images | Native LaTeX inline ($...$) and block ($$...$$) |
| Diagram ambiguity | MermaidJS source code + author description |
| Missing context | Structured metadata at document and section level |
| Training noise | Sequential, predictable structure from authoring |
Key Principles
- Author-time structure — Structure is defined when writing, not reverse-engineered later
- Data over pixels — Charts are data tables; diagrams are code; formulas are LaTeX
- Interpretation is mandatory — Every visual element carries the author's explanation
- Sequential readability — Documents flow logically for both humans and token streams
- Plain text first — Every
.smdfile is valid UTF-8 text, editable in any text editor - Open by default — MIT licensed, community-driven, no vendor lock-in
Quick Example
---smd
title: "Effects of Temperature on Catalyst Performance"
authors:
- name: "María García"
orcid: "0000-0002-1234-5678"
affiliation: "UNAM"
version: "0.1.0"
lang: "es"
keywords: ["catalysis", "temperature", "kinetics"]
---
::section{#intro}
::meta
type: introduction
summary: "Overview of temperature effects on heterogeneous catalysis"
::
# Introduction
The relationship between temperature and catalytic activity follows
the Arrhenius equation $k = A e^{-E_a / RT}$, where $E_a$ is the
activation energy and $R$ is the gas constant.
::endsection
::section{#results}
::meta
type: results
summary: "Experimental measurements of conversion rates at 5 temperatures"
depends_on: ["#methods"]
::
# Results
::chart{#fig-conversion}
::interpretation
Conversion rate increases linearly between 200–350°C, reaching a
plateau at 89% above 400°C. The inflection point at 350°C suggests
a change in the rate-limiting step.
::
| Temperature (°C) | Conversion (%) | Selectivity (%) |
|---|---|---|
| 200 | 23.1 | 95.2 |
| 250 | 41.7 | 93.8 |
| 300 | 62.4 | 91.1 |
| 350 | 78.9 | 87.3 |
| 400 | 89.2 | 82.6 |
::endchart
::endsection
Project Structure
scimd/
├── spec/
│ └── SPECIFICATION.md # Full format specification (v0.1.0)
├── examples/
│ ├── basic.smd # Simple example document
│ └── full-paper.smd # Complete scientific paper
├── parser/
│ ├── scimd_parser.py # Reference parser in Python
│ ├── scimd_validator.py # Validation tool
│ └── requirements.txt # Python dependencies
├── docs/
│ ├── AUTHORING_GUIDE.md # How to write SciMD documents
│ └── RAG_GUIDE.md # How to use SciMD for RAG pipelines
├── LICENSE
├── CONTRIBUTING.md
└── README.md
Getting Started
Writing a Document
Any text editor works. Save your file with the .smd extension and follow the Authoring Guide.
Validating a Document
pip install scimd
scimd validate my-paper.smd
Parsing for RAG
from scimd import SciMDParser
doc = SciMDParser.parse("my-paper.smd")
# Get semantically chunked sections
for section in doc.sections:
print(section.id, section.summary)
print(section.content)
# Extract all chart data as DataFrames
for chart in doc.charts:
print(chart.interpretation)
print(chart.dataframe)
For the Scientific Community
SciMD is built to serve researchers, not platforms:
- No proprietary tools required — write in VS Code, Vim, Notepad, anything
- Version control friendly — plain text diffs cleanly in Git
- Citation ready — structured metadata maps to BibTeX, CSL, and DOI
- Multilingual — UTF-8 native,
langmetadata per document and section - Accessible — mandatory descriptions make content accessible by design
Roadmap
- v0.1.0 — Core specification
- v0.2.0 — Reference parser + validator (Python)
- v0.3.0 — VS Code extension with live preview
- v0.4.0 — Pandoc filter for PDF/HTML/DOCX export
- v0.5.0 — LLM training pipeline toolkit
- v1.0.0 — Stable specification after community review
Contributing
We welcome contributions from researchers, developers, and anyone who cares about making knowledge more accessible. See CONTRIBUTING.md.
Author
SciMD was created by Juan Francisco Avilés Calderón.
License
MIT — Use it, fork it, improve it.
SciMD: Because science deserves better than screenshots of spreadsheets.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyscimd-0.1.31.tar.gz.
File metadata
- Download URL: pyscimd-0.1.31.tar.gz
- Upload date:
- Size: 27.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b89134c15a758a778b6d3deb8613eec7fc2459245a8556a1c95c54ff37bfcc9e
|
|
| MD5 |
74b6fe508da560d8164552a73352fcb0
|
|
| BLAKE2b-256 |
d81c882efaeddf2819fb137e06f21e752ac193a160aa24d09a59dd1f1d59d172
|
Provenance
The following attestation bundles were made for pyscimd-0.1.31.tar.gz:
Publisher:
publish.yml on avifranca/scimd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyscimd-0.1.31.tar.gz -
Subject digest:
b89134c15a758a778b6d3deb8613eec7fc2459245a8556a1c95c54ff37bfcc9e - Sigstore transparency entry: 1135850453
- Sigstore integration time:
-
Permalink:
avifranca/scimd@ff4819aa2182db0ca410cdf883060a8a7125a131 -
Branch / Tag:
refs/tags/v0.1.31 - Owner: https://github.com/avifranca
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ff4819aa2182db0ca410cdf883060a8a7125a131 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyscimd-0.1.31-py3-none-any.whl.
File metadata
- Download URL: pyscimd-0.1.31-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
208b0b2855c0b6f3d6576fdb7bb950304fb9b063ac67951d34b810ae0b5b5bc5
|
|
| MD5 |
3b92f099d9582eda6f4ce54b18ad9d38
|
|
| BLAKE2b-256 |
4d47591917211fb6d961b4eb0f8f08476237ee5631a76468c4cf55c6560a6e28
|
Provenance
The following attestation bundles were made for pyscimd-0.1.31-py3-none-any.whl:
Publisher:
publish.yml on avifranca/scimd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyscimd-0.1.31-py3-none-any.whl -
Subject digest:
208b0b2855c0b6f3d6576fdb7bb950304fb9b063ac67951d34b810ae0b5b5bc5 - Sigstore transparency entry: 1135850518
- Sigstore integration time:
-
Permalink:
avifranca/scimd@ff4819aa2182db0ca410cdf883060a8a7125a131 -
Branch / Tag:
refs/tags/v0.1.31 - Owner: https://github.com/avifranca
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ff4819aa2182db0ca410cdf883060a8a7125a131 -
Trigger Event:
push
-
Statement type: