Inspiration

Fragrance development is a highly creative process, but the operational systems behind it are often fragmented.

A perfumer may develop formulas in spreadsheets, track raw materials in a separate inventory file, store compliance documents in folders, manage production manually, and process commercial orders through another platform. As a fragrance business grows, this fragmentation creates duplicated data, inventory errors, weak traceability, and difficulty connecting creative decisions with production and commercial outcomes.

OlfactoryOps was inspired by the need for a single operating environment built specifically for fragrance laboratories and fragrance businesses.

Our goal was to create a system where perfumers, laboratory teams, production staff, procurement teams, and commercial operators could work from the same source of truth—without losing the flexibility required for creative formulation.

What it does

OlfactoryOps is a multi-tenant operating system for fragrance research and development and commercial operations.

It brings together the core workflows of a fragrance organization in one workspace, including:

  • Raw material intelligence and technical documentation
  • Formula creation, revision, and version tracking
  • Lot-level inventory and material traceability
  • Production batch planning and execution
  • Procurement and supplier management
  • Product and SKU management
  • Customer records, quotations, and orders
  • Compliance evidence and audit history
  • Operational and commercial analytics

The platform allows users to move from an initial fragrance formula to a production batch and then to a commercial order while maintaining a connected record of materials, quantities, revisions, inventory movements, and operational decisions.

Because OlfactoryOps is designed as a multi-tenant system, multiple fragrance businesses or laboratory workspaces can operate securely within the same platform while keeping their data, permissions, sessions, and audit records isolated.

The development environment also includes representative sample data for materials, lots, formulas, production batches, customers, quotations, orders, SKUs, audit events, and analytics. This makes the main product flows available immediately after setup.

How we built it

We designed OlfactoryOps as a modular full-stack application that could support both local development and a scalable hosted environment.

The frontend was built with React 19 and Vite. React provides the component architecture required for complex laboratory and operational interfaces, while Vite enables a fast development workflow and optimized production builds.

For local development, we created a NestJS API using Fastify. This gives developers a structured backend environment with clear domain boundaries, validation, services, and API routes.

For hosted environments, we implemented the API using Cloudflare Workers and used Cloudflare D1 as the persistent relational data store. The frontend can be deployed through Cloudflare Pages, creating a lightweight cloud architecture that is suitable for globally distributed access.

The project uses a shared domain-oriented approach across the frontend, local API, Worker API, and persistence adapters. This helps keep business rules consistent across environments.

Our testing workflow includes:

  • Vitest for domain and business-logic tests
  • Playwright-based functional test harnesses
  • Formula-specific live checks
  • Deployment validation commands
  • Client-bundle security checks
  • Type checking and production builds

Security was treated as part of the architecture rather than an afterthought. Tenant access, sessions, permissions, and audit events are enforced on the server. Cookie-authenticated mutation requests require CSRF protection, and sensitive credentials are kept outside the frontend bundle.

We also separated structured operational metadata from document binaries. D1 stores records and evidence metadata, while larger documents can be stored in Cloudflare R2 and accessed through signed URLs.

Challenges we ran into

One of the biggest challenges was translating fragrance operations into a connected data model.

Fragrance development is not a simple linear workflow. A formula can have many revisions, materials can exist in multiple lots and concentrations, production batches can consume different inventory sources, and compliance evidence must remain connected to the exact formula or batch being evaluated.

We needed to model these relationships without making the system too rigid for creative work.

Another major challenge was maintaining consistent behavior between two backend environments: the local NestJS API and the hosted Cloudflare Worker API. Both implementations needed to follow the same domain rules even though they use different runtimes and persistence adapters.

Multi-tenant security was also a critical challenge. It was not enough to hide information in the user interface. Tenant boundaries, permissions, sessions, mutations, and audit events had to be validated and enforced at the server level.

We also had to prevent configuration mistakes that are common in modern frontend projects. For example, environment variables prefixed with VITE_ are bundled into browser code. We therefore designed the configuration process so passwords, Cloudflare secrets, and production credentials are never placed in client-exposed variables.

Finally, it was challenging to create meaningful sample data across many connected modules. Materials, lots, formulas, batches, products, customers, orders, and analytics had to work together so users could explore realistic end-to-end workflows immediately.

Accomplishments that we're proud of

We are proud that OlfactoryOps connects creative fragrance development with the operational systems required to turn a formula into a commercial product.

Instead of building an isolated formula calculator or a basic inventory tracker, we created the foundation of a complete fragrance operating system.

Some of the accomplishments we are especially proud of include:

  • Designing a multi-tenant architecture with server-enforced workspace isolation
  • Connecting formulas, material lots, production batches, SKUs, quotations, and orders
  • Supporting both a structured local NestJS environment and a Cloudflare-native hosted architecture
  • Implementing audit events and operational evidence for traceability
  • Building automated domain, functional, deployment, and security checks
  • Creating a seeded workspace with realistic interconnected sample records
  • Establishing a deployment workflow using Cloudflare Pages, Workers, D1, and optional R2 document storage
  • Preventing default administrator credentials from being stored in source control

We are also proud that the system is designed for both technical reliability and real operational use. It can support an independent perfumer or a small fragrance laboratory today while providing an architecture that can grow toward larger teams and more complex commercial workflows.

What we learned

Building OlfactoryOps taught us that fragrance software must balance creativity, scientific precision, and operational control.

A perfumer needs freedom to experiment, but a production team needs stable specifications. Procurement needs accurate material demand, while compliance teams need evidence linked to specific formulas and batches. Commercial teams need products, quotations, customers, and orders, but those records must still connect back to what can actually be produced.

We learned that traceability should be designed into the product from the beginning. Formula revisions, inventory movements, production activities, and user actions become much harder to reconstruct if auditability is added later.

We also learned the importance of separating domain logic from infrastructure. By keeping business rules independent from the local NestJS server and the Cloudflare Worker environment, we can test critical behavior more consistently and evolve the deployment architecture without rewriting the entire product.

Another important lesson was that secure defaults matter. Avoiding hard-coded passwords, enforcing CSRF protection, isolating tenants on the server, and checking the client bundle for leaked secrets significantly reduces the risk of preventable security mistakes.

Most importantly, we learned that fragrance operations are deeply interconnected. Improving only one part of the workflow is not enough. The greatest value comes from connecting formulation, inventory, production, compliance, and commerce into one coherent operational system.

What's next for OlfactoryOps

The next stage of OlfactoryOps is focused on expanding both fragrance intelligence and operational automation.

Planned improvements include:

  • Advanced formula comparison and revision visualization
  • Automatic formula scaling for laboratory trials and production batches
  • Cost calculations based on material lots, supplier pricing, and production quantities
  • Inventory forecasting and procurement recommendations
  • Supplier lead-time and purchasing workflow management
  • More advanced compliance workflows and evidence management
  • Support for document storage and signed evidence retrieval through Cloudflare R2
  • Batch reconciliation, yield tracking, and production variance analysis
  • Customer portals for quotations, approvals, and order visibility
  • More detailed operational, financial, and commercial dashboards
  • Notification and approval workflows across laboratory and production teams
  • Integrations with external commerce, accounting, and logistics platforms
  • Expanded role-based access controls for larger organizations

We also plan to continue improving automated testing, deployment safety, and observability so that OlfactoryOps can support real fragrance laboratories and commercial teams with greater reliability.

Our long-term vision is for OlfactoryOps to become the operational backbone of modern fragrance businesses—a platform where creative formulation, scientific documentation, production execution, and commercial growth can operate as one connected system.

Built With

Share this project:

Updates