Holden Jolley
Azure Solution Architect
All projectsResumeGitHubLinkedInContact
COST OPTIMIZATION · STATIC HOSTING

Cost-Optimized Portfolio Hosting

The portfolio itself is an Azure architecture project: a globally delivered static site designed around Azure Static Web Apps Free so the recurring Azure hosting target stays at $0/month while the workload remains within included quotas.

Deployed to AzureARM What-If validated
Architecture at a glanceFree-tier first
GitHub
Actions
→OIDC + Deployment
Stack
→Static Web Apps
Free
Azure footprintResource Group + Static Web App
Public pathCloudflare edge → Azure Static Web Apps
Azure target$0/month in quota
ProblemHost a professional portfolio globally without paying for unnecessary runtime services.
DecisionUse Static Web Apps Free with GitHub Actions, Bicep, OIDC, Deployment Stacks, and Cloudflare DNS/edge routing.
Key tradeoffAccept Free-plan SLA/control limits until real traffic or business requirements justify a larger Azure architecture.
REQUIREMENTS & CONSTRAINTS

Do not pay for services the workload does not need.

The workload is HTML, CSS, JavaScript, and a resume PDF. It needs HTTPS, a custom domain, global static delivery, repeatable deployment, pull-request previews, and a recovery path—but it does not need server compute, a database, a paid Azure CDN, or a distributed tracing platform.

The architecture therefore optimizes for minimum operational and financial surface area while keeping an explicit upgrade path for future requirements rather than pre-provisioning enterprise services for résumé value.

Workload typeStatic content only
Cost objectiveNear $0 Azure recurring cost
StateGitHub is source of truth
DNS / edgeCloudflare
RIGHT-SIZING PRINCIPLES

Use less Azure on purpose.

Static Web Apps FreeProvides the Azure capabilities this workload actually needs: global static delivery, HTTPS, GitHub integration, and preview environments within Free-plan limits.
No server computeNo App Service plan, VM, Functions backend, or always-on runtime is provisioned because the site has no server-side execution requirement.
No paid Azure edge layerNo Front Door or separate paid Azure CDN is added. Cloudflare handles authoritative DNS and the lightweight edge-routing requirement while Azure Static Web Apps hosts the portfolio.
No unnecessary stateNo database, storage account, or dedicated monitoring workspace is required for a stateless portfolio whose authoritative copy already lives in source control.
PUBLIC REQUEST PATH

A small Azure runtime footprint with a separate edge-routing layer.

Visitor
browser
→
Cloudflare DNS
+ Worker routing
→
Azure Static
Web Apps Free
→
HTML + CSS + JS
+ resume PDF
Azure Static Web AppsCloudflareBicepDeployment StacksGitHub ActionsSecretless OIDCARM What-IfManaged TLSPR previewsContent Security PolicySecurity headers
SECRETLESS DELIVERY PATH

GitHub reaches Azure without a reusable client secret.

GitHub
Actions
→
GitHub OIDC
federation
→
Microsoft Entra ID
short-lived token
→
Azure Resource Manager
What-If / Stack deploy
Repository
content
→
Validate + build
curated dist/
→
Runtime SWA
deployment token
→
Publish public
site only
QUALITY ATTRIBUTES

Right-sized architecture means accepting the right limitations.

Cost efficiency

The baseline targets $0/month Azure hosting while usage remains inside Static Web Apps Free quotas. Domain registration remains an external cost.

Availability

Global static delivery is built in, but the Free plan has no SLA. That is accepted for a personal portfolio and becomes an explicit redesign trigger if the site becomes business-critical.

Security

Managed HTTPS, CSP/security headers, curated public artifacts, OIDC-based Azure authentication, and gated production delivery provide a practical baseline without adding a paid Azure WAF or private endpoint the workload does not require.

Recoverability

The site has no mutable application state. Git is the authoritative copy, so recovery is revert/redeploy rather than database or VM restoration.

Maintainability

Plain HTML/CSS/JavaScript and a two-resource Azure footprint minimize patching, runtime dependencies, and operational ownership.

Scalability

The current design relies on the Static Web Apps service limits. Sustained traffic, storage, preview, SLA, or backend requirements are the signals to upgrade rather than preemptively adding Azure services.

DELIVERY & SECURITY

Deployment is automated without storing a reusable Azure client secret.

GitHub Actions authenticates to Azure through workload identity federation using OIDC. Infrastructure is modeled in subscription-scoped Bicep, compiler-validated in CI, evaluated with live ARM What-If, and managed in production through an Azure Deployment Stack.

