upstream-edge lets you read and write wells, production,
forecasts, and economic assumptions directly from your Obsidian .obsdb files.
pip install upstream-edge
from upstream_edge.obsidian_db import Database, RsvCat
with Database.open("reserves.obsdb") as db:
# Cumulative oil for every producing well — no SQL required.
pdp_wells = [w for w in db.wells() if w.rsv_cat is RsvCat.PDP]
for w in pdp_wells:
monthly = db.production_monthly(w.prop_id)
cum_oil = sum(m.oil_bbl for m in monthly)
print(f"{w.prop_id} {w.well_name}: {cum_oil:,.0f} bbl")
Add, update, delete, and query wells.
Import and export monthly and daily production records.
Export or build multi-segment Arps decline curves programmatically.
Define prices, expenses, and other economic assumptions.
Organize model assignments by named scenarios.
Manage surveys, reservoirs, completions, and perforations.
Add user-defined text, numeric, and date columns to wells.
Optional [pandas] extra adds a _df variant to every reader.
Build an Arps decline forecast
from datetime import date
from upstream_edge.obsidian_db import Database, ForecastSegment, Phase
with Database.open("reserves.obsdb") as db:
with db.transaction():
db.set_forecast("PROP_001", model="BASE", phase=Phase.OIL, segments=[
ForecastSegment(start=date(2026, 6, 1), rate_init=450.0,
decline_init=0.65, b_factor=1.1, decline_min=0.06),
])
Batch-update a price deck
from datetime import date
from upstream_edge.obsidian_db import Database, PriceModelSegment
with Database.open("reserves.obsdb") as db:
with db.transaction():
db.set_price_model("STRIP_2026", [
PriceModelSegment(date(2026, 1, 1), oil=72.50, gas=3.40, ngl=24.10),
PriceModelSegment(date(2027, 1, 1), oil=70.00, gas=3.20, ngl=23.00),
])
Reservoir and production engineers, data analysts, and developers who need programmatic access to reserve and production data—teams integrating into broader pipelines, and anyone using AI coding assistants to automate data operations with their Obsidian files.
Don't have Obsidian yet?
See the product →