Are you happy with your logging solution? Would you help us out by taking a 30-second survey? Click here


Lightweight library for web server applications in Swift on macOS and Linux powered by coroutines.

Subscribe to updates I use Epoch

Statistics on Epoch

Number of watchers on Github 1760
Number of open issues 9
Average time to close an issue 20 days
Main language Swift
Average time to merge a PR 5 days
Open pull requests 26+
Closed pull requests 9+
Last commit about 2 years ago
Repo Created about 4 years ago
Repo Last Updated over 1 year ago
Size 5.51 MB
Organization / Authorzewo
Latest Release0.16.0
Page Updated
Do you use Epoch? Leave a review!
View open issues (9)
View Epoch activity
View on github
Fresh, new opensource launches 🚀🚀🚀
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating Epoch for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)


Swift License Slack Travis Codebeat

Why Zewo? Support Community Contributing


Zewo is a lightweight library for web applications in Swift.

What sets Zewo apart?

Zewo is not a web framework. Zewo is a lightweight library for web applications in Swift. Most server-side Swift projects use Grand Central Dispatch (GCD) as the concurrency library of choice. The drawback of using GCD is that its APIs are asynchronous. With async code comes callback hell and we all know it, it's no fun.

Node.js is the best example of how callbacks can be frustrating. Express.js creator TJ Holowaychuk wrote a blog post about Callback vs Coroutines in 2013 and one year later left the Node.js community in favor of Go. There were many reasons for that but one of the main reasons was the concurrency model. Sure we have futures and promises and functional reactive programming. They all mitigate the problem, but the async nature of the code will always be there.

At Zewo we use coroutines. Coroutines allow concurrency while maintaining synchronous APIs. We all learn how to program with synchronous code. We're used to reason about our code synchronously. Being able to use synchronous APIs makes the code much more readable and understandable. Coroutines are also faster than threads, because they live in user-space, unlike threads which are managed by the kernel.

Our implementation of coroutines (which is based on libdill) is single-threaded. This means that you don't have to worry about locks or race conditions. So your code is safer by default. To use all the CPU power available all you have to do is to replicate the work according to the number of logical CPUs available. As an example, this could mean running as many processes of your server as cores in your machine. Rob Pike, one of the creators of Go had a talk called Concurrency is not Parallelism that explains this concept very well. Go also has the philosophy:

Don't communicate by sharing memory. Share memory by communicating.

Like Go, instead of sharing memory and handling state we promote the use of CSP-style concurrency using channels. This pattern brings the abstractions used on the development of distributed systems closer to the way we're used to think about communication. It also aligns well with Swift's mindset of immutability and value types. All of these things contributes to a distinct experince on the server-side Swift.

With Zewo you get:

  • Go-style concurrency
  • Synchronous APIs
  • Incredible performance
  • Safer applications
  • Scalable systems
  • Cleaner code
  • Proper error handling
  • No callback hell
  • No race conditions


If you have any trouble create a Github issue and we'll do everything we can to help you. When stating your issue be sure to add enough details and reproduction steps so we can help you faster. If you prefer you can join our Slack and go to the #help channel too.



We have an amazing community of open and welcoming developers. Join us on Slack to get to know us!


All Zewo modules are released under the MIT license. See LICENSE for details.

