<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: dumije</title>
    <description>The latest articles on DEV Community by dumije (@dumije).</description>
    <link>https://dev.to/dumije</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3827333%2Fdc8ad13b-c793-4f12-8176-102d57ce778d.png</url>
      <title>DEV Community: dumije</title>
      <link>https://dev.to/dumije</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dumije"/>
    <language>en</language>
    <item>
      <title>Every Time You UPDATE a Row, You're Deleting History</title>
      <dc:creator>dumije</dc:creator>
      <pubDate>Tue, 07 Apr 2026 10:37:50 +0000</pubDate>
      <link>https://dev.to/dumije/every-time-you-update-a-row-youre-deleting-history-2d7e</link>
      <guid>https://dev.to/dumije/every-time-you-update-a-row-youre-deleting-history-2d7e</guid>
      <description>&lt;p&gt;The Problem That Wouldn't Go Away Early in a project I was working on, a customer filed a billing dispute. Simple enough, except when we went to check what subscription plan they were on at the time of the charge, we couldn't tell. Our database only stored the current state. The plan had been upgraded twice since then. The old values were gone. We weren't doing anything unusual. We had created_at and updated_at columns like every other project. But those tell you when a row changed, not what it looked like before it changed. That moment stuck with me. And I kept running into variations of it:&lt;/p&gt;

&lt;p&gt;"What was the price of this product on Black Friday last year?" "What were this employee's permissions when that action was taken?" "What did this contract say before it was amended?"&lt;/p&gt;

&lt;p&gt;The answer was always the same: we don't know.&lt;/p&gt;

&lt;p&gt;Why The Standard Fixes Are Painful Most teams handle this one of three ways, and none of them are great. The audit log table a separate table that records every change as an event. Works for compliance but horrible to query. Reconstructing state at a point in time means replaying a sequence of events, which is complex and slow. Soft deletes with versioning, adding is_current, version, superseded_at columns to your main table. Gets messy fast, pollutes your queries, and every developer on the team implements it slightly differently. Just accepting the loss, the most common approach. You tell yourself you'll fix it later. You never do. What all three approaches lack is a clean, queryable model for time itself.&lt;/p&gt;

&lt;p&gt;Bitemporal Modeling... The Right Mental Model There's a well-established concept in database theory called bitemporal modeling. It tracks two independent time axes for every record:&lt;/p&gt;

&lt;p&gt;Valid time, when the fact was true in the real world Transaction time, when you recorded it in the database&lt;/p&gt;

&lt;p&gt;Most audit systems only track transaction time. Chrono-temporal tracks both, which means you can answer questions like "what did we know on January 1st about what was true last July?" which matters enormously for compliance, retroactive corrections, and debugging. The core idea is simple: instead of mutating records in place, you store versioned snapshots with time ranges:&lt;/p&gt;

&lt;p&gt;Core IdeaInstead of mutating records:&lt;br&gt;
You store versioned snapshots with time ranges.&lt;/p&gt;

&lt;p&gt;entity_type  entity_id  valid_from   valid_to    data&lt;br&gt;
user         user_001   2024-01-01   2024-06-01 {"plan":"free"}&lt;br&gt;
user         user_001   2024-06-01   NULL        {"plan":"pro"}&lt;/p&gt;

&lt;p&gt;valid_to = NULL → current record&lt;/p&gt;

&lt;p&gt;Updates = close current record + insert new version&lt;/p&gt;

&lt;p&gt;Old data is never destroyed&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building chrono-temporal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chrono Temporal is a temporal data layer for PostgreSQL that allows you to query your data at any point in time, track changes, and compute diffs.&lt;/p&gt;

&lt;p&gt;I decided to build this as a reusable Python library rather than solving it again from scratch on every project. The goals were:&lt;/p&gt;

&lt;p&gt;Drop into any existing PostgreSQL project with no architectural changes&lt;/p&gt;

&lt;p&gt;Clean async Python API built on SQLAlchemy 2.0&lt;/p&gt;

&lt;p&gt;Support time-travel queries, full history, and diffing out of the box&lt;/p&gt;

&lt;p&gt;Ship as a proper PyPI package&lt;/p&gt;

&lt;p&gt;pip install chrono-temporal&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Core Model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything is stored in a single temporal_records table:&lt;/p&gt;

&lt;p&gt;class TemporalRecord(Base):&lt;br&gt;
    &lt;strong&gt;tablename&lt;/strong&gt; = "temporal_records"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id = Column(Integer, primary_key=True)
