Full-stack student project

Organize.
Compare.
Stay ahead.

Competitor Research & Comparison Platform
A focused web app for keeping competitors, products, pricing, notes, and research sources together instead of scattered across different places.

Built with Node.jsSQLite databaseServer-rendered UI
less searching
more comparing ✦
research, but tidy.
competitoros / dashboardSG
Good afternoon

Market overview

Competitors12↗ 3 this month
Products38Across 12 companies
Price records74Historical values
Price movementLast 6 records
JanFebMarAprMay
Recent researchView all
Company APricing note
$100
Company BProduct update
$125
Company CFeature research
$89
Compare competitors side by sideCompany ACompany BCompany C→
one place for
the messy stuff ↘
Why I built it

Research was getting messy.

Competitor information can live in spreadsheets, bookmarks, notes and documents. I wanted one simple place where those pieces could actually connect.

BEFORE

Information everywhere.

📊Prices
🔖Websites
📝Notes
📄Research
→
AFTER

CompetitorOS

Competitors, products, prices and notes — connected in one system.

What you can do

Simple features.
Useful together.

Every feature supports the same goal: turn scattered research into structured information that is easy to find and compare.

01
◎

Add competitors

Save company details, websites and industry information.

02
◇

Track products

Store products, categories, features and current prices.

03
$

Keep price history

Record older prices instead of losing useful context.

04
✎

Research notes

Attach notes and source links to the right competitor.

05
⌕

Search & compare

Find records quickly and compare competitors side by side.

06
↓

CSV export

Take structured research data into a spreadsheet.

01 / REQUEST FLOW

What happens after a click?

01BrowserUser action
→
02ExpressRoute
→
03Node.jsLogic
→
04SQLQuery
→
05SQLiteData
Database → Node.js → Handlebars → HTML → Browser
Database at a glance

Clear tables.
Clear relationships.

The project uses relational data so records can connect naturally — users own competitors, competitors have products, and products can have price history.

01

users

id · name · email

password_hash

02

competitors

id · user_id

name · website · industry

03

products

id · competitor_id

name · price

04

price_history

id · product_id

price · recorded_at

RELATIONSHIP

One record can lead to another.

IDs connect the tables, making it possible to fetch related information without storing everything in one huge table.

users → competitors → products → price_history
A small piece of the backend

Readable code
doing a real job.

The route gets competitor records from SQLite and passes them to the Handlebars view.

HTMLCSSJavaScriptNode.jsExpress.jsHandlebarsSQLiteSQLbcryptexpress-sessionGitGitHub
// Get the competitors for the page
app.get('/competitors', (req, res) => {
  db.all(
    'SELECT * FROM competitors',
    (err, rows) => {
      res.render('competitors', {
        competitors: rows
      });
    }
  );
});
Build journey

Built one useful piece
at a time.

The project grows from the data model outward: store the information first, then make it searchable, comparable and exportable.

01

Research

Plan the information the app needs.

02

Competitors

Create and manage the main records.

03

Products

Connect products to competitors.

04

Compare

Turn stored data into useful views.

05

Export

Make the research portable as CSV.

PROJECT STRUCTURE

Simple names. Easy to navigate.

app.jsdatabase/database.jsroutes/auth.jsroutes/competitors.jsroutes/products.jsviews/home.handlebarsviews/login.handlebarsviews/register.handlebarsviews/dashboard.handlebarsviews/competitors.handlebarspublic/css/style.csspublic/js/main.js