Back to projects

Onelink — Architecture-Driven Case Study

Most link-in-bio tools rely on centralized backends, user accounts, and persistent databases. This creates several architectural drawbacks:

  • Stateful infrastructure: User data is stored server-side, requiring authentication, databases, and APIs.
  • Operational overhead: Hosting, migrations, backups, and security hardening are mandatory even for simple use cases.
  • Poor portability: Links are bound to a platform. Data cannot be reconstructed without the original backend.
  • Cold-start latency: Server round-trips are required before meaningful UI can be rendered.
  • Limited shareability: A link is only a pointer to data, not the data itself.

For a tool whose primary responsibility is to display structured links, this architecture is disproportionate.

Solution

Onelink adopts a URL-as-state architecture where the entire application state is encoded directly into the URL. The application becomes a pure client-side state interpreter, eliminating backend dependencies entirely.

High-Level Architecture

state Picture

Core Principles

  1. Stateless Application Design
  • No backend APIs
  • No database
  • No authentication layer
  • No server-side sessions
  1. URL-Driven State
  • Application data (links, ordering, metadata, theme) is:
  • Serialized → JSON
  • Encoded → Base64 (js-base64)
  • Embedded → URL query/hash
  • The URL becomes the single source of truth.
  1. Deterministic Rendering
  • UI is a pure function of URL state: UI = f(URL_state)
  • Reloading, sharing, or opening on another device yields the same result.

Data Flow

React
  1. User Interaction
  • User adds, edits, reorders links (via vuedraggable).
  1. State Mutation
  • State is maintained in-memory using Vue reactivity.
  1. Serialization
  • State → JSON → Base64 string.
  1. URL Sync
  • Encoded payload is written to the URL without reload.
  1. Hydration
  • On page load, the app decodes the URL and reconstructs the UI.

Technical Stack Breakdown

Framework & Rendering

  • Nuxt 3 (SPA + SSG)
  • nuxt generate produces a fully static output.
  • Zero server logic at runtime.
  • Vue 3 Composition API
  • Clean separation between:
  • state encoding/decoding
  • UI components
  • interaction logic

State Encoding

  • js-base64
  • Compact, URL-safe encoding of structured data.
  • Avoids server persistence while keeping links shareable.

UI & Interaction

  • Tailwind CSS
  • Utility-first styling with zero runtime overhead.
  • @headlessui/vue
  • Accessible, unopinionated UI primitives.
  • vuedraggable
  • Drag-and-drop ordering mapped directly to encoded state.
  • @vueuse/core
  • Reactive utilities for URL syncing, effects, and lifecycle handling.

Theming

  • @nuxtjs/color-mode
  • Theme preference integrated into encoded state rather than local storage.

Deployment Architecture

Deployment
  • Deployed as pure static assets on Vercel.
  • CDN-backed, globally cached.
  • No runtime compute, no cold starts, no backend failures.

Results

Architectural Outcomes

  • Zero Backend Cost
  • No servers, databases, or APIs to maintain.
  • Infinite Scalability
  • Traffic scales linearly via CDN.
  • Instant Load Times
  • No network dependency beyond static assets.
  • Maximum Portability
  • The URL is the product.
  • Failure-Resilient
  • No backend means no backend outages.

Trade-offs (Explicitly Accepted)

  • URL length constraints impose an upper bound on state size.
  • State is human-readable if decoded (privacy-by-design is not a goal).
  • No multi-user or collaborative features (by architectural choice).

Architectural Summary

Onelink demonstrates a radically stateless frontend architecture, where:

  • URLs act as a distributed, user-owned datastore.
  • The frontend behaves as a deterministic state renderer.
  • Infrastructure complexity is intentionally collapsed to zero.

This project explores how far modern frontend tooling (Nuxt + Vue + SSG) can be pushed when state, persistence, and portability are unified into a single primitive: the URL.