Searchable commodity selection
There are more than 160 commodities, so a long dropdown made selection slow. I added a searchable selector so users can find a commodity directly.
Full-stack web application
Deployed Web Application
I built PricePulse PH as a full-stack commodity price monitoring dashboard. It turns Philippine commodity price data into interactive trends, location comparisons, and market insights. It also includes multi-location comparisons, estimated household basket costs, shareable views, CSV export, and clearer data transparency.
Technology stack
Raw commodity datasets contain useful information, but people should not have to work through rows of records to answer simple questions. I wanted users to see the latest price, whether it increased or decreased, how it changed over time, how locations compare, and whether the current value is high or low compared with past observations.
I turned the dataset into an interactive dashboard built around context. Searchable commodity and location selectors give users a focused view of price movement and market comparisons.
Use the previous and next buttons, left and right arrow keys, or swipe or drag horizontally to browse. Home and End jump to the first and last screen. Select the image to enlarge it.
Historical monthly price trends for a selected commodity, location, and reporting range.
User
Explore prices
Next.js
Application on Vercel
Route Handlers
Next.js / Node.js
Prisma ORM
Structured queries
PostgreSQL
Prisma Postgres
Raw PSA Data
Source records
Cleaning
Prepare records
Normalization
Consistent structure
Validation
Check prepared data
PostgreSQL Import
Store prepared data
Application Queries
Read for analytics
Next.js handles both the frontend and backend. Route Handlers and server-side logic run on Node.js, with Prisma ORM querying PostgreSQL. Vercel hosts the application, and Prisma Postgres provides the production database.
There are more than 160 commodities, so a long dropdown made selection slow. I added a searchable selector so users can find a commodity directly.
I store cleaned records in PostgreSQL instead of parsing the source dataset on every dashboard load. This separates data preparation from application usage and supports structured queries through Prisma. Database records also provide available dates and coverage counts, so the displayed metadata stays aligned with the stored data.
I added server-side calculations for the latest available price, the previous observation, peso and percentage changes, the average across available locations, location ranking, and the current value's position within the historical minimum–maximum range.
I structured the experience to move from a summary to a visualization and then to the exact observations. Charts make patterns easier to see, while a detailed table shows the records behind them. CSV export uses the observations behind the main chart so users can continue their analysis outside PricePulse.
I preserve gaps in multi-location charts when observations are unavailable; missing values are never interpolated or fabricated. For a basket, each item cost is its recorded commodity price multiplied by the selected quantity. I sum these costs only when every required price is available. Otherwise, the total is withheld and the interface identifies the missing data instead of showing a partial estimate as complete.
Main dashboard filters are encoded in the URL so users can share and reopen an analysis with the same selections. This makes the view reproducible without requiring saved dashboards or user accounts.
I refined the interface to put useful information first. It starts with the user's question, establishes the current price context, and then opens up comparisons and supporting detail.
The “Try an Example” action selects a commodity and location with existing observations. This gives first-time visitors a useful starting view.
Empty and invalid states explain unavailable observations, the absence of a common reporting period, invalid date ranges, and missing required basket prices. I treat missing data as a valid condition in the dataset, not automatically as an application error.
I cleaned, normalized, validated, and imported the raw records before using them for analytics.
More than 160 options made a basic dropdown inconvenient. I added a searchable selector without making the filtering workflow more complicated.
Showing prices was straightforward. Choosing calculations that help users interpret them required backend logic for price movement, location comparisons, and historical context.
The application worked locally but initially failed during the Vercel build because Prisma Client had not been generated. I corrected the build sequence so it generates the client before the Next.js production build.
prisma generate && next buildI configured database environment variables in Vercel so the deployed server-side application could connect securely to PostgreSQL. Production traffic uses the pooled Prisma Postgres connection.
Building PricePulse connected the full application lifecycle: preparing and validating data, modeling it in PostgreSQL, querying it through Prisma, and writing Next.js Route Handlers and analytics logic on Node.js. Reliable data preparation and clear calculations became the foundation for the interface.
On the frontend, React, Next.js, TypeScript, and Tailwind CSS supported a responsive dashboard where visualization and UX refinement worked together. Git and GitHub supported incremental development, code organization, and debugging throughout the project.
Deploying to Vercel extended the work beyond local development. Production builds, Prisma Client generation, environment variables, database connectivity, and connection management all needed attention to bring the application online.
The latest work added experience in multi-series visualization, multi-item calculation logic, and data-completeness validation. Deriving metadata from database records, managing filter state through URLs, generating CSV exports, and explaining edge cases strengthened the connection between reliable calculations and understandable results.