Statcounter code invalid. Insert a fresh copy.

Our Technology Stack

The Tech We Use
to Build Exceptional Products

We leverage the best tools, languages, and frameworks to deliver robust, scalable, and innovative solutions. Our team pairs deep engineering expertise with agentic AI coding for unmatched velocity and quality.

Explore Our Technology Stack

Interactive showcase of the tools and frameworks we use

Frontend Technologies

Our expertise in frontend development

React

React is our choice for scalable web applications. We use hooks and context for state management and SSR. React’s ecosystem helps us deliver robust, high-performance UIs.

Next.js

Next.js is our preferred React framework for production applications. We leverage its built-in SSR, static generation, and API routes to build fast, SEO-friendly web applications with excellent performance.

Svelte

Svelte enables us to build fast, minimal UIs with simple syntax. We use it for projects where performance and simplicity are paramount, leveraging its reactivity.

SolidJS

SolidJS powers our performance-critical frontends. Its fine-grained reactivity allows us to build lightning-fast UIs. We use it for dashboards and real-time applications.

TanStack

TanStack provides powerful tools for building scalable applications. We use TanStack Query for server state management, TanStack Router for type-safe routing, and TanStack Table for complex data tables. These tools help us build robust, performant applications.

Backend Technologies

Our expertise in backend development

Ruby on Rails

We use Rails for rapid prototyping and full-stack web apps. Its convention-over-configuration philosophy lets us deliver features fast with built-in security. We leverage ActiveRecord and ActionCable for real-time features.

Phoenix Framework & Elixir

Phoenix and Elixir power our scalable, real-time systems. Elixir provides reliability and concurrency for chat and notifications. Phoenix LiveView enables rich UIs with minimal JavaScript. We use OTP for fault-tolerant architectures.

FastAPI

FastAPI enables us to build lightning-fast APIs with automatic documentation. We use it for high-performance async APIs with Pydantic validation. Its type hints provide excellent developer experience and auto-generated OpenAPI docs.

Hono

Hono is our lightweight web framework for building fast APIs and edge functions. We use it for serverless deployments and Cloudflare Workers. Its middleware system and TypeScript support make it perfect for modern API development.

tRPC

tRPC enables us to build fully type-safe APIs without code generation. We use it to create end-to-end type safety between frontend and backend. It eliminates the need for API documentation and reduces runtime errors.

Database Technologies

Our expertise in database development

PostgreSQL

Postgres is our preferred relational database for production. Its advanced features power our scalable web apps and APIs. We use it for transactional integrity and complex queries.

Supabase

Supabase provides us with a modern backend-as-a-service on Postgres. We use it for APIs, authentication, and real-time subscriptions, accelerating development.

Neon

Neon is our go-to for serverless Postgres, enabling scalable cloud databases. Its branching and autoscaling features help us deliver modern applications.

CockroachDB

CockroachDB powers our globally distributed applications with strong consistency. We use it for applications requiring high availability and automatic scaling. Its distributed architecture ensures data survives regional failures.

Convex

Convex is our real-time backend-as-a-service platform. We use it for reactive data synchronization, real-time subscriptions, and serverless functions. Its reactive architecture enables seamless real-time collaboration features.

Authentication Technologies

Our expertise in authentication development

BetterAuth

BetterAuth provides us with a flexible, open-source authentication solution. We use it for custom authentication flows, session management, and multi-provider OAuth integration. Its TypeScript-first approach ensures type safety throughout our auth implementation.

Clerk

Clerk is our preferred authentication platform for modern web applications. We use it for seamless user management, social logins, and enterprise SSO. Its pre-built components and excellent developer experience accelerate our authentication implementation.

Auth0

Auth0 is our enterprise-grade authentication and authorization platform. We use it for complex identity management, multi-factor authentication, and advanced security features. Its extensive integration capabilities and robust API make it ideal for enterprise applications.

Testing & QA Technologies

Our expertise in testing & qa development

Vitest

Vitest is our go-to testing framework for JavaScript projects. Its fast performance and TypeScript support make testing efficient. We use it for unit and integration tests, ensuring reliable code.

Playwright

Playwright powers our end-to-end testing strategy. We use it for automated UI testing and cross-browser validation. Its reliability gives us confidence in every deployment.

Testing Library

Testing Library helps us write tests that focus on user behavior. We use it for component testing with React Testing Library. It encourages writing maintainable tests that closely resemble how users interact with our applications.

Cypress

Cypress enables fast, reliable testing for web applications. We use it for end-to-end testing with real-time reloading. Its debugging capabilities and time-travel features make test development efficient.

AI & Tools Technologies

Our expertise in ai & tools development

AI-Paired Development

Every developer is paired with AI coding agents. These agents assist with code generation, refactoring, and testing. They help us catch edge cases and optimize performance. Our workflow integrates AI suggestions and code reviews.

Agentic Coding

We use agentic coding to automate tasks and generate boilerplate. Our agents collaborate with developers, providing insights and feedback. This synergy allows us to focus on creative problem-solving while AI handles routine work.