entity_type = Column(String(100), nullable=False)  # e.g. "user", "product"
entity_id = Column(String(255), nullable=False)    # your entity's ID
valid_from = Column(DateTime(timezone=True), nullable=False)
valid_to = Column(DateTime(timezone=True), nullable=True)  # NULL = currently active
data = Column(JSON, nullable=False)                # the full payload
notes = Column(Text, nullable=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The entity_type + entity_id combination identifies your entity. The data field is a JSON payload, fully flexible, works with any entity in your system without schema changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Service API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The TemporalService class wraps all the temporal query logic:&lt;/p&gt;

&lt;p&gt;from chrono_temporal import TemporalService, TemporalRecordCreate&lt;/p&gt;

&lt;p&gt;svc = TemporalService(session)&lt;/p&gt;

&lt;h1&gt;
  
  
  Create a versioned record
&lt;/h1&gt;

&lt;p&gt;await svc.create(TemporalRecordCreate(&lt;br&gt;
    entity_type="user",&lt;br&gt;
    entity_id="user_001",&lt;br&gt;
    valid_from=datetime(2024, 1, 1, tzinfo=timezone.utc),&lt;br&gt;
    data={"name": "Daniel", "plan": "free", "email": "&lt;a href="mailto:daniel@example.com"&gt;daniel@example.com&lt;/a&gt;"}&lt;br&gt;
))&lt;/p&gt;

&lt;h1&gt;
  
  
  Time-travel query — what did this look like in March 2024?
&lt;/h1&gt;

&lt;p&gt;records = await svc.get_at_point_in_time(&lt;br&gt;
    "user", "user_001",&lt;br&gt;
    datetime(2024, 3, 1, tzinfo=timezone.utc)&lt;br&gt;
)&lt;/p&gt;

&lt;h1&gt;
  
  
  Full history — every version ever
&lt;/h1&gt;

&lt;p&gt;history = await svc.get_history("user", "user_001")&lt;/p&gt;

&lt;h1&gt;
  
  
  Diff — what changed between two dates?
&lt;/h1&gt;

&lt;p&gt;diff = await svc.get_diff(&lt;br&gt;
    "user", "user_001",&lt;br&gt;
    datetime(2024, 1, 1, tzinfo=timezone.utc),&lt;br&gt;
    datetime(2025, 7, 1, tzinfo=timezone.utc),&lt;br&gt;
)&lt;br&gt;
print(diff["changed"])   # {"plan": {"from": "free", "to": "pro"}}&lt;br&gt;
print(diff["unchanged"]) # ["name", "email"]&lt;/p&gt;

&lt;p&gt;A Real Example — Product Price History&lt;br&gt;
To show how this composes with real business logic, here's a complete price history service built on top of chrono-temporal:&lt;/p&gt;

&lt;p&gt;from chrono_temporal import TemporalService, TemporalRecordCreate&lt;br&gt;
from datetime import datetime, timezone&lt;br&gt;
from typing import Optional&lt;br&gt;
import uuid&lt;/p&gt;

&lt;p&gt;ENTITY_TYPE = "product"&lt;/p&gt;

&lt;p&gt;class PriceHistoryService:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, db):&lt;br&gt;
        self.temporal = TemporalService(db)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async def create_product(self, name, category, price, currency="USD"):
    """Add a new product with its initial price."""
    record = await self.temporal.create(
        TemporalRecordCreate(
            entity_type=ENTITY_TYPE,
            entity_id=f"prod_{uuid.uuid4().hex[:8]}",
            valid_from=datetime.now(timezone.utc),
            data={
                "name": name,
                "category": category,
                "price": price,
                "currency": currency,
            },
        )
    )
    return record

async def update_price(self, product_id, new_price, effective_from=None, reason=None):
    """Update price — closes current record and creates new version."""
    effective_from = effective_from or datetime.now(timezone.utc)

    current = (await self.temporal.get_current(ENTITY_TYPE, product_id))[0]
    await self.temporal.close_record(current.id, effective_from)

    return await self.temporal.create(
        TemporalRecordCreate(
            entity_type=ENTITY_TYPE,
            entity_id=product_id,
            valid_from=effective_from,
            data={**current.data, "price": new_price},
            notes=reason or f"Price changed from {current.data['price']} to {new_price}",
        )
    )

async def get_price_at(self, product_id, as_of):
    """What was the price on a specific date?"""
    records = await self.temporal.get_at_point_in_time(
        ENTITY_TYPE, product_id, as_of
    )
    return records[0] if records else None

