profile

Hi, I'm Stefane Fivaz 👋

A versatile software engineer with a Bachelor of Science in Business IT, over 1.5 years of professional experience in a company setting, and more than 10 years of hands-on coding practice. Certified as an AWS Solutions Architect and a Microsoft Azure Developer. Proficient in front-end and back-end technologies, with a sharp focus on user experience and a commitment to producing clean, maintainable code.

Tech Stack

tech stack tech stack tech stack tech stack

Projects

Featured project · iOS + web · Azure infrastructure as code

Fit.

A workout tracker for iOS and the web. Pick one of the three flows below: its phone plays, and the diagram under it lights up every service that tap goes through, from Cloudflare to Container Apps, Neon, OpenAI and Stripe. The Web app box in the diagram plays a fourth flow: loading the site in a browser.

Bicep modules
5
CI/CD workflows
5
environments
3
API replicas
0→3
metric alerts
3
compute when idle
~$0
Behind the scenes
See how it ships →
Env

Log a workout. Every request carries a bearer token to the API; images never touch it, they come from cdn.sfivaz.com.

Scroll sideways to see the full diagram →

Clients
Cloudflare edge
Azure · rg-fit-prod-139d · northeurope
External services
GitHub · fivaz/fit
Microsoft.App/containerApps

NestJS API on Container Apps

ca-fit-api-prod-139d

NestJS runs as one Container App with scale rules of 10 concurrent requests per replica, 0 to 3 replicas, 0.5 vCPU and 1 GiB each. Liveness and readiness both hit /api/health, so a replica only receives traffic once Nest has booted and answers HTTP.

Why it's built this way activeRevisionsMode: Multiple makes every deploy a new revision named after the commit SHA, created at 0% traffic. Ingress routes by the production label, not by "latest", so CI can smoke-test the new revision on its own URL and then move the label. Rolling back is moving the label back, with no rebuild or redeploy.

The trade-off Scale to zero means a cold start: the first request after an idle period waits for a replica to boot. I tried minReplicas: 1 in prod to remove it, then reverted to 0, because a portfolio app idles most of the day and a warm replica would bill around the clock. /api/health also doesn't query the database, so the smoke test proves a revision boots, not that it can reach Neon.

infrastructure/bicep/modules/container-apps.bicep

traffic: empty(currentProductionRevisionName) ? [
  { latestRevision: true, weight: 100 }
] : [
  {
    revisionName: currentProductionRevisionName
    label: 'production'
    weight: 100
  }
]

Day Planner

Life

A sophisticated, fully responsive, offline-first web application for day planning

Life is an elegant web app boasting a visually stunning calendar design. With its intuitive interface and seamless navigation, users effortlessly manage their schedules and tasks to reach goals faster.

Developed with Svelte, showcasing proficiency with small framework ecosystems, it underscores my prowess in frontend development. Furthermore, it demonstrates adeptness in user interface design and integration of cloud services, reflecting a holistic skill set in crafting engaging digital experiences.

screen of the app desktop
screen of the app mobile
phone frame

Some of the features

  • Highly Interactive

    A user-friendly interface with resizable and drag-and-dropable events.

  • Progressive Web App (PWA)

    Ensures offline-first data access and updates, guaranteeing uninterrupted functionality.

  • Goal Management

    Empowers users to set and track goals and associate events or tasks to them.

  • Task and Event Flexibility

    Enables seamless conversion between tasks (To-Do List) and events (Calendar), offering a dynamic and adaptable planning experience.

  • Recurring Events

    Supports the scheduling of recurring events.

  • Got interested?

    Explore the live demo and delve into the codebase on GitHub.