Code Monkey home page Code Monkey logo

i-love-flamingo / flamingo Goto Github PK

View Code? Open in Web Editor NEW
427.0 23.0 47.0 3.78 MB

Flamingo Framework and Core Library. Flamingo is a go based framework to build pluggable applications. Focus is on clean architecture, maintainability and operation readiness.

Home Page: http://www.flamingo.me

License: MIT License

Go 99.56% Makefile 0.01% CUE 0.42%
framework golang golang-library web-framework hacktoberfest application-framework dependency-injection go modularization webframework

flamingo's Introduction

Flamingo Framework

Go Report Card GoDoc Tests Release TODOs Slack

Flamingo is a web framework based on Go.
It is designed to build pluggable and maintainable web projects. It is production ready, field tested and has a growing ecosystem.

Quick start

See "examples/hello-world"

Initialize an empty project:

mkdir helloworld
cd helloworld
go mod init helloworld

Create your project main file:

cat main.go
package main

import (
	"flamingo.me/dingo"
	"flamingo.me/flamingo/v3"
)

func main() {
	flamingo.App([]dingo.Module{
	})
}

If you then start your project you will see a list of registered commands:

go run main.go

It will print something like:

Flamingo main

Usage:
  main [command]

Examples:
Run with -h or -help to see global debug flags

Available Commands:
  config      Config dump
  handler     Dump the Handlers and its registered methods
  help        Help about any command
  routes      Routes dump
  serve       Default serve command - starts on Port 3322

Flags:
  -h, --help   help for main

Use "main [command] --help" for more information about a command.

To start the server use the following sub command:

go run main.go serve

And open http://localhost:3322

Hello World Example:

To extend this empty flamingo project with a "Hello World" output please create a new module "helloworld" like this:

mkdir helloworld
cat helloworld/module.go

With the following code in module.go:

package helloworld

import (
        "context"
        "net/http"
        "strings"
        
        "flamingo.me/dingo"
        "flamingo.me/flamingo/v3/framework/web"
)

type Module struct{}

func (*Module) Configure(injector *dingo.Injector) {
        web.BindRoutes(injector, new(routes))
}

type routes struct{}

func (*routes) Routes(registry *web.RouterRegistry) {
        registry.Route("/", "home")
        registry.HandleAny("home", indexHandler)
}

func indexHandler(ctx context.Context, req *web.Request) web.Result {
        return &web.Response{
            Status: http.StatusOK,
            Body:   strings.NewReader("Hello World!"),
        }
}

This file now defines a very simple module, that can be used in the Flamingo bootstrap. In this case it registers a new handler that renders a simple "Hello World" message and binds the route "/" to this handler. Now please include this new module in your existing main.go file:

package main

import (
	"flamingo.me/dingo"
	"flamingo.me/flamingo/v3"
	"helloworld/helloworld"
)

func main() {
	flamingo.App([]dingo.Module{
        new(helloworld.Module),
	})
}

If you now run the server again

go run main.go serve

And open http://localhost:3322 you will see your "Hello World!" output.

Getting started

To learn more about Flamingo you can check out the full hello-world example tutorial and read the documentation under docs.flamingo.me

Getting Help

The best way to ask a question is the #flamingo channel on gophers.slack.com

If you are not yet in the Gophers slack, get your invitation here: https://invite.slack.golangbridge.org/

Other ways are:

  • Ask in stackoverflow (we try to keep track of new questions)
  • Write us an email: [email protected]
  • Open an issue in github for bugs and feature requests

Framework Details

Feature List

  • dependency injection with Dingo
  • Flexible templating engines. (gotemplates and pugtemplates)
  • configuration concepts using cue with support for multiple config areas and additional config contexts
  • A module concept for building modular and pluggable applications based on Dingo
  • Authentication concepts and security middleware
  • Flexible routing with support for prefix routes and reverse routing
  • Web controller concept with request/response abstraction; form handling etc
  • Operational readiness: logging, (distributed) tracing, metrics and healthchecks with separate endpoint
  • Localisation support
  • Commands using Cobra
  • Event handling
  • Sessionhandling and Management (By default uses Gorilla)

Ecosystem

  • GraphQL Module (and therefore support to build SPA and PWAs on top of it)
  • Caching modules providing resilience and caching for external APIs calls.
  • pugtemplate template engine for server side rendering with the related frontend tooling Flamingo Carotene
  • Flamingo Commerce is an active projects that offer rich and flexible features to build modern e-commerce applications.

