About

The Author

As an experienced Upwork freelancer, I've competed with developers globally for many years. To remain competitive in this dynamic and highly aggressive market, I continuously improve my coding efficiency and quality. I am committed to mastering new technologies and frameworks, ensuring that I always deliver the best possible solutions for my clients.

image

With over 70 projects completed and countless lessons learned, and consistently earning above the market average, I frequently engage in critical reflection and discussions with my teams:

  • How can we deliver solutions more rapidly?
  • What is the optimal structure for the project code?
  • How can we develop an architecture that remains relevant and extensible for years to come, even if I leave?
  • Which libraries and approaches are currently popular?
  • How can we enhance the readability of my code?
  • What are the best practices for deploying swiftly while minimizing the risk of deployment issues at critical times?
  • Most crucially, how to not fuck up the entire project after many months of effort?

This led me to the realization that I need to create a tool that not only enhances the speed of my work but also ensures consistently high quality, that is not depending on if I'm sleepy or if skip my workout today.

The Project

Vovk.ts combines several approaches borrowed from other projects with a pinch of creativity.

  • The most powerful framework today? Next.js.
  • The simplest and most robust deployment method for Next.js? Vercel (though they aren't sponsors yet).
  • The most efficient way to invoke server-side code from the client-side? tRPC or something similar? Check.
  • The optimal structure for the app? NestJS, with decorators and Controller-Service-Repository pattern? Double check.
  • Need an edge runtime that delivers backend services geographically closer to users? Included.
  • Prefer the reliability of good old REST over custom protocols? Absolutely.
  • Text streaming capabilities for AI applications? Seamless.
  • TypeScript for safer and cleaner code? Always.

Vovk.ts encapsulates all the lessons from my extensive experience into one elegant solution, serving as a streamlined add-on to the Next.js API. With less than 1600 lines of code, it’s the perfect tool for developing full-stack applications that prioritize both speed and quality.

Enjoy! I'm confident you will.

Features

  • 👵 REST API: Utilize the good old REST without the need for custom protocols.
  • 🪄 RPC Capabilities: No need to choose between REST and RPC anymore — use both.
  • 🚢 Simplified Architecture: Run your full-stack Next.js application on a single port, avoiding the complexities of a monorepo.
  • 🧐 Optimized Code Quality: Implement the Service-Controller-Repository pattern for peak code efficiency.
  • 🚄 Edge Runtime Support: Access edge computing capabilities straight out of the box.
  • 🌿 Lightweight: Streamlined for efficiency and speed.
  • 🤏 Compact Client Code: Generates minimal code, essentially a neat wrapper over the fetch function.
  • 📦 Effortless Distribution: Easily bundle and distribute your client API library using Webpack, Rollup, or any other bundler.
  • 🤝 Seamless Integration with Next.js App Router: Works perfectly with standard Next.js APIs like Response, headers, and redirect.
  • 🧠 User-Friendly: Designed for easy learning and adoption.
  • 📱 Broad Compatibility: Integrates effortlessly with React Native and other JavaScript environments.
  • 🤖 Text Streaming: Supports streaming for Large Language Model applications using disposable async generators.
  • 📄 Static API Generation: Leverage generateStaticAPI to deploy your static JSON API.
  • ⚙️ Web Worker Support: Enhance browser performance with multi-threading capabilities.
  • 🏎️ High Performance: Delivers rapid execution both client-side and server-side.
  • 🔧 Fully Customizable: Tailor to meet specific project requirements.

Glossary

  • Service-Controller-Repository pattern: A design pattern that separates the business logic (Service), request handling (Controller), and data access (Repository) into distinct layers.
  • REST: Representational State Transfer, an architectural style for designing networked applications. A REST API uses standard HTTP methods like GET, POST, PUT, and DELETE to perform CRUD (create, read, update and delete) operations. Learn more about REST here (opens in a new tab).
  • RPC: Remote Procedure Call, an approach that allows a client application to invoke server-side functions. Find out more about RPC on Wikipedia (opens in a new tab).
  • WPC: Worker Procedure Call, an approach that enables a front-end application to call functions running in a Web Worker. First introduced in Vovk.ts. Read more about Web Workers on MDN (opens in a new tab).
  • Edge Computing: A distributed computing paradigm that brings computation and data storage closer to the location where it is needed. More details can be found on Wikipedia (opens in a new tab).
  • Static Class: A class that cannot be instantiated and is used to group related methods and properties. JavaScript/TypeScript does not have a built-in static keyword for classes, but it is a common pattern in other languages like Java and C#. Instead, TypeScript uses the static keyword to define static methods and properties on a regular class.
  • Disposable Object: An object that is used once and then discarded. In TypeScript, a disposable object is created with using or await using (instead of let or const) and is automatically disposed of after the code block has ended by calling a method under Symbol.dispose or Symbol.asyncDispose key. For more information, see TypeScript 5.2 Documentation (opens in a new tab).
  • Async Generator: A function that returns an AsyncIterable object.
  • Async Iterable: An object that can be used in a for await...of loop. It is similar to an Iterable, but the Symbol.asyncIterator method returns an AsyncIterator object. Learn more about async iterables on MDN (opens in a new tab).
  • Iterable: An object that can be used in a for...of loop. The Symbol.iterator method returns an Iterator object. Find out more about iterables on MDN (opens in a new tab).

If you have any additional questions or need further clarification, please don't hesitate to create an issue on the vovk.dev GitHub repository (opens in a new tab).

♥️ Support My Work

Balancing family, a full-time job, restorative sleep, and open-source projects is a demanding endeavor. I am deeply appreciative of everyone who supports my efforts. If you admire my work and wish to contribute, please consider sponsoring me on GitHub (opens in a new tab).

If you want to reach out, my contact information is available on my Github profile (opens in a new tab).