Skip to content

Platform · Beta

Beta release

Info

Why MotoBerza.mk exists, what it solves and what changed in the latest release — all in one place.

Why MotoBerza.mk exists

A motorcycle is not a car. The classifieds built for it had to be different.

The platform is currently in public beta. We continuously add new features and refine existing ones based on your feedback.

Buying or selling a motorcycle in North Macedonia used to happen on general classifieds and in Facebook groups. A listing there is one photo and a couple of sentences: no year, no engine size, no drivetrain, no city. The buyer spends days in messages finding out what should have been visible at first glance, and the seller loses the same days answering the same questions.

A motorcycle has its own logic. The type — enduro, touring, sport, scooter — already says how it rides. Engine size and power say who it is for. The drivetrain (chain, belt, shaft) says what maintenance costs. When those details are fields instead of prose, search stops being luck and becomes a tool.

So we built a classifieds platform only for motorcycles, quads and riding gear: every listing is structure, every filter is real, every seller has a profile. Motorcycles are not just vehicles — they are weekends, craft and company. The platform should feel like it was built for exactly that, not like one more marketplace where bikes are simply another category.

What it solves

Anyone who has bought or sold a motorcycle here will recognise these four things.

01

Days lost in questions

Specifications are fields, not text: type, make, model, year, mileage, engine size, colour, drivetrain and city. What you are looking for arrives in a few clicks.

02

An unknown seller

The phone number is confirmed with an SMS code at sign-up, and shops carry a verified profile. You know who you are dealing with before you meet.

03

Gear that disappears

Helmets, jackets, boots and parts have their own subcategories. They no longer vanish between cars, furniture and white goods.

04

News, not just listings

Every day we pick stories from the international moto media, so you know what is launching and what it is worth before you start shopping.

What is new

Short and readable: what was added, what was improved and what was fixed in each release.

v0.9.0 → v0.1.0 · 9

v0.9.0 Latest

Public beta: the full catalogue for motorcycles, quads and gear, active shops, and the first public release of the platform.

+ Added

Catalogue

  • Three root categories: motorcycles, quads, and parts & gear.
  • Gear subcategories: helmets, jackets, gloves, boots, tyres, exhausts, brakes.
  • Vehicle titles are generated automatically: year · make · model · variant.
  • The variant is free text (Adventure, Rally Pro, Triple Black) with suggestions from active listings.

+ Added

Search and filters

  • Filters by type, make, model, price, year, mileage, engine size, colour, drivetrain, condition and city.
  • Searchable combobox for 160+ makes and up to 390 base models per make.
  • All 34 cities in North Macedonia, ordered by population.
  • Popular makes and models pinned to the top of lists, computed from active listings.

~ Changed

Interface

  • The gallery no longer crops photos: fixed frame, object-contain image.
  • Local draft while creating a listing — nothing is lost when the tab closes.
  • A price under 2 renders as "Price on request", without a currency line or a repeating badge.
  • Minimum type size 12px; headings carry no letter-spacing.

~ Changed

Infrastructure

  • Refreshed documentation and reorganised legal pages (terms, privacy, operator).
  • Sitemap index with four child maps and canonical rules for filtered pages.
v0.8.0

News: a daily selection from the international moto media, with categorisation, deduplication and admin review.

+ Added

News

  • Collection from four sources (RSS/Atom) through a stdlib Python script.
  • Weighted categorisation: model, sport, events, industry, gear, culture.
  • Daily schedule at 06:00 Europe/Skopje, plus a catch-up run after downtime.
  • Up to 3 published per day and at most 2 per category.
  • Dedupe by source_url; outbound links are noopener noreferrer nofollow.

+ Added

Administration

  • Manual review, publishing and rejection of items.
  • A "Fetch now" button for on-demand runs.
  • Per-item view counter.

! Fixed

Fixes

  • The ingest schema accepts null for guid, summary, imageUrl and author — the scraper emits explicit nulls.
v0.7.0

Support: the contact form grows into a ticket system with three surfaces (public, user, admin).

+ Added

Support

  • Every request gets an MB-xxxxx reference and a status of open / answered / closed.
  • A guest request is not linked to an account; a signed-in one appears under "My requests".
  • Admin inbox with an unread count and internal replies.
  • Honeypot field and a limit of 5 requests per hour per IP.
  • Opening a ticket marks the other side's messages as read.

! Fixed

Forms

  • Close and reopen are sibling forms, not nested — a nested form silently never submits.
