Skip to content
ActiveDeveloper and designer

ProRemo

Trilingual website and operations system for ProRemo, Norwegian distributor of Nastec pumps: product catalogue, CRM, block-based CMS and in-house, privacy-friendly web analytics.

Screenshot from ProRemo
Next.js 16React 19TypeScriptTailwind CSS 4PrismaPostgreSQL 18Supabase StorageVitestrrwebDockerCoolifyHetzner

ProRemo is the Norwegian distributor of Nastec's variable-speed pump drives, solar-powered pumps and monitoring solutions, with customers ranging from agriculture to municipalities. Their website was a static design prototype. I rebuilt it into a full production platform: a trilingual public site in Norwegian, English and Italian with a product catalogue, industry pages and a savings calculator, and an admin panel behind login where the business is run from.

The admin panel

  • CRM with leads, contacts, companies and pipeline as a card board, with an activity feed on every entity and conversion from lead to contact
  • Block-based CMS with language tabs for Norwegian, English and Italian, a revision snapshot on every save and scheduled publishing
  • Product catalogue with image and document manager and a traffic graph per product
  • Media library, author profiles and user management with roles
  • Dedicated analytics section: traffic, conversion funnel, click heatmap, Core Web Vitals, JS error log and GDPR deletion per visitor

The technical side

Sync against the manufacturer. Product data is fetched from Nastec's website through a dedicated sync pipeline with a serialized queue, polite rate limiting, exponential backoff and idempotent downloads based on content hash. The source has no stable IDs, so editorial curation has to survive a re-sync: sections are referenced by normalized heading plus text prefix and matched in multiple passes, fail-open, with a warning per product when a reference loses its match.

In-house web analytics instead of a third-party tracker. Raw IP is never stored, the identifier is a hash with a daily rotating salt, and the IP is anonymized before lookup. Without consent, only anonymous page views are written. Do Not Track and Global Privacy Control are respected, and deleting a visitor runs as a single transaction.

Custom i18n without a library. Identical key sets per language, hreflang with x-default, and translations laid as an overlay on the Norwegian block structure via shared block IDs. Change the structure in Norwegian, and English and Italian follow.

Hand-written auth, server actions instead of a REST layer, and an interface written from scratch with hand-drawn SVG icons.

Stack

Next.js 16, React 19 and TypeScript, Tailwind CSS 4, Prisma against PostgreSQL 18, Supabase Storage for files, Vitest for tests, and Docker on Coolify and Hetzner.

This text is machine translated and has not been reviewed yet.