async def get_lowest_price_ever(self, product_id):
    """The lowest price this product has ever had."""
    records = await self.temporal.get_history(ENTITY_TYPE, product_id)
    return min(records, key=lambda r: r.data["price"]) if records else None
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The REST API Layer&lt;br&gt;
The library also ships with a FastAPI layer if you want a ready-made service rather than embedding the library directly:&lt;/p&gt;

&lt;p&gt;bash&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/Daniel7303/chrono-temporal" rel="noopener noreferrer"&gt;https://github.com/Daniel7303/chrono-temporal&lt;/a&gt;&lt;br&gt;
docker-compose up --build&lt;/p&gt;

&lt;p&gt;That gives you a running API at &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt; with Swagger docs, API key authentication, and all endpoints ready to use:&lt;/p&gt;

&lt;p&gt;Method  Endpoint    Description&lt;br&gt;
POST    /api/v1/temporal/   Create a record&lt;br&gt;
GET /api/v1/temporal/entity/{type}/{id}/current Current state&lt;br&gt;
GET /api/v1/temporal/entity/{type}/{id}/history Full history&lt;br&gt;
GET /api/v1/temporal/entity/{type}/{id}/as-of   Time-travel query&lt;br&gt;
GET /api/v1/temporal/entity/{type}/{id}/diff    Diff two dates&lt;br&gt;
PATCH   /api/v1/temporal/{id}/close Close a record&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where This Is Useful&lt;/strong&gt;&lt;br&gt;
The pattern applies anywhere your data has a meaningful history:&lt;/p&gt;

&lt;p&gt;Subscription billing — what plan was active during a disputed charge?&lt;/p&gt;

&lt;p&gt;E-commerce pricing — full price history, lowest/highest ever, Black Friday comparisons&lt;/p&gt;

&lt;p&gt;HR systems — salary history, role changes, department transfers&lt;/p&gt;

&lt;p&gt;Contracts and legal — every amendment, what the terms said at signing&lt;/p&gt;

&lt;p&gt;Inventory — stock levels at any point in time&lt;/p&gt;

&lt;p&gt;Compliance — immutable audit trail, regulatorily defensible&lt;/p&gt;

&lt;p&gt;Feature flags — what flags were active when this bug occurred?&lt;/p&gt;

&lt;p&gt;Basically anywhere you've ever said "we should have kept the old value" — this is the systematic fix.&lt;/p&gt;

&lt;p&gt;What's Different From Other Approaches&lt;br&gt;
vs. event sourcing — Event sourcing stores events and derives state by replaying them. chrono-temporal stores snapshots directly, which makes point-in-time queries trivial and doesn't require a replay engine.&lt;/p&gt;

&lt;p&gt;vs. temporal tables (PostgreSQL extension) — temporal_tables handles transaction time automatically at the database level, but querying it from Python is verbose. chrono-temporal gives you a clean Python API and handles both valid time and transaction time explicitly.&lt;/p&gt;

&lt;p&gt;vs. Dolt / other temporal databases — Those require replacing your database entirely. chrono-temporal works on your existing PostgreSQL instance with one new table.&lt;/p&gt;

&lt;p&gt;vs. rolling your own — You could build this yourself. Most teams do, once, inconsistently, with subtle bugs in the boundary conditions. chrono-temporal has a full test suite covering edge cases like exact boundary queries, overlapping records, and empty-state handling.&lt;/p&gt;

&lt;p&gt;Current State and Roadmap&lt;br&gt;
The library is 19 days old and on PyPI. The roadmap includes:&lt;/p&gt;

&lt;p&gt;Django ORM support&lt;/p&gt;

&lt;p&gt;Timeline summary endpoint&lt;/p&gt;

&lt;p&gt;Hosted cloud version for teams that don't want to manage the infrastructure&lt;/p&gt;

&lt;p&gt;pip install chrono-temporal&lt;/p&gt;

&lt;p&gt;GitHub: github.com/Daniel7303/chrono-temporal-api-framework&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://chrono-temporal-ap.onrender.com/docs#/" rel="noopener noreferrer"&gt;https://chrono-temporal-ap.onrender.com/docs#/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pypi: &lt;a href="https://pypi.org/project/chrono-temporal/" rel="noopener noreferrer"&gt;https://pypi.org/project/chrono-temporal/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're dealing with any of the use cases above I'd genuinely love to hear how it fits or doesn't fit your situation. And if you find a bug or edge case the test suite doesn't cover, open an issue.&lt;/p&gt;

