ddollar / forego Goto Github PK
View Code? Open in Web Editor NEWForeman in Go
Foreman in Go
When you have time (no rush), would you be able to push out a new release? There's some helpful fixes in master that haven't been released yet.
forego start has no -c option
I was trying to use alternatives to Foreman, since it was a little buggy with file handling, and I noticed some differences.
I set up this gist after writing one for Honch to test and demonstrate the differences:
-p option
, .env file
, PORT variable
, default of 5000
PORT variable
, -p option
, default of 5000
Forego completely ignores the PORT
variable in .env
, which could actually be classified as a completely different issue.
Taking the following Procfile:
# use this with `foreman start`
web: rackup rack.ru -p $PORT
Foreman says:
$ foreman check
valid procfile detected (web)
And starts properly, but forego, no go:
$ forego start
panic: runtime error: index out of range
goroutine 1 [running]:
main.parseProcfile(0x2102fc930, 0x21028c0d8, 0x226218, 0x2102fc930, 0x0, ...)
/Users/luis/local/go/src/github.com/ddollar/forego/procfile.go:56 +0x29e
main.ReadProcfile(0x15a630, 0x8, 0x0, 0x0, 0x0, ...)
/Users/luis/local/go/src/github.com/ddollar/forego/procfile.go:29 +0xbe
main.runStart(0x222560, 0x2102e4020, 0x0, 0x0)
/Users/luis/local/go/src/github.com/ddollar/forego/start.go:49 +0x115
main.main()
/Users/luis/local/go/src/github.com/ddollar/forego/main.go:27 +0x22d
goroutine 3 [syscall]:
os/signal.loop()
/opt/local/go/src/pkg/os/signal/signal_unix.go:21 +0x1c
created by os/signal.init·1
/opt/local/go/src/pkg/os/signal/signal_unix.go:27 +0x2f
go version go1.1.2 darwin/amd64
Removing the comment fixes the issue.
Thank you! ❤️ ❤️ ❤️
forego
doesn't allow to start a subset of processes, like foreman
does.
Given this Procfile
:
web: ./runweb.sh
worker: ./runworker.sh
db: ./rundb.sh
One can run two web processes and one worker with foreman
like so:
$ foreman start web=2,worker=1
web.1 ...
web.2 ...
worker.1 ...
....
There's no need to specify db=0
.
However, forego
will always run the entire set of processes:
$ forego start -c web=2,worker=1
web.1 ...
web.2 ...
worker.1 ...
db.1 ...
...
It's possible to limit to one process name with forego start -c web=2,worker=1 web
, but I'd like to run a subset as with foreman
.
Am I simply not able to figure out the the right way to do it or is it not supported?
http://blog.daviddollar.org/2011/05/06/introducing-foreman.html
This one is awesome. I wonder if there is a chapter 2 of evolution of foreman/forego.
Executing the following doesn't expand the variables like it does with foreman.
web: echo $DATABASE_URI
DATABASE_URI=http://localhost:8081
Is there a way to see all compiled releases?
#47 links to gobuild.io but that seems to be a dead link now.
The releases in the README link to an amd64 build, is it possible to get an i386 release?
Clicking on any of the binary download links shown on the README (or attempting a wget
) fails.
Example:
leads to an error page that shows this:
An error occurred in the application and your page could not be served.
Please try again in a few moments.
If you are the application owner, check your logs for details.
Links have been broken since 3 PM CST on March 27th.
Links in README.md
return a 403.
$ curl -v 'http://forego.s3.amazonaws.com/forego-darwin-amd64'
* About to connect() to forego.s3.amazonaws.com port 80 (#0)
* Trying 72.21.211.171...
* connected
* Connected to forego.s3.amazonaws.com (72.21.211.171) port 80 (#0)
> GET /forego-darwin-amd64 HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
> Host: forego.s3.amazonaws.com
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< x-amz-request-id: 6C6D5E496615CD05
< x-amz-id-2: rJJFL8IjkwK9G8gHCz1qYmn+r9CmvFQq7mwusGMHNajrmAvu/CyrJ1Zd1QtI63x0
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Date: Sun, 01 Sep 2013 04:36:01 GMT
< Server: AmazonS3
<
<?xml version="1.0" encoding="UTF-8"?>
* Connection #0 to host forego.s3.amazonaws.com left intact
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>6C6D5E496615CD05</RequestId><HostId>rJJFL8IjkwK9G8gHCz1qYmn+r9CmvFQq7mwusGMHNajrmAvu/CyrJ1Zd1QtI63x0</HostId></Error>* Closing connection #0
This might be by design, but when app logs multiple lines, forego only prints the first one, probably because of buffer.Reset() in LineReader http://gotools.org/github.com/ddollar/forego#OutletFactory.LineReader
This is problematic e.g. for panics, because important information is not shown.
foreman export
is pretty useful for production deployment: developer can just add this command after "deploy:publishing" (or something like that). Are there any plans on supporting that functionality in forego?
Hi,
Can you add ARM builds ?
linux-armel: GOOS=linux GOARCH=arm GOARM=5
linux-armhf: GOOS=linux GOARCH=arm GOARM=6
Thank you
Are you open to having a non-colorized logs option?
perhaps it has to do with runinng with repls
running sbt with forego exits immediately
[13:51:06 ] ~/github.com/heroku/heroku.scala $ forego run sbt
Listening for transport dt_socket at address: 5005
[info] Loading global plugins from /Users/scott/.sbt/plugins
[info] Loading project definition from /Users/scott/github.com/heroku/heroku.scala/project
[info] Set current project to heroku-scala-project (in build file:/Users/scott/github.com/heroku/heroku.scala/)
> [13:51:14 ] ~/github.com/heroku/heroku.scala $
In comparison, foreman works properly...
[13:50:21 ] ~/github.com/heroku/heroku.scala $ foreman run sbt
Listening for transport dt_socket at address: 5005
[info] Loading global plugins from /Users/scott/.sbt/plugins
[info] Loading project definition from /Users/scott/github.com/heroku/heroku.scala/project
[info] Set current project to heroku-scala-project (in build file:/Users/scott/github.com/heroku/heroku.scala/)
> exit
[13:51:26 ] ~/github.com/heroku/heroku.scala
Same behavior for irb
> [13:51:14 ] ~/github.com/heroku/heroku.scala $ forego run irb
Switch to inspect mode.
[13:54:34 ] ~/github.com/heroku/heroku.scala $ foreman run irb
irb(main):001:0>
I tried installing via the README's instructions, but it didn't work:
Code$ rm -rf .gopath/
Code$ go get github.com/ddollar/forego
# github.com/daviddengcn/go-colortext
open .gopath/src/github.com/daviddengcn/go-colortext/ct.go: No such file or directory
# github.com/kr/text
open .gopath/src/github.com/kr/text/doc.go: No such file or directory
2 Code$ go install github.com/ddollar/forego
# github.com/daviddengcn/go-colortext
open .gopath/src/github.com/daviddengcn/go-colortext/ct.go: No such file or directory
# github.com/kr/text
open .gopath/src/github.com/kr/text/doc.go: No such file or directory
2 Code$
in foreman there was option to specify root
class_option :root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory"`
i may have overlooked it, is there an option for this via forego?
I think there is maybe a stdout flushing issue when using forego on windows. It doesn't display output from this django app: https://github.com/heroku/python-getting-started
C:\Users\IEUser\tmp\python-getting-started>type Procfile
web: python manage.py runserver 0.0.0.0:5000
C:\Users\IEUser\tmp\python-getting-started>forego start web
forego | starting web.1 on port 5000
C:\Users\IEUser\tmp\python-getting-started>python manage.py runserver 0.0.0.0:5000
July 08, 2015 - 15:01:47
Django version 1.8.1, using settings 'gettingstarted.settings'
Starting development server at http://0.0.0.0:5000/
Quit the server with CTRL-BREAK.
[08/Jul/2015 15:01:51]"GET / HTTP/1.1" 200 6525
[08/Jul/2015 15:01:51]"GET /static/lang-logo.png HTTP/1.1" 304 0
It still functions, but it doesn't display any output. After I press ctrl-c, it does show one line of output.
I'm using chruby
to manage my ruby versions. When running forego run <some ruby command>
it seems to be using my default ruby, not my current ruby:
$ forego run rake db:migrate
Your Ruby version is 2.0.0, but your Gemfile specified 1.9.3
$ ruby --version
ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin13.0.0]
$ cat .ruby-version
1.9.3-p429
$ chruby 1.9.3-p429 # just to be sure
$ forego run ruby --version
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.3.0]
$ foreman run ruby --version
ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin13.0.0]
$ env | grep -wE 'RUBY_.*|PATH'
PATH=/Users/bjeanes/.gem/ruby/1.9.3/bin:/Users/bjeanes/.rubies/1.9.3-p429/lib/ruby/gems/1.9.1/bin:/Users/bjeanes/.rubies/1.9.3-p429/bin:/Users/bjeanes/bin:/usr/local/bin:/usr/local/sbin:/usr/X11/bin:/usr/bin:/usr/sbin:/bin:/sbin:/Users/bjeanes/Code/Go/bin
RUBY_AUTO_VERSION=1.9.3-p429
RUBY_ROOT=/Users/bjeanes/.rubies/1.9.3-p429
RUBY_ENGINE=ruby
RUBY_VERSION=1.9.3
$ forego run 'echo $PATH'
/Users/bjeanes/.gem/ruby/2.0.0/bin:/Users/bjeanes/.rubies/2.0.0-p0/lib/ruby/gems/2.0.0/bin:/Users/bjeanes/.rubies/2.0.0-p0/bin:/Users/bjeanes/bin:/usr/local/bin:/usr/local/sbin:/usr/X11/bin:/usr/bin:/usr/sbin:/bin:/sbin:/Users/bjeanes/Code/Go/bin
As you can see, this behavior differs from foreman
and is of course unexpected. chruby
works my modifying the PATH
variable. As you can see the PATH
includes 1.9.3 ruby prior to invocation but during invocation it's pointing to 2.0.0. This is probably a weird sub-shell interaction with chruby but thought you may want to hear about it anyway.
Hi @ddollar,
I've got a go dotenv port at https://github.com/joho/godotenv which might be worth integrating to make forego and foreman closer to 100% compatible. I'd ported all the tests from the ruby dotenv library to ensure compatibility.
I'm happy to do a pull request if you want to use the library, just thought it'd be polite to ask first incase you wanted to do the .env handling yourself.
Running into an issue where forego
doesn't seem to be giving all of the error output that regular foreman
used to (and still does). In a node setup with a server.js
that just errors out...
throw new Error('stop!');
With foreman
, I get a full stack trace:
$ foreman start
17:29:48 web.1 | started with pid 2303
17:29:48 web.1 | /Users/Storm/dev/ianstormtaylor/damp-retreat-7073/server.js:2
17:29:48 web.1 | throw new Error('stop!');
17:29:48 web.1 | ^
17:29:48 web.1 | Error: stop!
17:29:48 web.1 | at Object.<anonymous> (/Users/Storm/dev/ianstormtaylor/damp-retreat-7073/server.js:2:7)
17:29:48 web.1 | at Module._compile (module.js:434:26)
17:29:48 web.1 | at Object.Module._extensions..js (module.js:452:10)
17:29:48 web.1 | at Module.load (module.js:355:32)
17:29:48 web.1 | at Function.Module._load (module.js:310:12)
17:29:48 web.1 | at Function.Module.runMain (module.js:475:10)
17:29:48 web.1 | at startup (node.js:117:18)
17:29:48 web.1 | at node.js:951:3
17:29:48 web.1 | exited with code 1
17:29:48 system | sending SIGTERM to all processes
SIGTERM received
But with forego
I only get the offending line, which makes it super hard to debug issues:
$ forego start
forego | starting web.1 on port 5000
web.1 | /Users/Storm/dev/ianstormtaylor/damp-retreat-7073/server.js:2
$ heroku local
forego | starting web.1 on port 5000
web.1 | /Users/Storm/dev/ianstormtaylor/damp-retreat-7073/server.js:2
Am I doing something wrong? Would love to get this fixed, since it makes it impossible to quickly resolve errors when using heroku local
. Thanks!
The link of precompiled binaries seems breaking
Commit 5d3c4e4 breaks Procfiles with multiple commands per process. I'm not against changing my Procfile if there is a fix.
I just came across this issue:
$ forego start -c web=2
forego | starting web.1 on port 5000
forego | starting web.2 on port 5000
web.1 | Listing on port 5000...
web.2 | Listing on port 5000...
web.2 | panic: listen tcp :5000: bind: address already in use
While with foreman it works correctly:
$ foreman start -c web=2
23:36:03 web.1 | started with pid 62932
23:36:03 web.2 | started with pid 62933
23:36:03 web.1 | Listing on port 5000...
23:36:03 web.2 | Listing on port 5001...
Based on the code, I believe #55 solves this issue, but the PR description doesn't seem make any mention of it, and my Go skills are pretty basic still.
@ddollar this is with api procfile
bundle exec forego start web
panic: runtime error: index out of range
goroutine 1 [running]:
main.parseProcfile(0x2102e0960, 0x21028b0d8, 0x225218, 0x2102e0960, 0x0, ...)
/tmp/gopath_3hFoN/src/github.com/ddollar/forego/procfile.go:56 +0x29e
main.ReadProcfile(0x15a390, 0x8, 0x0, 0x0, 0x0, ...)
/tmp/gopath_3hFoN/src/github.com/ddollar/forego/procfile.go:29 +0xbe
main.runStart(0x221560, 0x2102e0020, 0x1, 0x1)
/tmp/gopath_3hFoN/src/github.com/ddollar/forego/start.go:49 +0x115
main.main()
/tmp/gopath_3hFoN/src/github.com/ddollar/forego/main.go:27 +0x22d
goroutine 3 [syscall]:
os/signal.loop()
/app/go/linux-amd64/src/pkg/os/signal/signal_unix.go:21 +0x1c
created by os/signal.init·1
/app/go/linux-amd64/src/pkg/os/signal/signal_unix.go:27 +0x2f
Forego panic when an empty line (or more) is present in the .env
file.
panic: runtime error: index out of range
goroutine 1 [running]:
main.parseEnv(0x210301930, 0x21028a110, 0x21028a110, 0x0, 0x0, ...)
github.com/ddollar/forego/env.go:40 +0x1b5
main.ReadEnv(0x21028a0e0, 0x4, 0x0, 0x0, 0x0, ...)
github.com/ddollar/forego/env.go:32 +0x12d
main.runStart(0x220560, 0x2102e3020, 0x0, 0x0)
github.com/ddollar/forego/start.go:70 +0x263
main.main()
github.com/ddollar/forego/main.go:30 +0x22d
goroutine 3 [syscall]:
os/signal.loop()
/usr/local/Cellar/go/1.1.2/src/pkg/os/signal/signal_unix.go:21 +0x1c
created by os/signal.init·1
/usr/local/Cellar/go/1.1.2/src/pkg/os/signal/signal_unix.go:27 +0x2f
goroutine 5 [chan receive]:
main.func·003()
github.com/ddollar/forego/start.go:53 +0x3a
created by main.runStart
github.com/ddollar/forego/start.go:60 +0x112
I'm starting with forego, and I'm trying this:
Procfile
test: echo $ENVVAR
testenv
ENVVAR=Hello!
I would expect that if I run a single process in the Procfile, I could load the environment, but it's ignored:
$ forego start -e testenv
forego | starting test.1 on port 5000
test.1 | Hello!
$ forego start test -e testenv
forego | starting test.1 on port 5000
test.1 |
I'm currently using Foreman's .foreman
file to override the default port without having to run the command differently.
It'd be great to have forego allow the same thing. Either by reading .forman
or reading from a new .forego
file.
Some lines are split:
metrics_database_writer | [Success] Servi
metrics_database_writer | ceName Metrics-Database-Writer
It should not have split the above line in two.
Hey
excited to try forego, but the binaries aren't built:
$ curl https://forego-build.herokuapp.com/linux-386/forego
bin/build: line 21: go: command not found
... instead of Heroku.
I use something like this fairly often: foreman run -e .env,.env-prod ...
; forego doesn't seem to support comma-separated -e lists.
I think this is highly desirable behavior; I'll happily submit a pull if you agree.
Actualy #8 doesnt totally work :(
maybe some sort of readline based issues...here is an example with sbt, basically tab completion and other things dont work, also when I quit out of a program where tab completion or other stuff went bad, my shell is hosed.
foreman run sbt, type c and hit tab
foreman run sbt
Listening for transport dt_socket at address: 5005
[info] Loading global plugins from /Users/scott/.sbt/plugins
[info] Updating {file:/Users/scott/.sbt/plugins/}default-1d9157...
[info] Resolving org.scala-sbt#precompiled-2_10_0;0.12.2 ...
[info] Done updating.
[info] Loading project definition from /Users/scott/github.com/heroku/heroku.scala/project
[info] Set current project to heroku-scala-project (in build file:/Users/scott/github.com/heroku/heroku.scala/)
> c
cache-directory check-pgp-signatures class-directory classpath-configuration classpath-filter classpath-options classpath-types clean
clean-files clean-keep-files commands compile compile-inputs compile-order compile: compiler-cache
compilers configuration conflict-warning connect-input console console-project console-quick copy-resources
credentials cross-paths cross-scala-versions cross-target cross-version
> c
forego run sbt, type c and hit tab
forego run sbt
Listening for transport dt_socket at address: 5005
[info] Loading global plugins from /Users/scott/.sbt/plugins
[info] Loading project definition from /Users/scott/github.com/heroku/heroku.scala/project
[info] Set current project to heroku-scala-project (in build file:/Users/scott/github.com/heroku/heroku.scala/)
> c
the cursor just tabs over a tabwidth above...
Also scrolling through history with up arrow doesnt work on par with foreman
foreman run sbt and type up arrow
foreman run sbt
Listening for transport dt_socket at address: 5005
[info] Loading global plugins from /Users/scott/.sbt/plugins
[info] Loading project definition from /Users/scott/github.com/heroku/heroku.scala/project
[info] Set current project to heroku-scala-project (in build file:/Users/scott/github.com/heroku/heroku.scala/)
> exit
forego run sbt and type up arrow
forego run sbt
Listening for transport dt_socket at address: 5005
[info] Loading global plugins from /Users/scott/.sbt/plugins
[info] Loading project definition from /Users/scott/github.com/heroku/heroku.scala/project
[info] Set current project to heroku-scala-project (in build file:/Users/scott/github.com/heroku/heroku.scala/)
> ^[[A
I could be wrong but in foreman
, if I start a procfile which contains another foreman start
, it seems to be managed by the master foreman process (i.e. sigterm
s can be propagated). It looks like this is not true under forego
anymore (it spawns separate process).
Not sure if this is a design choice or there's some other flags to support it.
Installing this on ubuntu precise 32:
vagrant@precise32:~$ sudo go get -u github.com/ddollar/forego
# github.com/ddollar/forego/Godeps/_workspace/src/github.com/subosito/gotenv
/usr/lib/go/src/pkg/github.com/ddollar/forego/Godeps/_workspace/src/github.com/subosito/gotenv/gotenv.go:62: undefined: bufio.NewScanner
Looks like the Binaries are currently unavailable.
Hello,
I'm posting this as an issue because I don't see another way to ask a question.
I have looked at the Usage section of the README and also at the source code, and have tried adding '-p %PORT%' to the Procfile (%% because it's Windows) and '-p %PORT%' to 'forego start' and neither seems to work. I always end up with port 5000.
'forego version' tells me I am using version 0.10.0
Any guidance will be appreciated. Thanks!
Linux precompiled binary doesnt work with alpinelinux.
Could come useful for people who are very keen on docker image size.
forego is much lightweight compared to supervisor which also requires other dependencies.
Its been compiled for personal use by using the below command
CGO_ENABLED=0 go build -installsuffix cgo github.com/ddollar/forego
Here is the link to the working alpinelinux binary.
Thanks.
This is what I expected actually.
On Linux, using version 0.15.0, when you specify the full-path to the environment file to load, it fails. When specifying a relative path, it works:
ProcFile.test:
test: echo "-- $FOO --"
testenv:
FOO=123
EXE=echo
Starting with these files normally just works:
$ forego start -f ProcFile.test -e testenv
forego | starting test.1 on port 5000
test.1 | -- 123 --
$
When Specifying full-path for the env file, the environment variables are not loaded:
$ forego start -f ProcFile.test -e ${PWD}/testenv
forego | starting test.1 on port 5000
test.1 | -- --
$
This used to work correctly in 0.13.1
$ go get -u github.com/ddollar/forego
# github.com/ddollar/forego
src/github.com/ddollar/forego/run.go:33: ps.Start undefined (type *Process has no field or method Start)
src/github.com/ddollar/forego/start.go:66: undefined: ShutdownProcesses
src/github.com/ddollar/forego/start.go:90: ps.Start undefined (type *Process has no field or method Start)
src/github.com/ddollar/forego/start.go:96: undefined: ShutdownProcesses
Looks like Process needs to define a Start method, or maybe embed the exec.Cmd.
First off, thanks for having a golang tool vs requiring ruby toolchain 👍 .
I found this bug while trying out the following project https://github.com/shakacode/react-webpack-rails-tutorial/, specifically the Procfiles there.
Sample Procfile.dev from tutorial:
# Basic procfile for dev work.
# Runs all processes. Development is faster if you pick one of the other Procfiles if you don't need
# some of the processes: Procfile.hot or Procfile.express
# Development rails requires both rails and rails-assets
# (and rails-server-assets if server rendering)
rails: REACT_ON_RAILS_ENV=HOT rails s -b 0.0.0.0
# Run the hot reload server for client development
hot-assets: sh -c 'rm app/assets/webpack/* || true && HOT_RAILS_PORT=3500 npm run hot-assets'
# Render static client assets
rails-static-client-assets: sh -c 'npm run build:dev:client'
# Render static client assets. Remove if not server rendering
rails-static-server-assets: sh -c 'npm run build:dev:server'
# Run an express server if you want to mock out your endpoints. No Rails involved!
# Disable this if you are not using it.
# It's a great way to prototype UI especially with non-Rails developers!
express: sh -c 'HOT_PORT=4000 npm start'
That procfile works under foreman but not under forego 0.16.1.
If I change the rails:
line slightly (use sh -c
around command) it will also work under master copy of forego.
If I make the following changes (in PR https://github.com/shakacode/react-webpack-rails-tutorial/pull/310/files) then it works under forego... ie changing the names from dash delimited to underscore delimited (s/hot-assets/hot_assets/g
), then it works under forego 0.16.1.
So seems like something changed for the better between 0.16.1 and now. My thought is that dashes are considered permissible according to forego's regex (https://github.com/ddollar/forego/blob/master/procfile.go#L12) and should work.
Does it make sense to cut another release for forego since it's working better in master?
The install link for OSX seems broken: https://godist.herokuapp.com/projects/ddollar/forego/releases/current/darwin-amd64/forego
Maybe godist is shot?
The ruby version of foreman pads the output so that the logs line up nicely:
13:55:33 admin.1 | [13:55:33] Finished 'favicon' after 600 ms
13:55:33 api.1 | debug: [memory] rss=48910336, heapTotal=30214176, heapUsed=16356896
13:55:33 api.1 | info: [main] Cluster Worker[1] API server running on port 5100
13:55:34 admin.1 | [13:55:34] Finished 'html' after 1.73 s
13:55:42 admin.1 | [13:55:42] Finished 'bootstrap-fonts' after 9.54 s
13:55:43 admin.1 | [13:55:43] Finished 'images' after 11 s
13:55:43 admin.1 | [13:55:43] Starting 'watch'...
13:55:43 admin.1 | [13:55:43] Finished 'watch' after 18 ms
When using forego the output is jaggy:
worker.1 | Detected we are running locally -- using nodemon
web.1 | info: [init] Initialized with Parse environment HustleDevTyler
worker.1 | info: [init] Initialized with Parse environment HustleDevTyler
web.1 | debug: [memory] rss=48816128, heapTotal=30214176, heapUsed=16355432
web.1 | info: [main] Cluster Worker[1] API server running on port 5000
Are there any plans to add dynamic padding to the process portion of the log lines? I noticed this behavior in the JavaScript foreman clone as well.
In some cases I already have a $PORT
env var set from a other system and I'd like to be able to run forego
in a mode where it does not do anything special with the PORT
variable.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.