This repository has been archived by the owner. It is now read-only.
DEPRECATED: The community driven fork of Iris. The fastest web framework for Golang!
Clone or download
Latest commit ae34b71 Sep 3, 2017
Failed to load latest commit information.
.github Siris #40 Added PULL_REQUEST_TEMPLATE and ISSUE_REQUEST_TEMPLATE (#41) Jul 12, 2017
cache API-CHANGE: Sessions Aug 1, 2017
configuration Add Option to enable QUIC Support for TLS Server Aug 1, 2017
context Fix router, Improve Coverage Aug 10, 2017
core Add Travis hostalias Aug 10, 2017
coverage-tests/fixtures Add more tests... Aug 10, 2017
httptest Improve and Fix the middleware registration and usage Aug 10, 2017
sessions GoLint fixes Aug 1, 2017
typescript API-CHANGE: race-condition and changes that comes with it... Aug 1, 2017
vendor RELEASE v7.4.0 Sep 3, 2017
view Add options to view.HTMLEngine Aug 10, 2017
websocket Fix router, Improve Coverage Aug 10, 2017
.codecov.yml Add codecov.yml Aug 10, 2017
.gitattributes Update Vendor Aug 1, 2017
.gitignore Fix router, Improve Coverage Aug 10, 2017
.travis.yml Go 1.9 Sep 3, 2017
AUTHORS Add AUTHORS and some git tweaks. Jul 12, 2017 Refactor readme (#18) Jun 29, 2017
Gopkg.lock RELEASE v7.4.0 Sep 3, 2017
Gopkg.toml RELEASE v7.4.0 Sep 3, 2017 hints: fix typo (#63) Jul 30, 2017 Go 1.9 Sep 3, 2017
LICENSE Refactor readme (#18) Jun 29, 2017
Makefile More Tests and a fix for the Wildcard routing Aug 10, 2017 Go 1.9 Sep 3, 2017 Fix links to Jun 24, 2017 Refactor readme (#18) Jun 29, 2017
appveyor.yml Go1.8.3 Aug 1, 2017
configuration.go Allow per host configuration for supervisor#RegisterOn****Hook's Aug 10, 2017
context.go Add PartyFunc Aug 10, 2017
doc.go Allow per host configuration for supervisor#RegisterOn****Hook's Aug 10, 2017
go-siris.jpg Update to start a new community "Siris" Jun 22, 2017 Fix router, Improve Coverage Aug 10, 2017
siris.go RELEASE v7.4.0 Sep 3, 2017
siris_deprecated.go GoLint fixes Aug 1, 2017
siris_test.go Coverage Aug 10, 2017


A fast, cross-platform and efficient web framework with robust set of well-designed features, written entirely in Go.

Build status Report card Support forum Examples Godocs Chat

Build your own web applications and portable APIs with the highest performance and countless potentials.

If you're coming from Node.js world, this is the expressjs++ equivalent for the Go Programming Language.

Table of contents


The only requirement is the Go Programming Language, at least version 1.9

$ go get -u

Siris uses the vendor directory feature, so you get truly reproducible builds, as this method guards against upstream renames and deletes.

package main

import (

// User is just a bindable object structure.
type User struct {
    Username  string `json:"username"`
    Firstname string `json:"firstname"`
    Lastname  string `json:"lastname"`
    City      string `json:"city"`
    Age       int    `json:"age"`

func main() {
    app := siris.New()

    // Define templates using the std html/template engine.
    // Parse and load all files inside "./views" folder with ".html" file extension.
    // Reload the templates on each request (development mode).
    app.AttachView(view.HTML("./views", ".html").Reload(true))

    // Regster custom handler for specific http errors.
    app.OnErrorCode(siris.StatusInternalServerError, func(ctx context.Context) {
    	// .Values are used to communicate between handlers, middleware.
    	errMessage := ctx.Values().GetString("error")
    	if errMessage != "" {
    		ctx.Writef("Internal server error: %s", errMessage)

    	ctx.Writef("(Unexpected) internal server error")

    app.Use(func(ctx context.Context) {
    	ctx.Application().Logger().Info("Begin request for path: %s", ctx.Path())

    // app.Done(func(ctx context.Context) {})

    // Method POST: http://localhost:8080/decode
    app.Post("/decode", func(ctx context.Context) {
    	var user User
    	ctx.Writef("%s %s is %d years old and comes from %s", user.Firstname, user.Lastname, user.Age, user.City)

    // Method GET: http://localhost:8080/encode
    app.Get("/encode", func(ctx context.Context) {
    	doe := User{
    		Username:  "Johndoe",
    		Firstname: "John",
    		Lastname:  "Doe",
    		City:      "Neither FBI knows!!!",
    		Age:       25,


    // Method GET: http://localhost:8080/profile/anytypeofstring
    app.Get("/profile/{username:string}", profileByUsername)

    usersRoutes := app.Party("/users", logThisMiddleware)
    	// Method GET: http://localhost:8080/users/42
    	usersRoutes.Get("/{id:int min(1)}", getUserByID)
    	// Method POST: http://localhost:8080/users/create
    	usersRoutes.Post("/create", createUser)

    // Listen for incoming HTTP/1.x & HTTP/2 clients on localhost port 8080.
    app.Run(siris.Addr(":8080"), siris.WithCharset("UTF-8"))

func logThisMiddleware(ctx context.Context) {
    ctx.Application().Logger().Info("Path: %s | IP: %s", ctx.Path(), ctx.RemoteAddr())

    // .Next is required to move forward to the chain of handlers,
    // if missing then it stops the execution at this handler.

func profileByUsername(ctx context.Context) {
    // .Params are used to get dynamic path parameters.
    username := ctx.Params().Get("username")
    ctx.ViewData("Username", username)
    // renders "./views/users/profile.html"
    // with {{ .Username }} equals to the username dynamic path parameter.

func getUserByID(ctx context.Context) {
    userID := ctx.Params().Get("id") // Or convert directly using: .Values().GetInt/GetInt64 etc...
    // your own db fetch here instead of user :=...
    user := User{Username: "username" + userID}


func createUser(ctx context.Context) {
    var user User
    err := ctx.ReadForm(&user)
    if err != nil {
    	ctx.Values().Set("error", "creating user, read and parse form failed. "+err.Error())
    // renders "./views/users/create_verification.html"
    // with {{ . }} equals to the User object, i.e {{ .Username }} , {{ .Firstname}} etc...
    ctx.ViewData("", user)

Feature Overview

Feature More Information
high performance benchmark
Authentication basicauth oauth2 TODO JWT
Cache cache-markdown
Certificates letsencrypt custom
Compression gzip and deflate
Decode Json, Forms json form
Encode Json, JsonP, XML, Forms, Markdown json cache-markdown
Error handling custom [error handler] [panic handler]
http2 push TODO add Documentation
Limits RequestBody TODO add docu
Localization i18n
Logger Engines file-logger request-logger
Routing routing
Sessions sessions
Static Files file-server
Subdomains and Grouping subdomains
Template HTML, django, pug(jade), handlebars, amber views
Tooling Typescript integration + Web IDE
Websockets websockets


Small but practical examples --they cover each feature.

Wanna create your own fast URL Shortener Service Using Siris? --click here to learn how.

Godocs --for deep understanding.

Hints --some performance hints and tooling.


  • Chat Ask the Community for help
  • Post a feature request or report a bug, will help to make the framework even better.
  • ⭐️ and watch the project, will notify you about updates.
  • 🌎 publish an article or share a tweet about siris.

Third Party Middleware



The httptest package is your way for end-to-end HTTP testing, it uses the httpexpect library created by our friend, gavv.

A simple test is located to intermediate/httptest/main_test.go


The Siris philosophy is to provide robust tooling for HTTP, making it a great solution for single page applications, web sites, hybrids, or public HTTP APIs.

Siris does not force you to use any specific ORM or template engine. With support for the most popular template engines, you can quickly craft your perfect application.


The original author of Iris is @kataras. Before we forked to Siris.

However the real Success of Siris belongs to you with your bug reports and feature requests that made this Framework so Unique.


Current: 7.4.0

Each new release is pushed to the master. It stays there until the next version. When a next version is released then the previous version goes to its own branch with as its import path (and its own vendor folder), in order to keep it working "for-ever".

Community members can request additional features or report a bug fix for a specific siris version.

Should I upgrade my Siris?

Developers are not forced to use the latest Siris version, they can use any version in production, they can update at any time they want.

Testers should upgrade immediately, if you're willing to use Siris in production you can wait a little more longer, transaction should be as safe as possible.

Where can I find older versions?

Each Siris version is independent. Only bug fixes, Router's API and experience are kept.

Previous versions can be found at releases page.

Previous Iris versions are archived at iris archive


Unless otherwise noted, the source files are distributed under the BSD-3-Clause License found in the LICENSE file.

Note that some third-party packages that you use with Siris may requires different license agreements.