Code Quality Examples

See how we write clean, maintainable, and scalable code across the full stack

TypeScript Interface

typescript
1 / 6
interface User {
  id: number;
  name: string;
  email: string;
  preferences: UserPreferences;
}

interface UserPreferences {
  theme: 'light' | 'dark';
  notifications: boolean;
}

React Hook with TypeScript

typescript
2 / 6
const useUserProfile = (userId: number) => {
  const [user, setUser] = useState<User | null>(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetchUser(userId).then(setUser).finally(() => setLoading(false));
  }, [userId]);

  return { user, loading, updateUser };
};

Custom Performance Hook

typescript
3 / 6
const useDebounce = <T>(value: T, delay: number): T => {
  const [debouncedValue, setDebouncedValue] = useState<T>(value);

  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    return () => clearTimeout(handler);
  }, [value, delay]);

  return debouncedValue;
};

// Usage in search component
const SearchComponent = () => {
  const [query, setQuery] = useState('');
  const debouncedQuery = useDebounce(query, 300);

  useEffect(() => {
    if (debouncedQuery) {
      performSearch(debouncedQuery);
    }
  }, [debouncedQuery]);

  return <input value={query} onChange={(e) => setQuery(e.target.value)} />;
};

Rails API Controller with Advanced Features

ruby
4 / 6
class Api::V1::UsersController < ApplicationController
  before_action :authenticate_user!, except: [:create]
  before_action :set_user, only: [:show, :update, :destroy]

  def index
    users = User.includes(:profile, :posts)
                .where(status: :active)
                .order(created_at: :desc)
                .page(params[:page])
                .per(20)

    render json: users, include: [:profile], meta: pagination_meta(users)
  end

  def show
    render json: @user, serializer: DetailedUserSerializer
  end

  def create
    user = User.new(user_params)
    if user.save
      UserMailer.welcome_email(user).deliver_later
      render json: user, status: :created
    else
      render json: { errors: user.errors }, status: :unprocessable_entity
    end
  end

  private

  def user_params
    params.require(:user).permit(:email, :password, :name, profile_attributes: [:bio, :avatar])
  end
end

Advanced React Context Pattern

typescript
5 / 6
interface AppState {
  user: User | null;
  theme: 'light' | 'dark';
  notifications: Notification[];
}

type AppAction =
  | { type: 'SET_USER'; payload: User }
  | { type: 'LOGOUT' }
  | { type: 'TOGGLE_THEME' }
  | { type: 'ADD_NOTIFICATION'; payload: Notification };

const appReducer = (state: AppState, action: AppAction): AppState => {
  switch (action.type) {
    case 'SET_USER':
      return { ...state, user: action.payload };
    case 'LOGOUT':
      return { ...state, user: null };
    case 'TOGGLE_THEME':
      return { ...state, theme: state.theme === 'light' ? 'dark' : 'light' };
    case 'ADD_NOTIFICATION':
      return { ...state, notifications: [...state.notifications, action.payload] };
    default:
      return state;
  }
};

export const AppProvider: React.FC<{children: React.ReactNode}> = ({ children }) => {
  const [state, dispatch] = useReducer(appReducer, initialState);

  const contextValue = useMemo(() => ({
    state,
    dispatch,
    actions: {
      login: (user: User) => dispatch({ type: 'SET_USER', payload: user }),
      logout: () => dispatch({ type: 'LOGOUT' }),
      toggleTheme: () => dispatch({ type: 'TOGGLE_THEME' }),
      addNotification: (notification: Notification) =>
        dispatch({ type: 'ADD_NOTIFICATION', payload: notification }),
    },
  }), [state]);

  return <AppContext.Provider value={contextValue}>{children}</AppContext.Provider>;
};

Database Query Optimization

sql
6 / 6
-- Before optimization (slow query)
SELECT u.name, COUNT(p.id) as post_count, AVG(c.rating) as avg_rating
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
LEFT JOIN comments c ON p.id = c.post_id
GROUP BY u.id;

-- After optimization (with proper indexing)
SELECT
  u.name,
  COUNT(p.id) as post_count,
  COALESCE(AVG(c.rating), 0) as avg_rating
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
LEFT JOIN comments c ON p.id = c.post_id
WHERE u.created_at >= '2024-01-01'
  AND u.status = 'active'
  AND p.published = true
GROUP BY u.id, u.name
HAVING COUNT(p.id) > 0
ORDER BY post_count DESC, avg_rating DESC
LIMIT 100;

-- Create indexes for better performance
CREATE INDEX idx_users_active_created ON users(status, created_at);
CREATE INDEX idx_posts_user_published ON posts(user_id, published);
CREATE INDEX idx_comments_post_rating ON comments(post_id, rating);

Want to make progress on your product?

Let’s make meaningful progress together.

With clarity, speed, and no lock-in — we’ll help you get where you want to go.

Start

What does the blog say?

View all posts »

Explore our collection of articles, guides, and tutorials on technology, frameworks, and how BuildByDakic leverages modern tools and AI to deliver exceptional products.