<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7" -->

---
title: Jon Skeet's coding blog | daily.dev
description: A detailed walkthrough of how a personal UK election-tracking site stores its data, comparing Firestore and local JSON file storage. Covers the tradeoffs...
canonical: https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Jon Skeet's coding blog | daily.dev
og:description: A detailed walkthrough of how a personal UK election-tracking site stores its data, comparing Firestore and local JSON file storage. Covers the tradeoffs...
og:url: https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7
og:image: https://api.daily.dev/og/posts/5Gxn2FDz7.png
og:image:alt: Jon Skeet's coding blog
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Jon Skeet's coding blog

**[Jon Skeet's coding blog](https://daily.dev/sources/jonskeet)** · 14 min read · 0 upvotes · 0 comments

## Summary

A detailed walkthrough of how a personal UK election-tracking site stores its data, comparing Firestore and local JSON file storage. Covers the tradeoffs between storing data directly, using separate storage classes, or serializing core models directly, settling on a middle-ground approach using immutable C# records paired with dedicated storage classes. Explains a manifest-based Firestore design using content-hashed documents to achieve cheap, consistent, and efficient reads given that most election data changes rarely, plus a cross-referencing scheme using ICoreModel/INonCoreModel interfaces to rebuild object graphs efficiently when only part of the context changes.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://codeblog.jonskeet.uk/2025/03/27/election-2029-storage>

## Questions this post answers

### How can I avoid re-reading unchanged documents from Firestore when reloading an updated dataset?

Use a manifest document that lists content-hashed document names for each collection in the context. When loading a new context, compare the new manifest's document references against the old one: if a reference is unchanged, reuse the already-loaded data instead of re-fetching it from Firestore, only deserializing documents that are actually new.

_Developers optimizing Firestore read costs can find architecture writeups like this through daily.dev._

### What is the maximum document size limit in Google Cloud Firestore?

Each Firestore document, not including documents in nested collections, has a maximum size of about 1MB. This limit shapes how data should be chunked: storing an entire dataset in a single document isn't viable, so large or growing collections (like per-event projection sets) are better split into one document per item to stay safely under the cap.

_Anyone sizing Firestore schemas against storage limits can keep up with practical guidance via daily.dev._

## Similar posts on daily.dev

- [Firestore Data Modeling Guide: Embedded Documents vs Referencing \(with a Blog Case Study\)](https://daily.dev/posts/firestore-data-modeling-guide-embedded-documents-vs-referencing-with-a-blog-case-study--xstrcq8u3) · freeCodeCamp · 1 upvotes · 0 comments
- [The Architecture Of Local-First Web Development — Smashing Magazine](https://daily.dev/posts/the-architecture-of-local-first-web-development-smashing-magazine-fi6dhffcw) · Smashing Magazine · 6 upvotes · 1 comments
- [How Firestore Structures Data and How to Perform CRUD Operations With It](https://daily.dev/posts/how-firestore-structures-data-and-how-to-perform-crud-operations-with-it-odioykply) · freeCodeCamp · 1 upvotes · 0 comments
- [Modernizing document storage for search, scale, and agility](https://daily.dev/posts/modernizing-document-storage-for-search-scale-and-agility-poe5wgnx7) · AWS Database Blog · 0 upvotes · 0 comments
- [Architecture Decisions Behind Building a Simple Personal Software Tool](https://daily.dev/posts/architecture-decisions-behind-building-a-simple-personal-software-tool-piwlyezw4) · DEV · 75 upvotes · 3 comments

---

Tags: [#c#](https://daily.dev/tags/c#), [#firestore](https://daily.dev/tags/firestore)

[View this post on daily.dev](https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Jon Skeet's coding blog","url":"https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7"},"datePublished":"2026-10-04T13:06:49.898Z","dateModified":"2026-10-04T13:15:17.828Z","description":"A detailed walkthrough of how a personal UK election-tracking site stores its data, comparing Firestore and local JSON file storage. Covers the tradeoffs...","image":"https://media.daily.dev/image/upload/s--VDukGCjf--/f_auto/v1722860399/public/Placeholder%2002","thumbnailUrl":"https://media.daily.dev/image/upload/s--VDukGCjf--/f_auto/v1722860399/public/Placeholder%2002","isAccessibleForFree":true,"articleSection":"Jon Skeet's coding blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Jon Skeet's coding blog","logo":"https://media.daily.dev/image/upload/s--B4KVP-_K--/f_auto,q_auto/v1791119047/logos/jonskeet?_a=BAMAMicg0","url":"https://daily.dev/sources/jonskeet"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"c#,firestore","timeRequired":"PT14M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Jon Skeet's coding blog","item":"https://daily.dev/sources/jonskeet"},{"@type":"ListItem","position":3,"name":"Jon Skeet's coding blog"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/jon-skeet-s-coding-blog-5gxn2fdz7#faq","mainEntity":[{"@type":"Question","name":"How can I avoid re-reading unchanged documents from Firestore when reloading an updated dataset?","acceptedAnswer":{"@type":"Answer","text":"Use a manifest document that lists content-hashed document names for each collection in the context. When loading a new context, compare the new manifest's document references against the old one: if a reference is unchanged, reuse the already-loaded data instead of re-fetching it from Firestore, only deserializing documents that are actually new. Developers optimizing Firestore read costs can find architecture writeups like this through daily.dev."}},{"@type":"Question","name":"What is the maximum document size limit in Google Cloud Firestore?","acceptedAnswer":{"@type":"Answer","text":"Each Firestore document, not including documents in nested collections, has a maximum size of about 1MB. This limit shapes how data should be chunked: storing an entire dataset in a single document isn't viable, so large or growing collections (like per-event projection sets) are better split into one document per item to stay safely under the cap. Anyone sizing Firestore schemas against storage limits can keep up with practical guidance via daily.dev."}}]}
```

