A free math editor for CBT platforms, JAMB exams, and e-learning.
Visual tap-to-build math equations and chemistry formulas โ
no LaTeX typing required. Drop it into any HTML page, PHP template, or CMS
with a single <script> tag.
Free alternative to TinyMCE math plugin and CKEditor chemistry plugin.
Tap-to-build fractions, exponents, radicals, and symbols. A free LaTeX editor for exams โ students and teachers never type LaTeX. Powered by MathLive.
Click-to-build chemical formulas with subscripts, charges, coefficients, and reaction arrows. A free CKEditor chemistry plugin alternative.
Built for JAMB CBT, WAEC, NECO, and any e-learning platform. Create exam questions with embedded math equations and chemical formulas.
A free TinyMCE math plugin replacement. No API keys, no subscriptions, no vendor lock-in. MIT licensed โ use it anywhere, forever free.
Save & load exam questions as JSON. Math stored as LaTeX, chemistry as structured trees. Export to HTML for displaying questions to students.
Plain HTML, PHP, WordPress, Moodle, any CMS. Embed in JAMB CBT software, WAEC exam portals, or custom e-learning apps. One script tag โ done.
| Feature | CBTEditor | TinyMCE | CKEditor |
|---|---|---|---|
| Visual math (no LaTeX) | โ Free | ๐ฐ Paid plugin | ๐ฐ Paid plugin |
| Chemistry formula editor | โ Free | โ None | ๐ฐ Paid plugin |
| License | MIT (Free) | Commercial | GPL/Commercial |
| Framework required | None | None | None |
| Drop-in form input | โ Built-in | Manual | Manual |
Option A โ Plain <script> tag (no build tools):
<form method="POST" action="/save">
<input name="title" placeholder="Title">
<div id="editor"></div>
<button type="submit">Submit</button>
</form>
<link rel="stylesheet" href="cbt-editor.min.css">
<script src="cbt-editor.min.js"></script>
<script>
CBTEditor.setMathLiveFontsDir('./fonts');
new CBTEditor({
target: document.getElementById('editor'),
name: 'content' // ← auto-syncs JSON to hidden input
});
</script>
Option B โ npm (for bundler-based projects):
npm install cbt-editor
โ Open Full Documentation Hub โ all docs in one navigable page with sidebar.
cbt-editor-v0.1.0/
โโโ cbt-editor.min.js โ The editor (UMD, self-contained)
โโโ cbt-editor.min.css โ Styles
โโโ fonts/ โ MathLive math fonts
โโโ README.md
โโโ CHANGELOG.md
โโโ LICENSE
โโโ docs/
โโโ INSTALLATION.md
โโโ USAGE.md
โโโ ARCHITECTURE.md
โโโ EXTENDING.md
โโโ UPDATING.md
โโโ CONTRIBUTING.md
Same snippet โ just drop it into any PHP template. The editor auto-syncs to a hidden input, so your existing form submission works unchanged:
<?php // In your PHP page or WordPress template ?>
<link rel="stylesheet" href="<?php echo get_template_directory_uri(); ?>/cbt-editor.min.css">
<script src="<?php echo get_template_directory_uri(); ?>/cbt-editor.min.js"></script>
<form method="POST">
<input name="title" placeholder="Title">
<div id="editor"></div>
<button type="submit">Submit</button>
</form>
<script>
CBTEditor.setMathLiveFontsDir('<?php echo get_template_directory_uri(); ?>/fonts');
new CBTEditor({
target: document.getElementById('editor'),
name: 'content'
});
</script>
<?php
// On form submit, $_POST['content'] contains the full document JSON.
// Store it directly in your database.
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = $_POST['title'];
$content = $_POST['content']; // JSON โ store as-is
// $db->query("INSERT INTO documents (title, content) VALUES (?, ?)", [$title, $content]);
}
?>