OUR WORK
Work
Websites, apps, and systems — designed, built, and supported the Virius way.
WebsiteDekoras
- The challenge:
- Sourcing building and construction materials in Iraq was fragmented and manual, customers had no single, trusted place to browse products, compare brands, and order with delivery. The business needed a unified platform serving both individual customers and B2B accounts, with full admin control over products, orders, and operations.
- What we built:
- An end-to-end platform: a customer-facing storefront (web + Flutter mobile apps for iOS and Android), a full admin dashboard for managing products, orders, brands, leads, and company accounts, and a secure NestJS backend API. Features include role-based permissions, order tracking, multi-language support (English, Arabic, Kurdish), push notifications, and a server-side app kill-switch for maintenance and force-update control.
- The result:
- Delivered a fully operational platform: customers can browse, order, and track building materials online for the first time, while the business gains complete control over products, orders, and operations through the admin dashboard. Live on web, App Store, and Google Play.
AppMakat Ali
- The challenge:
- Finding the right Chevrolet, GMC, or Cadillac part in Erbil meant calling around or driving shop to shop, with no way to know what was in stock or what it cost. Customers couldn't compare condition or price before committing, and every order ran through a phone call. The shop needed one place where car owners, mechanics, and repair garages could see real inventory and order without leaving the workshop.
- What we built:
- A customer-facing mobile app for iOS and Android, built around the shop's live parts catalogue. Features include browsing by vehicle and category, price, condition, and stock shown on every listing, direct chat with the seller, a full cart and ordering flow, and an Arabic-first interface built for local customers.
- The result:
- Customers can now browse stock, check prices and condition, and order parts from their phone instead of calling around the city. The shop handles orders and customer questions in one place rather than across scattered phone calls. Live on Google Play and the App Store.
SystemExchange System
- The challenge:
- Rates lived on a whiteboard and in WhatsApp messages. Customers had to call or walk in just to ask what the rate was, and staff answered the same question dozens of times a day. Transactions were written in notebooks and later re-typed into spreadsheets, so the daily close never matched the drawer without someone hunting for the gap. Nobody could say who changed a rate, or when.
- What we built:
- A public rate page that updates the second a rate is changed in the back office, in Kurdish, Arabic and English, built mobile-first because that's where customers check it. An admin dashboard for setting buy and sell rates per currency, with spread controls and a full change log. A transaction ledger with printed receipts, teller accounts that can record transactions but not edit rates, and a one-click daily close-out report that reconciles against the drawer.
- The result:
- Rates now change in one place instead of five, and reach customers before they reach the counter. The daily close is a report rather than a search, and every rate change carries a name and a timestamp.
SystemOlala Shopping - POS & Inventory System
- The challenge:
- Stock lived in a notebook and in the owner's memory. One lipstick is a dozen shades and one cream is three sizes, so a single product filled half a page and nobody counted it twice. Customer debts were written on paper and settled from memory. Every delivery arrived at a different price, so the real cost of a product was a guess and so was the profit on it. Cosmetics expire, but nothing tracked what was close, and it was found on the shelf too late. At the end of the day the cash in the drawer was counted against nothing, and when it came up short there was no way to find out where.
- What we built:
- A point-of-sale that sells on cash or credit, in Kurdish and English with full right-to-left, because the people standing behind the counter work in Kurdish. Products carry their shades and sizes as real variants picked from a colour palette, so one lipstick is one product and not twelve rows. Every delivery updates the product's cost as a weighted average, so profit is calculated on what the stock actually cost rather than on the last invoice. Expiry is recorded per delivery with days remaining and a one-click write-off. Suppliers, customer debts, expenses and losses each have their own ledger, and the day closes with a report that reconciles against the drawer. Owner and cashier accounts see only the pages they are given, and every stock movement carries a name and a time.
- The result:
- Stock is counted once and stays counted. A shade sells and it leaves the shelf in the system at the same moment. The day closes with a report instead of a search, and when the drawer is short the system shows where. Every debt has a name, every cost has an invoice behind it, and product near expiry is flagged before it is thrown away instead of after.
AppChya Mazad - Car Import & Tracking
- The challenge:
- Chya Mazadi imports cars from US auctions into Kurdistan. Every question a buyer had — where is my car, what will it cost me landed, how much do I still owe - was answered by phone, one message at a time. Quotes were worked out by hand from freight sheets that change every month, so one rate change meant recalculating everything and risked quoting a customer the wrong price. Outside the owner's own records, nobody could see the real state of a shipment or the balance left on it.
- What we built:
- A Flutter app for customers and a Laravel back office for the owner. Customers watch each vehicle move through five stages - purchase, US garage, loading, shipping, arrival - with a live timeline, the cost breakdown behind the total, payment stages, and a PDF receipt they can download themselves. A calculator prices a car before purchase on both routes, US to Mersin and US to Dubai, using the owner's own freight, towing and clearance rates. Those rates live in the admin panel and he edits them himself, so a monthly price change takes minutes and needs no developer and no release. A moderated marketplace lets customers list cars for sale. Kurdish, Arabic and English throughout with full right-to-left support, and complete light and dark themes. The admin panel puts the whole business on one screen: receivables ageing, cash collected, value in transit, and how long each stage is actually taking.
- The result:
- In daily production use: 22 customers and 20 vehicles tracked live through the pipeline, with every payment and outstanding balance in one ledger instead of a notebook. The "where is my car" call has gone - customers open the timeline themselves. Freight rates that change every month are now updated by the owner in minutes, so every quote goes out on current numbers rather than a hand calculation.
AppSiwak
- The challenge:
- Requests arrived by phone call and WhatsApp. A customer would send passport and visa photos into a chat thread, and those images then lived in someone's phone gallery, with no proper way to delete them and no control over who could see them. There was no list of who had asked for what or which requests were still open - that sat in the head of whoever answered the phone. Payment was arranged separately every time. And the audience the business already had, people who open their phone several times a day to check a prayer time, had no reason to open anything belonging to the business.
- What we built:
- A Kurdish-first app for iPhone and Android - the whole interface right to left in Sorani, with Arabic and English, in a light and a dark theme. The request happens inside the app: the customer fills the form, attaches passport and visa images, and pays with QiCard, FIB or FastPay. Those documents go into private storage instead of a chat thread; staff open them through temporary links from the admin panel, and they are deleted once the request is finished. Prayer times for the user's own location with adhan notifications and a choice of reciter, and a qibla compass. A photo-only feed where signed-in users post and like, one like per person per photo and seven posts a week, enforced on the server rather than in the app, with reporting and removal tools. An admin panel to work through requests, manage content, and see what is still open.
- The result:
- Requests arrive in one place with the documents attached, instead of in a chat thread with the photos in someone's gallery. Sensitive documents left the phone: they sit in private storage, open through links that expire, and are deleted when the request closes. Payment happens at the moment of the request instead of in a separate conversation. And the business now has a reason to be on the customer's phone every day, through prayer times, not only when the customer needs something.
AppSozAster
- The challenge:
- An institute with multiple teachers and a growing catalogue of recorded courses had no single place to sell and deliver them. Payments were collected by hand, video was easy to copy once it left their hands, and there was no reliable record of who had bought what or what each teacher was owed. Their students also read in four different languages, so an English-only app was never an option.
- What we built:
- An iOS and Android app in Flutter, with Laravel and Filament behind it. Students browse featured courses, subjects, packages and teachers, search the full catalogue, and enroll in seconds. Payment goes through FIB: scan the QR in your banking app and access unlocks automatically. Lessons stream through Bunny on signed links with screen capture blocked and the player watermarked. Progress is saved lesson by lesson, students ask questions underneath each one, teachers reply and pin the important answers, and push notifications link straight back into the app. All of it runs in English, Kurdish Sorani, Kurdish Badini and Arabic, with genuine right-to-left layout rather than translated strings dropped into a left-to-right design. Teachers get their own side of the app: net earnings after institute commission, a course-by-course revenue split, student counts, and every comment in one feed. The admin panel handles the rest - promote a teacher, assign their courses, set the commission, upload lessons, moderate comments, and broadcast an announcement to everyone at once.
- The result:
- The institute now runs on one system. Students pay and get access without anyone confirming it by hand. Lessons stream on signed links, so course files no longer circulate freely. Every sale is recorded against a student and a teacher, which turns the commission split into a calculation instead of a conversation. And the institute adds courses, lessons, pricing and announcements itself, in all four languages, without coming back to us.
AppMuxlis Course
- The challenge:
- Courses were sold and delivered by hand. Every enrolment meant a message, a payment screenshot, and a shared folder - and once a link was out, it kept moving between students. Instructors had no way to see what they had earned, so every payout ended in a conversation. Nobody could say how many students a course actually had.
- What we built:
- An app for students and an admin panel for the institute. Students browse courses, pay inside the app, and watch lessons through timed links tied to their account, so course files stay where they belong. Every sale is recorded against a student and an instructor. Instructors get their own view: net earnings after the institute's commission, revenue per course, student numbers, and all comments in one place. The institute runs the rest from the panel - promote a user to instructor, assign courses, set commission, upload lessons, manage comments, and send one announcement to everyone at once. All of it works in English, Sorani Kurdish, Kurdish, and Arabic, with real right-to-left layout rather than translated text sitting inside a left-to-right design.
- The result:
- The institute now runs on one system. A student pays and gets access without anyone confirming it by hand. Lessons sit behind timed links, so course files no longer pass between people. Every sale is recorded by student and instructor name, which turns revenue splits into arithmetic instead of a negotiation. And the institute adds its own courses, lessons, prices, and announcements in all four languages, without coming back to us.
SystemCar Dealership Management System
- The challenge:
- The dealership's operations lived across disconnected spreadsheets. Every car carried a different cost basis — purchase price, Dubai import costs, service work, linked expenses — so nobody could say what a single sale actually earned. Installments were tracked by hand, late fees were applied inconsistently, and monthly totals never reconciled. The hard requirement was that money could only have one source of truth: a figure recorded at the moment of sale is historical truth and must never silently change when a formula is corrected later.
- What we built:
- An Express and TypeScript API on PostgreSQL with Knex migrations, JWT access and refresh tokens, role-based access for admin, manager and staff, and scheduled jobs that process overdue installments and recalculate client risk overnight. The interface is a React 18 and Vite single-page app using TanStack Query, Zustand, React Hook Form with Zod validation, Tailwind and Recharts. Every business-financial formula lives in one authority module, mirrored on the frontend for previews only, and an automated check fails the build if a calculation leaks anywhere else. On top of that sit multi-step quotation and sale wizards, automatic installment schedule generation, day-based late-fee calculation, per-car profit analysis, Excel and PDF financial exports, and a Sorani Kurdish runtime translation layer covering the whole interface. The regression suite creates a temporary PostgreSQL database, runs the real migrations against real SQL and real service logic, then drops itself - so the financial tests prove the actual queries, not mocks.
- The result:
- One system now answers the questions the spreadsheets could not: what a specific car really cost and earned, which clients are risky based on late payments and open disputes, and how a month's revenue stands against its expenses in a way that reconciles with the P&L. Late fees apply identically every time, and inventory rolls back correctly when a sale is cancelled. Roughly 26,000 lines of TypeScript across 109 files and 26 screens. Handover is gated: a financial verification script must return zero issues, the regression and contract suites must pass, and the demo seed must be provably absent before the system goes live.
SystemAlan Exchange - Hawala Management System
- The challenge:
- Money moves between branches in several currencies, at rates that change during the day. Tracked in notebooks and spreadsheets, every correction quietly overwrites the record it corrects, and by month-end nobody can prove what a branch actually owes. The system had to make financial history impossible to rewrite, keep inter-office balances reconciled to the currency's smallest unit, and be usable in Kurdish by staff who don't work in English.
- What we built:
- Next.js 16, React 19 and TypeScript, organised as one module per business domain - offices, transfers, rates, commissions, expenses, reports - each with its own UI, service, repository and storage layer. Every amount is held as an integer in the currency's minor unit and flows through a single authoritative calculation layer, so no figure is ever rounded twice. Financial tables are append-only, enforced both in application logic and in SQLite triggers: a correction posts a reversing entry, it never edits the original. Transfers store the exact exchange rate snapshot resolved at posting time, and realized FX gain and loss is computed from FIFO-tracked currency lots. The whole interface is right-to-left Kurdish, behind an Argon2id activation gate, with a regression harness that replays the core money scenarios end to end.
- The result:
- A thirteen-scenario sign-off matrix - overflow balances, FX profit and loss, FIFO lots, filtered reports, cross-page consistency - passed with exact expected figures. Dashboard, cashbox, expenses, reports and transaction history all report the same numbers from the same stored truth, and every transfer stays auditable years later because the rate it used is stored with it.
SystemBookkeeping System
- The challenge:
- The practice's finances lived in notebooks and spreadsheets. Money arrived from several clients across several ongoing projects, and costs were written down wherever there was room. Answering a simple question - what did this project actually earn, and what did it cost to run - meant an evening of adding up by hand, and the answer was only ever as good as the arithmetic.
- What we built:
- A private, password-protected finance system on Laravel. Income and expenses are recorded as one stream of transactions, each tagged to a client, a project, and a category, so a single entry answers several questions at once. The dashboard opens on the numbers that matter: what came in, what went out, what's left. Reports filter that history by client, by project, by category, or by date range.
- The result:
- The practice's finances now live in one place. Every payment and every cost is filed as it happens, and the question that used to mean an evening with a calculator - what did this project earn, what did it cost to run - is now a filter and a glance.
SystemTerminal Red
- The challenge:
- Build something that feels like a real broker terminal without being one. Live prices had to tick, positions had to float in profit and loss, take-profit and stop-loss had to fire on their own - but no real money could ever move, and the free market-data tier allowed only 800 requests a day and 8 a minute. The demo and real sides of a single user also had to stay completely sealed off from each other: balances, margin, positions and history, never mixing.
- What we built:
- Laravel 11 API with Sanctum tokens, and a React 18 + Vite + Tailwind single page app on top of it. Prices come from Binance for crypto and Twelve Data for forex and stocks, batched into one call per tick by a scheduler that refreshes crypto every ten seconds and everything else every minute, cached and shared globally so the rate limit is never the user's problem. A second job sweeps open trades every ten seconds and closes anything that hit its take-profit or stop-loss. All money is bcmath string decimals, never floats, and every trade open, close and admin approval runs inside a database transaction with row locks so nothing can be spent or closed twice. The admin side covers users, trades, transactions, instruments, OTC pricing, payment methods, KYC verification, virtual cards, announcements, impersonation and platform settings. The interface ships in five languages, Arabic included with right-to-left layout.
- The result:
- A working end-to-end trading terminal: register, trade live prices on demo funds, request a real deposit with a proof image, and watch an admin approve it before a single balance moves. Eighteen feature tests cover the money paths, and the whole thing runs on ordinary cPanel shared hosting.
WebsiteAbbas Sadr Addin - Link Page
- The challenge:
- He was reaching his followers through a scattered set of accounts - Telegram, WhatsApp, YouTube, and a list of lecture and donation links that changed from week to week - with no single address to send anyone to. He is also not a technical user. Any solution that needed a developer for every edit would have quietly stopped being updated within a month. It had to be a site he could run himself, indefinitely, at zero cost.
- What we built:
- A single React page in front of a Firebase back end, with a six-tab admin panel behind an email login: profile, links, socials, expandable sections, theme and footer. Cards are added, hidden, recoloured and dragged into order from the browser. Photos are resized and compressed in the browser and stored directly in the database, so the site never needs a paid storage bucket. A build step reads the live content and bakes it into the page's Open Graph tags, so the link arrives in a chat with the right photo, name and bio instead of a bare URL. Content is public to read and admin-only to write, and every saved link is cleaned and screened before it reaches the page. The admin panel always renders in the default palette - an unreadable custom theme can never lock him out of the editor that fixes it.
- The result:
- One address that carries everything, and an owner who updates it himself. New links, new photos, new colours - all live after a refresh, with no developer in the loop and no redeploy. The whole site runs inside Firebase's free tier, so it costs nothing to keep online, and a link shared to Telegram, WhatsApp or Facebook arrives as a proper preview card.
Let's talk about your project.
Tell us what you want to build. We'll give you an honest assessment, a clear price, and a realistic timeline — free of charge.