The site artifact is curated so public content is separated from IaC and internal documentation. Security headers and Content Security Policy are part of the static-site configuration. Pushes to the protected main branch deploy only after the validation gates succeed.

Azure authGitHub OIDC federation
IaC gateBicep build + ARM What-If
Production deployGated main-branch pipeline
LifecycleAzure Deployment Stack
COST MODEL

The baseline spends only where a requirement exists.

Static hosting

Azure Static Web Apps Free: expected Azure hosting charge is $0 while the site remains within the Free-plan quota.

Global delivery + TLS

Static Web Apps provides the Azure hosting/TLS baseline. Cloudflare provides authoritative DNS and edge routing without adding a paid Azure Front Door/CDN resource.

DNS / edge routing

Cloudflare fronts the custom domain and routes requests to the Azure portfolio origin. Domain registration remains an external cost.

CI/CD

GitHub Actions handles automation. Any GitHub usage cost is separate from Azure hosting cost and depends on the account's GitHub quotas.

Backend compute + database

None. Static content does not justify a runtime or persistence layer, so both remain $0 by architectural omission.

Azure monitoring workspace

None in the baseline. A static personal portfolio does not currently justify dedicated Application Insights / Log Analytics resources.

FREE-PLAN GUARDRAILS

Free is a constraint, not an excuse to hide limits.

01Capacity

The architecture was written around the Free-plan included quotas for bandwidth, environment storage, preview environments, and related platform limits. If real usage approaches those boundaries, the correct response is a deliberate upgrade—not wishful thinking.

02Availability

The Free tier does not provide an SLA. That is accepted for a personal portfolio and is explicitly not presented as an enterprise availability posture.

03Advanced controls

Private endpoints, paid support/availability, backend API requirements, or other advanced Azure controls are future triggers for Standard or a different architecture rather than baseline features.

OPERATIONS & RECOVERY

A stateless site should have a stateless recovery model.

Bad content release

Git is the source of truth. Revert the content change and redeploy rather than restoring mutable application state.

Infrastructure drift or accidental removal

Recreate the intended resource group and Static Web App from the subscription-scoped Bicep/Deployment Stack, then republish the curated static artifact.

DNS / edge issue

Cloudflare is authoritative for the public hostname and Worker routing, so DNS/edge troubleshooting remains intentionally separated from the Azure hosting footprint.

Platform outage

The Free-tier baseline accepts the lack of an SLA. If availability becomes business-critical, that requirement itself triggers a paid architecture decision.

KEY DECISIONS

Cost optimization is requirement-driven architecture.

Static Web Apps instead of App Service

The workload is static. Paying for an App Service plan would add compute cost and operational surface without adding a current capability.

Cloudflare instead of Azure DNS/Front Door

Cloudflare already satisfies the authoritative DNS and lightweight edge-routing requirements, so adding Azure DNS or Front Door solely for the portfolio would create cost/complexity without solving a new requirement.

No dedicated observability stack

The site has no backend transaction or dependency graph that justifies distributed tracing. Deployment history and basic resource health are sufficient for the current workload.

Upgrade only on a real trigger

Bandwidth, preview capacity, SLA, private networking, backend API requirements, or business criticality are the conditions that justify a larger Azure architecture.

EVIDENCE LEVELS

The site separates architecture intent from deployment proof.

Design evidence

Requirements, NFRs, cost/security/operations docs, ADRs, recovery guidance, diagrams, and known limitations are source-controlled.

Compiler evidence

Bicep lint/build, production parameters, JavaScript syntax, and public-site metadata checks are green.

Azure control-plane evidence

GitHub Actions authenticates through OIDC, ARM What-If resolves the intended footprint, and the production infrastructure is managed through a subscription Deployment Stack.

Runtime evidence

The Static Web App is deployed and serving the portfolio. The Cloudflare custom-domain path, HTTPS delivery, Hickory geo route, non-local portfolio route, and private portfolio bypass have been exercised.

Production deployed
The Free-tier Azure hosting design is now running in production.

Bicep validation and live ARM What-If gate the infrastructure path, GitHub Actions authenticates with secretless OIDC, and an Azure Deployment Stack manages the production resource group and Static Web App. Cloudflare is authoritative for the custom domain and handles the edge-routing layer before requests reach the Azure portfolio origin. The direct Azure origin remains available for recovery/testing while the public canonical identity is holdenjolley.com.

Current boundary: the Free tier is intentionally right-sized for a personal portfolio and is not an enterprise SLA claim. Domain registration remains an external cost, and the design will only grow when a real requirement—availability, networking, traffic, backend functionality, or business criticality—earns the additional Azure services.