Projects / GE Tracker

GE Tracker

COMPLETE

Project Summary

A website built using Django that offers portfolio management, market analysis, alerts, and research tools centered around Old School RuneScape, which has nearly 150,000 monthly players and is a 13 year old game still recieving updates. The website research and alert tools are built upon foundations in technical analysis and custom filtering. Discord and in game integration is planned.

Architecture Overview

  • Hybrid Django architecture: Used server-rendered Django templates for page structure and authentication, supported by focused JSON endpoints for interactive tables, charts, filtering, and progressive loading. This provides a responsive interface without the complexity of maintaining a separate frontend application.
  • Locally persisted market data: Decoupled analytics from the external OSRS Wiki API by storing 5-minute, 1-hour, 6-hour, 24-hour, and all-time market snapshots locally. Current prices use shared caching with a stale-data fallback, reducing latency and preserving basic functionality during upstream failures.
  • Idempotent data ingestion: Designed background ingestion jobs with request timeouts, payload validation, transactional bulk inserts, unique item-and-timestamp constraints, and query-specific indexes. Jobs can be safely rerun without creating duplicate market records.
  • Replayable portfolio calculations: Stored individual purchases and sales as the source of truth, then rebuilt each position chronologically to calculate quantity held, average cost, and realized and unrealized profit. This keeps calculations correct when transactions are edited, deleted, or entered out of order.
  • Background alert evaluation: Moved market monitoring outside the HTTP request lifecycle. A configurable rule engine evaluates spread, spike, sustained-move, threshold, collective-move, confidence, and dump alerts while sharing price and volume data across each evaluation cycle.

Screenshots

Use the arrows to browse, then select a screenshot to enlarge it.