flamingo's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flamingo's Issues

web.Responder error handling for nil errors

// ServerErrorWithCodeAndTemplate error response with template and http status code
func (r *Responder) ServerErrorWithCodeAndTemplate(err error, tpl string, status uint) *ServerErrorResponse {
	errstr := err.Error()

err should be checked for nil.

core/locale: bad performance for translations endpoint in debug mode

We noticed that the translations endpoint in the core/locale module is really slow in flamingo debug mode. This is because in debug mode, we reload the translation files for each translation (see TranslateLabel and loadFiles methods). In the translations endpoint we list every translation, so we reload the translation files hundreds of times. It would make sense to only reload when necessary (e. g. a translation file changed).

web: Add context to error logs

Hello friends,

while analysing an issue with our SSO by investigating our application logs, I noticed
that the function called here:
https://github.com/i-love-flamingo/flamingo/blob/master/core/auth/oauth/oidc.go#L310

Does not consider the request context when logging the error
https://github.com/i-love-flamingo/flamingo/blob/master/framework/web/result.go#L430

This would require the function to be able to receive a context and log the error using WithContext
The adjustment would help with log analysis.
As this function is used across several classes, we could also create a new function and slowly migrate.

Config errors are not explained well

e.g.:

DEBUG=1 CONTEXT=dev:testproducts go run main.go serve
panic: error converting YAML to JSON: yaml: line 131: did not find expected key

goroutine 1 [running]:
flamingo.me/flamingo/v3/framework/config.loadYamlConfig(0xc00047f680, 0xc000276000, 0xc49, 0xc80, 0xe76, 0x0)
/Users/daniel.poetzinger/Development/GOMOD/flamingo/flamingo/framework/config/loader.go:206 +0x1a2
flamingo.me/flamingo/v3/framework/config.loadYamlFile(0xc00047f680, 0xc000300fa0, 0xd, 0xd, 0x1)
/Users/daniel.poetzinger/Development/GOMOD/flamingo/flamingo/framework/config/loader.go:181 +0x222

Maybe the lines around the error can be printed - its not clear which file etc its referreing to

Problem in bootstrapping graphql module

This is the error that is thrown when I try to run go generate . as mentioned in the graphql module readme.

2020/06/16 21:19:46 app: config load: root: flamingo.me/flamingo/v3/core/oauth.Module:4:10: cue: marshal error at path core.oauth.secret: cannot convert incomplete value "string" to JSON
exit status 1
main.go:4: running "go": exit status 1

Any idea?

core/locale: Data race in translation_service

We just witnessed a race condition in the translation service. We should add some sort of mutex to avoid that.

==================
==================
WARNING: DATA RACE
Read at 0x00c0005215c9 by goroutine 132:
  flamingo.me/flamingo/v3/core/locale/infrastructure.(*TranslationService).loadFiles()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/core/locale/infrastructure/translation_service.go:127 +0x64
  flamingo.me/flamingo/v3/core/locale/infrastructure.(*TranslationService).initAndLoad()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/core/locale/infrastructure/translation_service.go:154 +0x84
  flamingo.me/flamingo/v3/core/locale/infrastructure.(*TranslationService).Translate()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/core/locale/infrastructure/translation_service.go:70 +0x4f
  go.aoe.com/flamingo-om3/v3/om3flight/interfaces/controller.(*FlightAPIController).JSONError()
      /builds/shared/flamingo/flamingo-om3/om3flight/interfaces/controller/flightapicontroller.go:222 +0x401
  go.aoe.com/flamingo-om3/v3/om3flight/interfaces/controller.(*FlightAPIController).SearchFlightsAction()
      /builds/shared/flamingo/flamingo-om3/om3flight/interfaces/controller/flightapicontroller.go:98 +0x6c7
  go.aoe.com/flamingo-om3/v3/om3flight/interfaces/controller.(*FlightAPIController).SearchFlightsAction-fm()
      /builds/shared/flamingo/flamingo-om3/om3flight/interfaces/controller/flightapicontroller.go:81 +0x74
  flamingo.me/flamingo/v3/framework/web.(*handler).ServeHTTP.func3()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/handler.go:163 +0x481
  flamingo.me/flamingo/v3/framework/web.(*FilterChain).Next()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/filter.go:58 +0x24d
  flamingo.me/flamingo/v3/framework/web/filter.(*MetricsFilter).Filter()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/filter/request_metrics_filter.go:84 +0x7a
  flamingo.me/flamingo/v3/framework/web.(*FilterChain).Next()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/filter.go:63 +0x1a2
  flamingo.me/flamingo/v3/framework/web.(*handler).ServeHTTP()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/handler.go:174 +0xc12
  net/http.serverHandler.ServeHTTP()
      /usr/local/go/src/net/http/server.go:2887 +0xca
  net/http.(*conn).serve()
      /usr/local/go/src/net/http/server.go:1952 +0x87d
Previous write at 0x00c0005215c9 by goroutine 36:
  flamingo.me/flamingo/v3/core/locale/infrastructure.(*TranslationService).loadFiles()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/core/locale/infrastructure/translation_service.go:147 +0x199
  flamingo.me/flamingo/v3/core/locale/infrastructure.(*TranslationService).initAndLoad()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/core/locale/infrastructure/translation_service.go:154 +0x84
  flamingo.me/flamingo/v3/core/locale/infrastructure.(*TranslationService).Translate()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/core/locale/infrastructure/translation_service.go:70 +0x4f
  go.aoe.com/flamingo-om3/v3/om3flight/interfaces/controller.(*FlightAPIController).JSONError()
      /builds/shared/flamingo/flamingo-om3/om3flight/interfaces/controller/flightapicontroller.go:222 +0x401
  go.aoe.com/flamingo-om3/v3/om3flight/interfaces/controller.(*FlightAPIController).DeleteSessionFlightAction()
      /builds/shared/flamingo/flamingo-om3/om3flight/interfaces/controller/flightapicontroller.go:134 +0x27c
  go.aoe.com/flamingo-om3/v3/om3flight/interfaces/controller.(*FlightAPIController).DeleteSessionFlightAction-fm()
      /builds/shared/flamingo/flamingo-om3/om3flight/interfaces/controller/flightapicontroller.go:131 +0x74
  flamingo.me/flamingo/v3/framework/web.(*handler).ServeHTTP.func3()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/handler.go:163 +0x481
  flamingo.me/flamingo/v3/framework/web.(*FilterChain).Next()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/filter.go:58 +0x24d
  flamingo.me/flamingo/v3/framework/web/filter.(*MetricsFilter).Filter()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/filter/request_metrics_filter.go:84 +0x7a
  flamingo.me/flamingo/v3/framework/web.(*FilterChain).Next()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/filter.go:63 +0x1a2
  flamingo.me/flamingo/v3/framework/web.(*handler).ServeHTTP()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo/[email protected]/framework/web/handler.go:174 +0xc12
  net/http.serverHandler.ServeHTTP()
      /usr/local/go/src/net/http/server.go:2887 +0xca
  net/http.(*conn).serve()
      /usr/local/go/src/net/http/server.go:1952 +0x87d
Goroutine 132 (running) created at:
  net/http.(*Server).Serve()
      /usr/local/go/src/net/http/server.go:3013 +0x644
  flamingo.me/flamingo-commerce/v3/test/integrationtest.(*testModule).startServer.func1()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo-commerce/[email protected]/test/integrationtest/helper.go:98 +0x6a
Goroutine 36 (running) created at:
  net/http.(*Server).Serve()
      /usr/local/go/src/net/http/server.go:3013 +0x644
  flamingo.me/flamingo-commerce/v3/test/integrationtest.(*testModule).startServer.func1()
      /builds/shared/flamingo/flamingo-om3/.go/pkg/mod/flamingo.me/flamingo-commerce/[email protected]/test/integrationtest/helper.go:98 +0x6a
==================

GOMAXPROCS configurable

Finding from "PET Team":

Der runtime-scheduler hat eine Funktion “GOMAXPROCS”, welche der runtime grob mitteilt wieviele parallele Verarbeitungen sie machen kann. Dieser Wert ist per default die Anzahl der Verfügbaren cores (seit 1.5). In einer Container Umgebung ist das trotz limits die Gesamtanzahl der Cores der darunterlegenden Node.
Da so der go-runtime-scheduler glaubt 4 cpu’s zur Verfügung zu haben, die aber per cgroup auf etwa 2 limitiert sind (aktuell bei kso), versucht go mehr zu parallelisieren als eigentlich möglich ist. Auch das führt zu unnötigem cfs-throtteling. Daher sollten wir das entsprechend des limits pro Projekt konfigurieren.

Ab Kubernetes Version 1.16 könnten wir dem Container exakte Kerne zuweisen (und damit die anderen verstecken). Da wir aber erst bei k8s 1.11 sind und es auch bei 1.16 noch Probleme damit gibt, können wir damit aktuell nicht arbeiten und nicht zeitnah rechnen.

Entweder konfigurieren wir das per Umgebungsvariable pro Projekt und Stage manuell oder automatisiert mit dieser Library von Uber: https://github.com/uber-go/automaxprocs Diese setzt den Wert automatisch zur Startzeit der Applikation. Evt könnte man dies in den Flamingo-Core integrieren? Was meint ihr?

dependencies: Update cobra

Hello friends,
when running Nancy on flamingo it detects two vulnerable dependencies. One seems to be related to cobra

github.com/spf13/cobra v0.0.6

Cobra is currently available in version v1.1.3 https://github.com/spf13/cobra/tags

Approach
I am on flamingo master and execute:

go list -json -m all | docker run --rm -i sonatypecommunity/nancy:latest sleuth

Output

Checking for updates...
Already up-to-date.
pkg:golang/github.com/coreos/[email protected]
3 known vulnerabilities affecting installed version
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ [CVE-2020-15114] In etcd before versions 3.3.23 and 3.4.10, the etcd gateway is a simple TCP prox...                                                                                                                           ┃
┣━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Description        ┃ In etcd before versions 3.3.23 and 3.4.10, the etcd gateway is a simple TCP                                                                                                                               ┃
┃                    ┃ proxy to allow for basic service discovery and access. However, it is                                                                                                                                     ┃
┃                    ┃ possible to include the gateway address as an endpoint. This results in a                                                                                                                                 ┃
┃                    ┃ denial of service, since the endpoint can become stuck in a loop of                                                                                                                                       ┃
┃                    ┃ requesting itself until there are no more available file descriptors to                                                                                                                                   ┃
┃                    ┃ accept connections on the gateway.                                                                                                                                                                        ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ OSS Index ID       ┃ bba60acb-c7b5-4621-af69-f4085a8301d0                                                                                                                                                                      ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Score         ┃ 7.7/10 (High)                                                                                                                                                                                             ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Vector        ┃ CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:N/A:H                                                                                                                                                              ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Link for more info ┃ https://ossindex.sonatype.org/vuln/bba60acb-c7b5-4621-af69-f4085a8301d0?component-type=golang&component-name=github.com%2Fcoreos%2Fetcd&utm_source=nancy-client&utm_medium=integration&utm_content=1.0.15 ┃
┗━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ [CVE-2020-15136] In ectd before versions 3.4.10 and 3.3.23, gateway TLS authentication is only ap...                                                                                                                           ┃
┣━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Description        ┃ In ectd before versions 3.4.10 and 3.3.23, gateway TLS authentication is                                                                                                                                  ┃
┃                    ┃ only applied to endpoints detected in DNS SRV records. When starting a                                                                                                                                    ┃
┃                    ┃ gateway, TLS authentication will only be attempted on endpoints identified                                                                                                                                ┃
┃                    ┃ in DNS SRV records for a given domain, which occurs in the                                                                                                                                                ┃
┃                    ┃ discoverEndpoints function. No authentication is performed against                                                                                                                                        ┃
┃                    ┃ endpoints provided in the --endpoints flag. This has been fixed in versions                                                                                                                               ┃
┃                    ┃ 3.4.10 and 3.3.23 with improved documentation and deprecation of the                                                                                                                                      ┃
┃                    ┃ functionality.                                                                                                                                                                                            ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ OSS Index ID       ┃ d373dc3f-aa88-483b-b501-20fe5382cc80                                                                                                                                                                      ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Score         ┃ 6.5/10 (Medium)                                                                                                                                                                                           ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Vector        ┃ CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N                                                                                                                                                              ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Link for more info ┃ https://ossindex.sonatype.org/vuln/d373dc3f-aa88-483b-b501-20fe5382cc80?component-type=golang&component-name=github.com%2Fcoreos%2Fetcd&utm_source=nancy-client&utm_medium=integration&utm_content=1.0.15 ┃
┗━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ [CVE-2020-15115] etcd before versions 3.3.23 and 3.4.10 does not perform any password length vali...                                                                                                                           ┃
┣━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Description        ┃ etcd before versions 3.3.23 and 3.4.10 does not perform any password length                                                                                                                               ┃
┃                    ┃ validation, which allows for very short passwords, such as those with a                                                                                                                                   ┃
┃                    ┃ length of one. This may allow an attacker to guess or brute-force users'                                                                                                                                  ┃
┃                    ┃ passwords with little computational effort.                                                                                                                                                               ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ OSS Index ID       ┃ 5def94e5-b89c-4a94-b9c6-ae0e120784c2                                                                                                                                                                      ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Score         ┃ 5.8/10 (Medium)                                                                                                                                                                                           ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Vector        ┃ CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N                                                                                                                                                              ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Link for more info ┃ https://ossindex.sonatype.org/vuln/5def94e5-b89c-4a94-b9c6-ae0e120784c2?component-type=golang&component-name=github.com%2Fcoreos%2Fetcd&utm_source=nancy-client&utm_medium=integration&utm_content=1.0.15 ┃
┗━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
pkg:golang/github.com/gorilla/[email protected]
1 known vulnerabilities affecting installed version
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ CWE-190: Integer Overflow or Wraparound                                                                                                                                                                                              ┃
┣━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Description        ┃ The software performs a calculation that can produce an integer overflow or                                                                                                                                     ┃
┃                    ┃ wraparound, when the logic assumes that the resulting value will always be                                                                                                                                      ┃
┃                    ┃ larger than the original value. This can introduce other weaknesses when                                                                                                                                        ┃
┃                    ┃ the calculation is used for resource management or execution control.                                                                                                                                           ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ OSS Index ID       ┃ 5f259e63-3efb-4c47-b593-d175dca716b0                                                                                                                                                                            ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Score         ┃ 7.5/10 (High)                                                                                                                                                                                                   ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ CVSS Vector        ┃ CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H                                                                                                                                                                    ┃
┣━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Link for more info ┃ https://ossindex.sonatype.org/vuln/5f259e63-3efb-4c47-b593-d175dca716b0?component-type=golang&component-name=github.com%2Fgorilla%2Fwebsocket&utm_source=nancy-client&utm_medium=integration&utm_content=1.0.15 ┃
┗━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

2 Vulnerable Packages

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Summary                       ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━┫
┃ Audited Dependencies    ┃ 176 ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━┫
┃ Vulnerable Dependencies ┃ 2   ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━┛

Checking the dependency graph:

go mod graph | grep 'github.com/gorilla/websocket'
> github.com/spf13/[email protected] github.com/gorilla/[email protected]

go mod graph | grep 'viper'
> github.com/spf13/[email protected] github.com/spf13/[email protected]

Memory stats are not updated

Hello Flamingo team,

due to an issue in https://github.com/census-instrumentation/opencensus-go, the memory stats do not seem to be updated for opencensus.
In line

if err := runmetrics.Enable(runmetrics.RunMetricOptions{
EnableCPU: true,
EnableMemory: true,
}); err != nil {
the RunMetricOptions are instantiated without setting UseDerivedCumulative.
Consequently, in line https://github.com/census-instrumentation/opencensus-go/blob/052120675fac2ace91dc2c01e5f63c3e6ec62f04/plugin/runmetrics/producer.go#L133 only producer.deprecatedMemStats is instantiated and not producer.memStats.
But, the latter seems to be required to read current memory metrics => see https://github.com/census-instrumentation/opencensus-go/blob/052120675fac2ace91dc2c01e5f63c3e6ec62f04/plugin/runmetrics/producer.go#L169
A possible workaround might be, to set UseDerivedCumulative in framework/opencensus/module.go

Config aliasing

For upgrading configuration paths it would be nice to support aliasing, just like go type aliasing.

Document go:generate usage

E.g. for mockery:
Use

//go:generate go run github.com/vektra/mockery/cmd/mockery

Instead of

//go:generate mockery

to ensure reproducable usage without installing a, potentially random, version of mockery somewhere in your PATH

Sane web.Result defaults

Works: new(web.Responder).Data(data)
Doesn't work: &web.DataResponse{Data: data}

Both should work, so for basic usage it's possible to use functions for actions with creating bigger modules

Default errorhandling for templates

Empty projects end up with the message
Could not find the template error/withCode.html
eveywhere, because the 404 template is not found, triggers a 50x error, which defaults to the error/withCode.html template.
This is totally unclear/unusable for new adopters.

flamingo.static.file controller

The flamingo.static.file controller is basically unusuable.

We need configuration/param for the path, rename to flamingo.static (because it actually serves folders and directory listings) and check for file-only serving

Redigo update

go: warning: github.com/gomodule/[email protected]+incompatible: retracted by module author: Old development version not maintained or published.
go: to switch to the latest unretracted version, run:
	go get github.com/gomodule/redigo@latest

Configuring Flamingo for HTTPS

How can I configure Flamingo to serve over HTTPS? I've looked all over in the docs, but found no mentions of how to do this. Any help would be greatly appreciated.

Future of pact utils

The utils in core are somewhat outdated.
Let's discuss to extract it into a separate repository for v4

Flamingo-Commerce priceFormatService should move to locale package

flamingo-commerce got new feature for its "commercePriceFormat" to configure price format "default" and per "currency"
This should move to flamingo and flamingo-commerce should reuse the flamingo service.

Currently flamingo-commerce reads from "locale.accounting.*" which is not nice anyway

License

Check compatibility with pkg.go.dev.

Focus items in RESTful API

hello.
Whether optimization of the REST API project will be considered later?

I intend to use this for RESTful projects that do not require the functionality of templates

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Edited/Blocked

These updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox.

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

docker-compose
core/auth/example/docker-compose.yml
  • quay.io/dexidp/dex v2.28.1
  • quay.io/dexidp/dex v2.28.1
  • quay.io/keycloak/keycloak 24.0.3
  • quay.io/keycloak/keycloak 24.0.3
core/oauth/example/docker-compose.yml
  • quay.io/dexidp/dex v2.28.1
github-actions
.github/workflows/daily.yml
  • actions/checkout v4
  • actions/setup-go v5
.github/workflows/golangci-lint.yml
  • actions/checkout v4
  • actions/setup-go v5
  • golangci/golangci-lint-action v5
.github/workflows/main.yml
  • actions/checkout v4
  • actions/setup-go v5
  • actions/checkout v4
  • actions/setup-go v5
  • irongut/CodeCoverageSummary v1.3.0
  • marocchino/sticky-pull-request-comment v2
  • actions/checkout v4
  • actions/setup-go v5
.github/workflows/semanticore.yml
  • actions/checkout v4
  • actions/setup-go v5
gomod
go.mod
  • go 1.21
  • contrib.go.opencensus.io/exporter/jaeger v0.2.1
  • contrib.go.opencensus.io/exporter/prometheus v0.4.2
  • contrib.go.opencensus.io/exporter/zipkin v0.1.2
  • cuelang.org/go v0.0.15
  • flamingo.me/dingo v0.2.10
  • github.com/coreos/go-oidc/v3 v3.10.0
  • github.com/ghodss/yaml v1.0.0
  • github.com/gofrs/uuid v4.4.0+incompatible
  • github.com/golang-jwt/jwt/v5 v5.2.1
  • github.com/google/go-cmp v0.6.0
  • github.com/gorilla/securecookie v1.1.2
  • github.com/gorilla/sessions v1.2.2
  • github.com/hashicorp/golang-lru/v2 v2.0.7
  • github.com/leekchan/accounting v0.3.1
  • github.com/nicksnyder/go-i18n v0.0.0-20180814031359-04f547cc50da@04f547cc50da
  • github.com/openzipkin/zipkin-go v0.4.2
  • github.com/pact-foundation/pact-go v0.0.13
  • github.com/rbcervilla/redisstore/v9 v9.0.0
  • github.com/redis/go-redis/v9 v9.5.1
  • github.com/spf13/cobra v1.8.0
  • github.com/spf13/pflag v1.0.5
  • github.com/stretchr/testify v1.9.0
  • github.com/zemirco/memorystore v0.0.0-20160308183530-ecd57e5134f6@ecd57e5134f6
  • go.opencensus.io v0.24.0
  • go.uber.org/automaxprocs v1.5.3
  • go.uber.org/zap v1.27.0
  • golang.org/x/oauth2 v0.19.0
  • golang.org/x/sync v0.7.0
regex
core/security/application/doc.go
  • github.com/vektra/mockery/v2 v2.42.3
core/security/application/role/doc.go
  • github.com/vektra/mockery/v2 v2.42.3
core/security/application/voter/doc.go
  • github.com/vektra/mockery/v2 v2.42.3
core/security/domain/doc.go
  • github.com/vektra/mockery/v2 v2.42.3
core/security/interface/middleware/doc.go
  • github.com/vektra/mockery/v2 v2.42.3

  • Check this box to trigger a request for Renovate to run again on this repository

Prefixrouter accepts repeated prefixes

The prefixrouter accepts requests to /prefix/prefix/ as / for /prefix

For full prefix this seems to be fine (inkl. host)

by @Ompluscator

the reason why flamingo doesn't recognize here /prefix/prefix is probably because BASE_PATH is now full domain "https://example.com/prefix", not just "/prefix"
^^ maybe Mr @bastian.ike can check this issue with flamingo core router

Security issue in github.com/satori/go.uuid

Hello Flamingo team,

the library github.com/satori/go.uuid has a security issue (see https://avd.aquasec.com/nvd/2021/cve-2021-3538/ for details). This library is used in Flamingo core:

It would be great, if you could replace it by a library, which does not suffer from this issue (e.g. https://github.com/gofrs/uuid or https://github.com/google/uuid).

Thanks for your help.

BR, Michael

error in DataResponse should not trigger TemplateEngine reponse

If Data Response fails then the 500 error template is shown.

Expected: A json error format (?)

Example stack

2019-05-17T14:13:07.643+0200 ERROR web/result.go:386 json: unsupported type: ....
flamingo/flamingo/core/zap/logger.go:77
flamingo.me/flamingo/v3/framework/web.(*Responder).ServerError
flamingo/flamingo/framework/web/result.go:386
flamingo.me/flamingo/v3/framework/controller.(*Error).Error
flamingo/flamingo/framework/controller/error.go:28
flamingo.me/flamingo/v3/framework/web.(*handler).ServeHTTP
flamingo/flamingo/framework/web/handler.go:217
flamingo.me/flamingo/v3/framework/prefixrouter.(*FrontRouter).ServeHTTP
flamingo/flamingo/framework/prefixrouter/front_router.go:136

web: SessionFromContext

We should document the intention of web.SessionFromContext function.

The session should be an explicit parameter if needed.

Decouple healthcheck from other modules

At the moment, the healthcheck module has a hard dependency on the session backend, but does not declare a dependency to the session module.

A similar situation is given for the auth check, but here the default setting is at least deactivated.

The healthcheck module should be usable in projects without sessions or auth, too.

I sugesst to move specific checks to their corresponding modules.

Adapt to go 1.16

Go 1.16 brings a lot of nice enhancements, so we should evaluate if we can adapt them.

NotifyContext

https://tip.golang.org/pkg/os/signal/#NotifyContext

signals := make(chan os.Signal, 1)
shutdownComplete := make(chan struct{}, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)

embed

https://tip.golang.org/pkg/embed/
(not used yet, but might be useful to integrate something?)

metrics

https://tip.golang.org/pkg/runtime/metrics/
We should investigate how this extends/replaces opencensus/opentelemetry #179

Go 1.13 errors

Now that go 1.14 is released we should:

  • drop go 1.12 compatibility shim (fmtErrorf for %w)
  • move everything to go errors

Easy start with templates and assets

Document the minimum requirements such as:

package main

import (
	"flamingo.me/dingo"
	"flamingo.me/flamingo/v3"
	"flamingo.me/flamingo/v3/core/gotemplate"
)

func main() {
	flamingo.App([]dingo.Module{
		new(gotemplate.Module),
	})
}
- name: index
  path: /
  controller: flamingo.render(tpl="index")
- name: static
  path: /asset/*name
  controller: flamingo.static.file

Use real port information in `ServerStartEvent`

Without further configuration Flamingo starts the server on port 3322 (normal router) or 3210 (prefixrouter) and the systemendpoint on 13210.

However, if you configure :0, the net.Listener will internally choose an available port and there is no possibility to know which ports have been selected.

The ServerStartEvent just has the configuration :0 instead of the "real port".
Also the log messages "Starting HTTP Server ..." and "systemendpoint: Start at ..." have only the configuration value.

Configuration for systemendpoint is flamingo.systemendpoint.serviceAddr
The main port is given by the --addr flag in the serve command (for router and prefixrouter respectively)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.