Epoch open issues Ask a question     (View All Issues)
  • about 3 years [HTTPServer] Reuse port by default
  • about 3 years [Router] Add back inline compose method
  • about 3 years [SessionMiddleware] Make Session storage of type map
  • about 3 years [HTTP] Add redirect property to Request
  • about 3 years [OpenSSL] `Context` initialiser default `mode` value
  • about 3 years [TrieRouteMatcher] Add wildstar route components to path parameters
  • about 3 years Make cookies a dictionary instead of a set
  • about 3 years Fix bug in MediaType equality
  • about 3 years [PostgreSQL] Parameters are swapped
  • about 3 years Supporting firebase queue
  • about 3 years [HTTPServer] Ambiguous use of 'get(_:middleware:respond:)' with Integer as parameter
  • about 3 years Segmentation Fault, Swift Reflection
  • about 3 years [CLibvenice] Ignore kqueue polling errors caused by the debugger
  • about 3 years [ContentNegotiation] Ensure that request is not an error before attempting to parse it
  • about 3 years [HTTPClient] Needs method for sending multipart/form requests.
  • about 3 years [CLibvenice] Make ip dns solving look into macOS dns settings from System Preferences
  • about 3 years JSON Request hangs with malformed body
  • about 3 years Implement Worker
  • about 3 years Move CI to Circle using Docker files for Linux and regular set up for macOS
  • about 3 years Move Resource into a separate repository
  • about 3 years Create a default middleware stack
  • about 3 years Move content types (json, etc) into separate repositories
  • about 3 years [PostgreSQL] Compile libpq from source
  • about 3 years [SessionMiddleware] SessionMiddleware / SessionInMemoryStorage never cleans up
  • about 3 years [Venice] Add a compiler flag to disable coroutines for debugging purposes
  • about 3 years [HTTPClient] More flexibility with the default headers
  • about 3 years [HTTPClient] Unknown user-agent
  • about 3 years [HTTPServer] Server hangs when using HTTPS and body is bigger than a certain size
  • about 3 years [Zewo] Add Mapper
  • about 3 years [POSIX] Add Regex to POSIX
Epoch open pull requests (View All Pulls)
  • Move log timestamp to Foundation Date
  • Add SQL
  • Add Websocket, WebSocketClient, WebSocketServer
  • File using DispatchIO
  • Add PBKDF2 to Hash.swift
  • POSIX: add Regex, update Regex to swift 3, API changes
  • Use configuration structs instead of Maps
  • Implement TCP/IP in Swift
  • [Mapper] Add InMapper & OutMapper
  • [Resource] Place custom routes after inherited routes to allow proper overriding
  • Fix parsing HTTP Response when Cont.Length not set
  • Fix fileprivate warnings
  • Use String's .unicodeScalars view instead of .characters
  • fixes crash of `URLComponents.queryItems` on Linux
  • Update libvenice to latest libmill
  • [SessionMiddleware] Give SessionMiddleware some attention
  • [Mapper] Fix default plain out-mapping bug
  • Adopt Mapper for Map
  • [Axis] Clean up Map's API, making it more predictable and simple
  • Add EventListener tests
  • Add tests for event emitter logic.
  • Update Venice to libdill
  • Added accessible timeouts to HTTPServer and WebSockets
  • Mapper string representable enum fix
  • Signal addition
  • 0.16.1
Epoch questions on Stackoverflow (View All Questions)
  • Convert formatted date & time string to epoch time in Python
  • Using momentjs to convert date to epoch then back to date
  • Converting to epoch time-stamp adding hours offset
  • Epoch Time conversion with D3
  • Javascript Epoch Time In Days
  • Convert DATETIME to Unix Epoch in Informix
  • Javascript how to convert epoch into local date
  • Convert TLE times (decimal days) to seconds after epoch
  • Convert python datetime to epoch with strftime
  • Epoch time is giving difference of 12:hours
  • Add epoch time with milliseconds to a epoch date/time?
  • Calculate difference between to unix epoch date times?
  • How can I get seconds since epoch in Javascript?
  • Calculating milliseconds from epoch
  • Java - How do I get milliseconds from epoch (1970-01-01)?
  • Why do JSON APIs often return W3C datetime strings instead of UNIX epoch integers?
  • What does the standard Keras model output mean? What is epoch and loss in Keras?
  • How to set epoch for std::chrono::steady_clock in C++?
  • Ruby: How to convert a date-time string to a floating point number in epoch time?
  • Compare date and time in javascript using time in milliseconds since epoch
  • Query epoch time using SQL Server to find date range
  • Get seconds since epoch in Linux
  • MySql select latest epoch in relation to a time in the day
  • Why is the Epoch time different between Java and PHP?
  • Time conversion to Epoch seconds
  • convert standard timestampt to epoch format using awk/nawk on Solaris
  • Python: Initialize a datetime object with seconds since epoch
  • DateTime, the Epoch and DocumentDb
  • JDBC MySQL reading and writing TIMESTAMP as milliseconds since Unix Epoch
  • Splunk Convert Epoch milliseconds to Human Readable Date formatting issue
Epoch list of languages used
Other projects in Swift