Research tools that run in your browser.
Plot, test, fit, convert, inspect structures and tidy citations: 18 research tools, free and open source. Files you open are read in your browser and never uploaded.
No tools match “”
Try a file type such as xvg, pdb or bib, or a task such as fit, convert or cite.
Data & Statistics
8 toolsClean, test, fit and plot experimental data.
Plot Digitizer
Extract data points from a graph image by clicking or tracing curves, then export them as CSV, a replotted figure or Python.
Data Cleaner
Clean messy CSV files step by step in an editable recipe, then download the tidy file and the pandas script that repeats it.
Statistics Calculator
Run t-tests, ANOVA with post-hoc comparisons, correlation and non-parametric tests, with effect sizes, plots, advice and a Python script that reruns them.
Error Bar Generator
Compute mean, SD, SEM, median, IQR and confidence intervals per group, plot error bars with significance brackets, and get the Python.
Outlier Detector
Flag anomalies with Z-scores, Tukey’s IQR fences or the robust modified Z-score, see them plotted, and get the Python.
Curve Fitter
Type any equation and fit it to your data: parameters with uncertainties, a styled plot, and the Python code.
Plot Builder
Plot CSV columns as lines, bars, histograms, box plots, heatmaps and more, on one or several panels; style it and export PDF, PNG, SVG or the matplotlib script.
XVG Visualizer
Plot GROMACS .xvg and CSV logs: pick columns, add running means and panels, and export the figure or the Python that draws it.
Computational Chemistry
4 toolsInspect structures, prepare coordinates and write the batch scripts for a run.
Structure Inspector
Render PDB, CIF, GRO, XYZ and more in 3D; select atoms, measure geometry and export a figure.
Coordinate Manipulator
Translate, rotate and re-box PDB, GRO and XYZ coordinates, and convert between the formats.
Scientific Converter
Convert energy, length, pressure, dipole, polarizability, spectroscopic and temperature units against CODATA values.
MD Workflow Generator
Set up GROMACS runs with every .mdp file explained, index groups and one zip; batch scripts for SLURM, PBS, LSF or Grid Engine; LAMMPS and PLUMED too.
Writing & Citations
6 toolsEquations, tables and a bibliography that builds.
Equation Formatter
Build LaTeX equations and matrices visually with a live preview, then copy the code.
Visual LaTeX Tables
Paste a table from Excel or CSV, preview it, and copy clean LaTeX (booktabs) or Markdown.
DOI to BibTeX
Paste DOIs and get ready-to-use BibTeX entries, looked up through doi.org.
BibTeX Deduplicator
Find entries in a .bib library that share a DOI or title, and keep one of each.
BibTeX Sanitizer
Tidy messy BibTeX exports: protect capitals in titles and clean up fields.
Journal Abbreviator
Convert full journal names to their ISO 4 abbreviations.
Focus & Flow
3 toolsNot research tools: a timer, a decision matrix and a physics toy for the breaks in between.
Ambient Pomodoro
A focus timer with adjustable ambient sounds like rain and cafe noise for deep work.
Decision Matrix
Weigh options against criteria in a scored matrix to rank your best choice.
Kinetic Sandbox
An interactive particle field that scatters from your pointer and gathers while you hold it, a calm visual break.
Use the library behind the tools
Most tools compute with stemkit-core: 42 domain modules covered by 4,434 tests validated against SciPy, NumPy and statsmodels. The same functions run in Node, so an analysis explored here can be scripted, version-pinned and re-run.
-
Install it from npm. It needs Node 18 or later and brings no other packages with it.
Terminalnpm install stemkit-core -
Save an example in the same folder under the name shown, with any data file it reads beside it, and run it:
node pick-test.mjs.Summarise every series in a GROMACS .xvg file, named by its legend.
xvg-summary.mjsimport { readFileSync } from 'node:fs'; import { parseXvg, extractColumn, columnStats } from 'stemkit-core'; const { matrix, headers } = parseXvg(readFileSync('rmsd.xvg', 'utf8')); headers.slice(1).forEach((name, i) => { const s = columnStats(extractColumn(matrix, i + 1)); console.log(`${name}: ${s.mean.toFixed(3)} ± ${s.std.toFixed(3)}`); });Let the assumption checks pick the test, then run it.
pick-test.mjsimport { recommendTest, independentTTest, mannWhitneyU } from 'stemkit-core'; const control = [4.1, 4.3, 3.9, 4.4, 4.0, 4.2, 4.5, 3.8, 4.1, 4.6]; const treated = [5.0, 5.2, 4.8, 9.9, 5.1, 4.9, 5.3, 5.0, 12.4, 5.2]; const advice = recommendTest({ design: 'independent', groups: [control, treated] }); console.log(advice.reason); const r = advice.test === 'mann-whitney' ? mannWhitneyU(control, treated) : independentTTest(control, treated); console.log(`${advice.test}: p = ${r.p.toPrecision(3)}`); // Group 2 departs from normality (D'Agostino p = .005), so a // rank-based test is safer. // mann-whitney: p = 0.000154Mass and radius of gyration of a .gro structure, with the unit made explicit.
gyration.mjsimport { readFileSync } from 'node:fs'; import { parseStructure, centreOfMass, radiusOfGyration, convert } from 'stemkit-core'; const gro = readFileSync('protein.gro', 'utf8'); const { atoms, unit } = parseStructure(gro, 'gro'); const { mass } = centreOfMass(atoms); const rg = convert(radiusOfGyration(atoms), 'length', unit, 'angstrom'); console.log(`${atoms.length} atoms, ${mass.toFixed(1)} Da`); console.log(`Rg = ${rg.toFixed(2)} Å`);Convert between units on CODATA values.
units.mjsimport { convert, convertTemperature } from 'stemkit-core'; // 1 hartree in kcal/mol, 1 eV in kJ/mol, 298.15 K in °C console.log(convert(1, 'energy', 'hartree', 'kcal')); // 627.5094740631 console.log(convert(1, 'energy', 'ev', 'kj')); // 96.48533212331287 console.log(convertTemperature(298.15, 'k', 'c')); // 25A SLURM array job for GROMACS, with a warning about memory in flight.
array-job.mjsimport { generateScript } from 'stemkit-core'; const { script, warnings } = generateScript({ engine: 'gromacs', jobName: 'replicas', modules: ['gromacs/2023.3'], nodes: 1, gpus: 1, cpusPerTask: 16, memory: '32G', walltime: '24:00:00', array: true, arrayRange: '1-100%10', tpr: 'md.tpr', deffnm: 'md' }); console.log(script); warnings.forEach(w => console.warn(`[${w.level}] ${w.message}`)); // [warn] Array job: --mem=32G is per task. With 10 task(s) running // concurrently that is 320G in flight. ...Remove duplicate entries from a .bib library, keeping the most complete of each.
dedupe-bib.mjsimport { readFileSync, writeFileSync } from 'node:fs'; import { parseBibtex, deduplicateAuto, serialiseLibrary } from 'stemkit-core'; const { entries } = parseBibtex(readFileSync('refs.bib', 'utf8')); const { entries: kept, removed } = deduplicateAuto(entries); writeFileSync('refs.clean.bib', serialiseLibrary(kept)); console.log(`${removed} duplicate(s) removed, ${kept.length} kept`);
Modules and worked examples are in the library reference.
What leaves your computer
Nothing you open. Files are read in the browser and never uploaded, there is no account, and a page keeps working offline once it has loaded.
Two features go online, and only when you use them: DOI to BibTeX looks up the DOIs you give it, and the structure inspector can fetch an entry from the PDB by its ID.
Cite STEMKit
This DOI always resolves to the current release.
10.5281/zenodo.21543112