&lt;p&gt;Built with Python 3.11, SQLAlchemy 2.0, asyncpg, Pydantic 2, FastAPI, PostgreSQL.&lt;/p&gt;

&lt;h1&gt;
  
  
  python #fastapi #postgresql #databases #backend #opensource #build-in-public #time-travel
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>I Got Tired of Losing Data History, So I Built a Python Library to Fix It. Meet Chrono Temporal (chrono-temporal)</title>
      <dc:creator>dumije</dc:creator>
      <pubDate>Mon, 30 Mar 2026 11:16:38 +0000</pubDate>
      <link>https://dev.to/dumije/i-got-tired-of-losing-data-history-so-i-built-a-python-library-to-fix-it-meet-chrono-temporal-4ge6</link>
      <guid>https://dev.to/dumije/i-got-tired-of-losing-data-history-so-i-built-a-python-library-to-fix-it-meet-chrono-temporal-4ge6</guid>
      <description>&lt;p&gt;What is Chrono Temporal (chrono-temporal)? A Practical Approach to Time-Travel Queries in PostgreSQL&lt;/p&gt;

&lt;p&gt;Most applications treat data as a single, current state.&lt;br&gt;
A user has one profile. A product has one price. A record gets updated… and the previous state is gone.&lt;br&gt;
But in reality, data is not static, it evolves over time. And sometimes, the most important question is: What did this data look like before?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem with Traditional Data Models&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's say you update a product price:&lt;/p&gt;

&lt;p&gt;pythonproduct.price = 599&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Before the update:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;price = 999&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
After the update:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;price = 599&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
The previous value is gone. Now imagine trying to answer:

- What was the price on Black Friday?
- When exactly did this change happen?
- What else changed at the same time?

You'll typically need audit logs, history tables, triggers, or complex event sourcing setups. All of which add significant complexity to your codebase.

---

**Thinking in Timelines Instead of States**

Instead of storing only the *current state*, what if we store every state over time?

That means each change becomes part of a timeline:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jan 1  →  price = 999&lt;br&gt;&lt;br&gt;
Feb 1  →  price = 599&lt;br&gt;&lt;br&gt;
Mar 1  →  price = 799&lt;br&gt;
Now you can reconstruct past states, compare changes, and audit data naturally — without any extra infrastructure.&lt;/p&gt;

&lt;p&gt;Introducing Chrono Temporal (chrono-temporal)&lt;/p&gt;

&lt;p&gt;Chrono Temporal (chrono-temporal) is a Python library that adds time-travel queries to PostgreSQL. It allows you to query data at any point in history, track all historical changes, and compute diffs between any two states — all without rewriting your database architecture.&lt;br&gt;
bashpip install chrono-temporal&lt;/p&gt;

&lt;p&gt;Quick Start&lt;/p&gt;

&lt;p&gt;from chrono_temporal import TemporalService, TemporalRecordCreate, get_engine, get_session&lt;br&gt;
from datetime import datetime, timezone&lt;/p&gt;

&lt;p&gt;engine = get_engine("postgresql+asyncpg://user:pass@localhost/mydb")&lt;br&gt;
session_factory = get_session(engine)&lt;/p&gt;

&lt;p&gt;async with session_factory() as session:&lt;br&gt;
    svc = TemporalService(session)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Store a record
await svc.create(TemporalRecordCreate(
    entity_type="product",
    entity_id="prod_001",
    valid_from=datetime(2024, 1, 1, tzinfo=timezone.utc),
    data={"name": "iPhone 15 Pro", "price": 999}
))

# Query past state — what was the price on February 1st?
record = await svc.get_at_point_in_time(
    "product", "prod_001",
    datetime(2024, 2, 1, tzinfo=timezone.utc)
)
print(record[0].data)  # {"name": "iPhone 15 Pro", "price": 999}

# Get full price history
history = await svc.get_history("product", "prod_001")

