DEV Community

Ville Teikko
Ville Teikko

Posted on

How to read your 23andMe raw data privately — in the browser, nothing uploaded

If you've ever done a 23andMe, AncestryDNA or MyHeritage test, you're sitting on a plain-text file with hundreds of thousands of your own genetic markers. Most people never open it — and the tools that read it usually want you to upload your genome to their servers. After the 23andMe bankruptcy and asset sale, a lot of us are (rightly) more careful about that.

Here's the thing: you don't need to upload anything. A DNA raw-data file is just text, and modern browsers can read it entirely on your own device. Let me show you how that works — and how to verify nothing leaves your machine.

What's actually in the file

Unzip your export and you'll find a tab-separated text file that looks like this:

# rsid        chromosome  position   genotype
rs4988235     2           136608646  AA
rs1801133     1           11856378   GG
...
Enter fullscreen mode Exit fullscreen mode

Each row is a SNP: an rsid (the marker's ID), where it sits on the genome, and your genotype (the two alleles you carry). That's it — no magic, just a big lookup table of ~600k–700k markers.

Reading it in the browser (no server involved)

The browser's FileReader / Blob.text() API reads a local file into memory without any network request:

const input = document.querySelector('input[type=file]');

input.addEventListener('change', async () => {
  const text = await input.files[0].text();   // read locally — no upload
  const snps = new Map();

  for (const line of text.split('\n')) {
    if (line.startsWith('#') || !line.trim()) continue;
    const [rsid, chr, pos, genotype] = line.split('\t');
    snps.set(rsid, genotype);
  }

  // now look up any marker you care about — e.g. lactase persistence:
  console.log('rs4988235:', snps.get('rs4988235'));
});
Enter fullscreen mode Exit fullscreen mode

input.files[0].text() never touches the network. You can parse the whole file, look up any marker, and render results — all client-side.

How to verify nothing is uploaded

Don't take anyone's word for it (including mine). Open DevTools → Network tab, filter by Fetch/XHR, then load your file into the tool. If it's processing locally, you'll see zero requests carrying your data. That's the entire trust model — verifiable in about ten seconds.

What you can actually look up

Once you have the rsid → genotype map, you can check well-studied variants, for example:

  • rs4988235 (near LCT) — lactase persistence: can you digest milk as an adult?
  • rs1801133 (MTHFR C677T) — folate metabolism
  • rs671 (ALDH2) — the alcohol-flush variant
  • rs1815739 (ACTN3) — the so-called "sprint gene"

One caution: consumer genotyping isn't clinical sequencing, and a single SNP is rarely destiny. Treat this as educational, not medical advice.

A ready-made version

If you'd rather not write the parser, I've been using Quanome's free DNA Explorer — it does exactly this (23andMe / AncestryDNA / MyHeritage, in-browser, nothing uploaded) and explains common trait, health and pharmacogenomic variants in plain language. No signup. Open the Network tab and you'll see it never phones home.

Either way — write it yourself or use a tool — the point stands: your genome is a local text file, and reading it shouldn't mean handing it to another company.

Top comments (0)