v0.6.0

Phone verification with SMS OTP and full control over phone-number visibility.

+ Added

Verification

  • 6-digit code stored as an argon2 hash, 10-minute TTL, maximum 5 attempts.
  • Normalisation to E.164 (+3897XXXXXXXX): one number cannot open two accounts.
  • Resend with a 60-second cooldown and a per-IP limit.
  • Registration ends on /verify-phone, not on the dashboard.

+ Added

Privacy

  • A "hide my number" option — the number is stripped server-side, not just hidden in HTML.
  • Hiding it also removes the phone, WhatsApp and Viber buttons, leaving messages only.

! Fixed

Fixes

  • The SMS text is Latin and fits one GSM-7 segment — Cyrillic doubles the segment and the price.
  • Deadline columns are datetime, not timestamp (MariaDB moved them forward on every UPDATE).
v0.5.0

Profiles: shops and private sellers, with galleries, badges and contact channels.

+ Added

Profiles

  • A shop directory and public profiles for private accounts.
  • Galleries of up to 24 photos for shops.
  • A verified badge and metrics: type, city, member since, active listing count.
  • Contact by phone, WhatsApp and Viber, honouring the channels the seller enabled.

! Fixed

Fixes

  • Soft-deleted accounts no longer resolve in the directory.
  • Header dropdown links have an explicit text colour — white on white before.
v0.4.0

Media pipeline: processing, normalisation and cropping of images before upload.

+ Added

Images

  • sharp processing: 1080px long edge plus a 400×225 thumbnail, both WebP.
  • A crop dialog with pan and zoom for profile photos and shop logos.
  • Accepted formats: jpeg, png, webp, avif; SVG is rejected before processing.
  • Dimensions are persisted so they are never recomputed.

! Fixed

Fixes

  • CSP img-src allows blob: — the crop dialog preview is no longer empty.
  • The dialog opens from an effect on mount, not from onload (a cached blob finishes first).
v0.3.0

Taxonomy and filters: moving from free text to structured data.

+ Added

Taxonomy

  • Import of 160+ makes and base models per make from an external catalogue.
  • A category tree with parent_id; every root query filters isNull(parentId).
  • A missing model can be added — resolve-or-create by slug, without relaxing the FK.
  • Base models are cleaned of chassis codes and duplicate trims.

+ Added

Filters

  • Searchable combobox instead of native selects — 390 models do not browse in a list.
  • Drivetrain (chain / belt / shaft) replaces transmission; every bike is petrol.
  • An options group separate from condition: trade, first owner, registered.

! Fixed

Fixes

  • Unique ids across the sidebar and the mobile sheet (idPrefix).
  • The brand slug maps onto a make id so the two facets never AND together.
v0.2.0

Accounts and listings: registration, the create wizard, the dashboard and favourites.

+ Added

Accounts

  • Email and password sign-up and sign-in, with a database session and a __Host- cookie in production.
  • A "My listings" dashboard with edit, mark as sold, activate and delete.
  • Favourites and a saved-listings shelf.
  • Per-IP limits: 10 logins/15 min, 5 registrations/hour, 20 listings/hour, 30 uploads/hour.

+ Added

Listings

  • A three-step wizard: vehicle, specifications, photos and price.
  • Required vehicle specs: engine size, power and colour; the description is optional.
  • At least one photo — enforced on the client and in the API.

+ Added

Security

  • CSP with automatic nonces, X-Frame-Options DENY, COOP/CORP, HSTS in production.
  • CSRF protection with a trusted-origins list.
v0.1.0

Foundation: SvelteKit 5, MariaDB, three languages and the first design system.

+ Added

Platform

  • SvelteKit 5 with runes, Drizzle ORM and MariaDB on adapter-node.
  • Per-language routing: /mk, /en, /sq, with hreflang and localised metadata.
  • Design tokens: palette, typography, radii of 4 / 6 / 8 / 12px.
  • Components: listing card, chip, form fields, specification tables.

+ Added

SEO and consent

  • Sitemap index with four child maps and JSON-LD (Organization, WebSite, Product, BreadcrumbList).
  • Robots rules and canonicals that strip filter parameters.
  • Cookie consent with four categories, an mbConsent cookie and localStorage.
  • Three locale dictionaries with a key-parity test.

Have a suggestion or spotted a bug?

Your feedback helps us make MotoBerza.mk better for riders across the country. Send us a note through the contact page.