Harshit Sharma
All work

Web AppQ4 2020Solo build

Techkart

A high-end storefront for tech products, front to back.

The Techkart storefront — iPhone and HTC product cards with rupee prices under a sticky category nav.

The build

The oldest thing on this site, and the only one with no backend at all.

Problem

Comparing phones and laptops means opening six product pages and holding the specs in your head. The comparison is the actual task, and no storefront is built around it — they're built around checkout.

Constraints

  • No backend, no budget, no framework. This was built before I knew Node. Everything had to run in the browser from static files.
  • No inventory, no payments. Without a supplier relationship there is no order to fulfil, so the product had to stop somewhere honest.
  • Static hosting only. Netlify, pushed from git.

Approach

A product catalogue in a JavaScript array, rendered into a grid, with filtering and comparison done entirely client-side. The purchase itself hands off to Amazon — the site's job ends at "you've decided", which is the part it can actually do well.

js
// The whole data layer. No API, no database — the catalogue ships with the page.
const products = [
  { id: 1, name: "…", price: 15999, specs: { ram: "6GB", storage: "128GB" } },
  // …
];

const visible = products
  .filter(p => p.price <= maxPrice)
  .sort((a, b) => a.price - b.price);

Tradeoffs

  • Catalogue in the bundle over a data source. Zero infrastructure and instant filtering, paid for with a rebuild for every price change and a page weight that grows with the catalogue.
  • Affiliate handoff over real checkout. Honest about what the site could deliver, and it means the product stops one step before the thing that makes storefronts interesting.
  • Bootstrap over custom CSS. Got a responsive grid working in an evening. It also means the site looks like 2020, which — given the date on it — is at least consistent.

Outcome

It shipped and it's still up, four years later, because static files on a CDN don't rot. Its real value now is as a baseline: it's the last thing I built before learning what a server was for, and the difference between it and everything above is the whole story of the two years after.

Decisions

  • Vanilla JavaScript over a framework. Chosen because I didn't know one yet — but I'd defend it now for a page this size. Against it: the rendering code is hand-rolled DOM manipulation that a framework would have made shorter and safer.
  • Static hosting over a server. Chosen because there was nothing to compute per-user. Against it: no analytics, no search, no personalisation — and no way to add them without rebuilding the foundation.
  • Handing checkout to Amazon. Chosen because a fake cart would have been a lie in the demo. Against it: everything downstream of the click — the part with the money in it — is somebody else's product.

Stack

  • HTML5
  • CSS
  • JavaScript
  • Bootstrap
  • The Lecture Lense workspace — a lecture playing above a chaptered time rail, the corrected transcript on the left, and a chat answer on the right with a timestamp citation.

    Lecture Lense

    Turns any recording into searchable, timestamp-cited notes.

  • Chitter's landing page — headline, a Join Chitter Now button, and a phone mockup of the feed.

    Chitter

    A mini social app that lets users sign up, log in and post whatever is on their mind.

  • A live Heckfree profile — avatar and the handle meharshit above seven stacked link rows, on a peach-to-purple gradient.

    Heckfree

    Users get a public profile that showcases all of their links in one place.

esc

Pages

Home/
Work/work
Blog/blog
About/about
Uses/uses
Contact/contact
Bucket list/bucket-list
Guestbook/guestbook
Résumé/resume
Privacy/privacy
Terms/terms

Projects

Lecture LenseQ3 2026
ChitterQ1 2023
HeckfreeQ3 2022
CoscholarsQ3 2022
JsswireQ2 2022
JssconnectQ1 2022
QuizTownQ4 2021
IplheatQ2 2021
TechkartQ4 2020

Posts

Passport.js auth patterns I keep reaching for7 min read
How To Create A README For GitHub Profile3 min read
↑↓ navigate↵ openesc close