# Compute diff — what changed between January and March?
diff = await svc.get_diff(
    "product", "prod_001",
    datetime(2024, 1, 1, tzinfo=timezone.utc),
    datetime(2024, 3, 1, tzinfo=timezone.utc),
)
print(diff)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Example Diff Output&lt;br&gt;
json{&lt;br&gt;
  "changed": {&lt;br&gt;
    "price": {&lt;br&gt;
      "from": 999,&lt;br&gt;
      "to": 599&lt;br&gt;
    }&lt;br&gt;
  },&lt;br&gt;
  "unchanged": ["name"],&lt;br&gt;
  "has_changes": true&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This makes it easy to understand what changed, not just that something changed.&lt;/p&gt;

&lt;p&gt;Why This Approach Matters&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Debugging Becomes Easier&lt;br&gt;
Instead of guessing what went wrong, you can inspect past states directly. No more "the data was correct before someone updated it and now we don't know what it was."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built-in Audit Trail&lt;br&gt;
Every change is naturally recorded as part of the timeline. SOX, GDPR, HIPAA — they all require audit trails. This gives you one for free.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better Data Integrity&lt;br&gt;
You never lose historical context when values change. Records are append-only — nothing ever gets deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cleaner Than Manual Solutions&lt;br&gt;
No need to maintain separate audit tables, write trigger functions per table, or build event sourcing infrastructure from scratch. One pip install and you're done.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Real Use Case: Product Price History&lt;br&gt;
I recently used chrono-temporal to build a product price tracking API, similar to how Amazon shows price history.&lt;/p&gt;

&lt;p&gt;Instead of storing just the latest price, each update becomes part of a timeline. The API exposes endpoints like:&lt;/p&gt;

&lt;p&gt;GET /products/{id}/as-of?as_of=2024-11-29 — price on Black Friday&lt;br&gt;
GET /products/{id}/history — full price timeline&lt;br&gt;
GET /products/{id}/lowest — cheapest price ever&lt;br&gt;
GET /products/{id}/diff — what changed between two dates&lt;/p&gt;

&lt;p&gt;Building this took about an hour using chrono-temporal as the data layer. Without it, I'd have needed custom audit tables, manual versioning logic, and bespoke query code for every endpoint.&lt;/p&gt;

&lt;p&gt;When Should You Use This?&lt;br&gt;
This approach is useful when:&lt;/p&gt;

&lt;p&gt;Data changes frequently, and historical context matters&lt;br&gt;
You need audit trails for compliance or debugging&lt;br&gt;
You want to answer "what did this look like at date X?" from your application code&lt;/p&gt;

&lt;p&gt;Examples include financial systems, SaaS subscription tracking, e-commerce pricing, contract versioning, HR and payroll systems, and feature flag history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works Under the Hood&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every entity is stored as a row in a temporal_records table with valid_from and valid_to timestamps. When a value changes, the old record is closed (valid_to is set) and a new record is created. Nothing is ever deleted. Time-travel queries filter by these timestamps to reconstruct state at any point in history.&lt;br&gt;
The entire thing runs on standard PostgreSQL — no extensions, no special setup.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;br&gt;
Most systems are designed around the idea of current state. But many real-world problems require understanding how data changes over time.&lt;br&gt;
Thinking in timelines instead of states can simplify debugging, auditing, and reasoning about your data. chrono-temporal is an early attempt at making this pattern as easy as a pip install in Python.&lt;/p&gt;

&lt;p&gt;Links&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Daniel7303/chrono-temporal" rel="noopener noreferrer"&gt;https://github.com/Daniel7303/chrono-temporal&lt;/a&gt;&lt;br&gt;
PyPI: &lt;a href="https://pypi.org/project/chrono-temporal" rel="noopener noreferrer"&gt;https://pypi.org/project/chrono-temporal&lt;/a&gt;&lt;br&gt;
Live API: &lt;a href="https://chrono-temporal-ap.onrender.com/docs#/" rel="noopener noreferrer"&gt;https://chrono-temporal-ap.onrender.com/docs#/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Question for the community&lt;/p&gt;

&lt;p&gt;How do you currently handle historical data in your systems? Audit tables, triggers, event sourcing or something else entirely? I'd love to hear what's working at scale.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>postgres</category>
      <category>python</category>
    </item>
    <item>
      <title>Track, query, diff, and rollback your data at any point in time. Would you like to see a Python library that does all that?</title>
      <dc:creator>dumije</dc:creator>
      <pubDate>Wed, 18 Mar 2026 12:31:41 +0000</pubDate>
      <link>https://dev.to/dumije/track-query-diff-and-rollback-your-data-at-any-point-in-time-would-you-like-to-see-a-python-2ji1</link>
      <guid>https://dev.to/dumije/track-query-diff-and-rollback-your-data-at-any-point-in-time-would-you-like-to-see-a-python-2ji1</guid>
      <description></description>
      <category>webdev</category>
      <category>programming</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
