Welcome to Firefly 2.0
Firefly 2.0 is an excellent URL shortener service that scales.
License: MIT License
Firefly 2.0 is an excellent URL shortener service that scales.
It should be super easy to deploy Firefly, a bare VPS and Heroku are two prime platforms to support IMHO.
This is a beginner friendly issue which means that it should be a nice first task if you're looking to learn Ruby or Hanami. Feel free to ask questions in the comments or hop over to gitter to chat with the maintainer and others. And remember to have fun!
The current /admin only shows the 10 most recent items. This issue asks to add pagination of some sort, so you can navigate further back in history.
Iโd like to be able to create a short link to my Google+ profile like so: agarzo.la/+
Any chance something like this could be implemented? Thanks!
Default sorting: created_at DESC
Possible: clicks ASC, clicks DESC, created_at AS
255 characters for the long URL is too short. A good alternative would be to use a length of 2048 characters.
This is a beginner friendly issue which means that it should be a nice first task if you're looking to learn Ruby or Hanami. Feel free to ask questions in the comments or hop over to gitter to chat with the maintainer and others. And remember to have fun!
The admin should, for each item, be able to share that link on social media. I guess 'public' sharing schemes will work, so these are basically links to twitter, facebook, etc. to share something.
You know it!
Feel free to discuss here.
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:607:in forward' 2012-04-13T16:13:24+00:00 app[web.1]: RuntimeError - downstream app not set: 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:689:in
route_missing'
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:638:in route!' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:634:in
route!'
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:553:in block in call!' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:760:in
dispatch!'
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in instance_eval' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in
block in invoke'
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in catch' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:725:in
invoke'
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:553:in call!' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/sinatra-1.1.2/lib/sinatra/base.rb:538:in
call'
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/rack-1.2.1/lib/rack/session/cookie.rb:37:in call' 2012-04-13T16:13:24+00:00 app[web.1]: /home/heroku_rack/lib/static_assets.rb:9:in
call'
2012-04-13T16:13:24+00:00 app[web.1]: /home/heroku_rack/lib/last_access.rb:15:in call' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/rack-1.2.1/lib/rack/urlmap.rb:41:in
each'
2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/rack-1.2.1/lib/rack/urlmap.rb:47:in block in call' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/rack-1.2.1/lib/rack/urlmap.rb:41:in
call'
2012-04-13T16:13:24+00:00 app[web.1]: /home/heroku_rack/lib/date_header.rb:14:in call' 2012-04-13T16:13:24+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/rack-1.2.1/lib/rack/builder.rb:77:in
call'
4-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/connection.rb:76:in block in pre_process' 2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/connection.rb:74:in
catch'
2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/connection.rb:74:in pre_process' 2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/connection.rb:57:in
process'
2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/connection.rb:42:in receive_data' 2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in
run'
2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in run_machine' 2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/backends/base.rb:57:in
start'
2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/server.rb:156:in start' 2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/runner.rb:177:in
run_command'
2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/controllers/controller.rb:80:in start' 2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/lib/thin/runner.rb:143:in
run!'
2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/lib/ruby/gems/1.9.1/gems/thin-1.2.6/bin/thin:6:in <top (required)>' 2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/bin/thin:19:in
load'
2012-04-13T16:13:24+00:00 app[web.1]: /usr/ruby1.9.2/bin/thin:19:in `
I've got a really basic installation set up as per the instructions at: http://ariejan.net/2010/06/06/setup-your-own-firefly-url-shortener-in-25-minutes and when I attempt to un-shorten the link this is what I see in my heroku logs. I'm also seeing that all my URLs are basically just foo.com//1 in sequential order
Add a Client-gem to short URLs with a remote Firefly instance..
When shortening an URL, Firefly should try to retrieve the remote HTML page and extract the title for display in the admin panel.
I set up Firefly on Heroku with an API key that included the characters # and @. When I tried to log in using that key, it failed silently (just dumping me back to the login page with no error). When I changed the API key to something with no symbols (letters and numbers only) it worked fine.
When running on a server with 16k shortened URLs, generating the CSV takes a long time and increases the load dramatically.
When sharing a link to facebook (which does not require/support a title), without posting a title, an exception is thrown.
NoMethodError - private method `gsub' called for nil:NilClass:
/usr/lib/ruby/1.8/uri/common.rb:320:in `unescape'
/usr/lib/ruby/gems/1.8/gems/firefly-1.5.1/lib/firefly/server.rb:207:in `GET /api/share'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:1164:in `call'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:1164:in `compile!'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:738:in `instance_eval'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:738:in `route_eval'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:722:in `route!'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:772:in `process_route'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:769:in `catch'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:769:in `process_route'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:721:in `route!'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:720:in `each'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:720:in `route!'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:857:in `dispatch!'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:648:in `call!'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:822:in `instance_eval'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:822:in `invoke'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:822:in `catch'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:822:in `invoke'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:648:in `call!'
/usr/lib/ruby/gems/1.8/gems/sinatra-1.2.3/lib/sinatra/base.rb:633:in `call'
/usr/lib/ruby/gems/1.8/gems/rack-1.1.0/lib/rack/session/cookie.rb:37:in `call'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/rack/request_handler.rb:92:in `process_request'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/abstract_request_handler.rb:207:in `main_loop'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/rack/application_spawner.rb:118:in `run'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/rack/application_spawner.rb:65:in `spawn_application'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/utils.rb:184:in `safe_fork'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/rack/application_spawner.rb:58:in `spawn_application'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/rack/application_spawner.rb:41:in `spawn_application'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/spawn_manager.rb:159:in `spawn_application'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/spawn_manager.rb:287:in `handle_spawn_application'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/abstract_server.rb:352:in `__send__'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'
/usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/bin/passenger-spawn-server:61
As in Firefly 1.x, add an action for each item so you can download a QR code that contains the short URL.
This is better for SEO stuff.
Allow multiple URLs per short link, resulting in a landing page on Firefly with links to each URL.
Some instances of Firefly contain already 800k or more URLs, this may require some optimization. Find out what and how.
When shortening an URL to an image, Firefly should automatically re-host this image. Additionally it should be possible to upload an image file as well.
Keep in mind that Firefly should be Cloud Ready, so simple file storage will not be sufficient.
After shortening a URL two things can happen:
It should be possible to search the URLs, both short and long URLs are taken into account when filtering.
Export shortened URLs, including stats to CSV or YAML.
Gem includes
Configuration is now done in an .env
file, common configuration settings for the user could be moved to /admin for easier access.
Support proper users with their own API key. This should allow for 'personal' urls.
E.g. shortening http://example.com by user one should have a different code than for user two. However, it should be possible to aggregate click stats for your self and all users combined.
I got a working install on my local machine, but was unable to do the same on heroku.
The only changes I've made:
change hostname in firefly.yml to rxlcc.herokuapp.com
comment out other dbs in Gemfile, only pg uncommented
my repo at: https://github.com/hayksaakian/rxlcc
github changelog: hayksaakian/rxlcc@d2e2f92
i'm guessing it's because there are no connections to the production db, but i'm unsure where i would add them
2012-12-31T05:36:20+00:00 heroku[web.1]: Starting process with command `bundle exec rackup config.ru -p 36424`
2012-12-31T05:36:26+00:00 app[web.1]: /usr/local/lib/ruby/1.9.1/syck.rb:135:in `load': syntax error on line 27, col 0: `adapter = uri.scheme' (ArgumentError)
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:236:in `load_dependency'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:251:in `require'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/config.ru:2:in `block in <main>'
2012-12-31T05:36:26+00:00 app[web.1]: from /usr/local/lib/ruby/1.9.1/syck.rb:135:in `load'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:51:in `instance_eval'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:51:in `initialize'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/lib/firefly/database.rb:8:in `config'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/lib/firefly/database.rb:13:in `<top (required)>'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/lib/firefly/database.rb:4:in `connect!'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:251:in `require'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:251:in `block in require'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/server.rb:137:in `start'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/bin/rackup:4:in `<top (required)>'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/config.ru:1:in `new'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/bin/rackup:19:in `<main>'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:40:in `eval'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/lib/firefly.rb:30:in `<top (required)>'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/config.ru:1:in `<main>'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/config.ru:2:in `require'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/server.rb:252:in `start'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/server.rb:301:in `wrapped_app'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/server.rb:200:in `app'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/bin/rackup:19:in `load'
2012-12-31T05:36:26+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:40:in `parse_file'
2012-12-31T05:36:28+00:00 heroku[web.1]: Process exited with status 1
2012-12-31T05:36:28+00:00 heroku[web.1]: State changed from starting to crashed
2012-12-31T05:41:04+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/ host=rxlcc.herokuapp.com fwd=71.212.33.130 dyno= queue= wait= connect= service= status=503 bytes=
2012-12-31T05:41:05+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/favicon.ico host=rxlcc.herokuapp.com fwd=71.212.33.130 dyno= queue= wait= connect= service= status=503 bytes=
my heroku addons:
heroku-postgresql:dev HEROKU_POSTGRESQL_NAVY
These stats can laster be used to show fancy graphs and so on.
A console command that creates a new directory structure containing the necessary public and tmp directories for passenger et al. and a sample config.ru file.
I set this in my config file, but I still appear to be getting sequential URLs.
For those of you using it in production, are you fine using 1 web dyno for the whole shebang, or is the baseline higher than that?
Whenever I enter any value into the API key field and submit the form, I always get redirected back to the login page without any errors regardless of what I enter in the field. It only happens on my prod ubuntu box with ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux] and firefly 1.5.2 .
Highlight does not work correctly when shortening an existing URL.
Hey there,
Totally loving Firefly, but I just discovered a small issue.
This URL http://marcatomusician.com/?id=9 causes an error, but this http://marcatomusician.com/ doesn't. Is this possibly an oversight?
Domain's ready, only thing missing is a nice Firefly logo and website design.
The design and logo will be used to promote the open source Firefly application only. Mainly on http://fireflyrb.com
Firefly is a open source (free) URL shortener service that users can self-host. It's written in Ruby.
We're not looking for hosting or WordPress themes; just a simple HTML design that can be filled with user documentation. Look at http://gembundler.com/ for some inspiration.
Please sent your submission or any questions to [email protected]
It should be possible to delete a shortened URL from the backend. This will result in an HTTP 410 "Gone" error message.
This includes a nice page saying the URL will not be back.
Hello, exited to user firefly instead of bit.ly!
but your docs don't have a 'getting started' section so I'm going a bit by the seat of my pants here.
I put into my Gemfile
gem 'firefly' "~> 1.5.3"
and with bundle install got
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
An error occurred while installing do_mysql (0.10.10), and Bundler cannot continue.
Make sure that `gem install do_mysql -v '0.10.10'` succeeds before bundling.
I use postgres in dev and production and deploy to heroku.
(I also won't know how to user your API after I get it installed, again because no docs for it)
Thanks!
The API should support the following:
This API should work with JSON at least, shortening should also work as TXT (i.e. just return the short_url)
MySQL is not case sensitive by default. See: http://wiki.github.com/ariejan/firefly/faq for details.
Firefly should check for this and fix the issue when possible. It should at least issue a warning when finding the 'case insensitive' state.
If a title is url encoded it will be re-encoded when sharing to twitter or hyves.
"Test Post" => "Test%20Post"
"Test%20Post" => "Test%2520Post"
This is incorrect.
If a long URL is too long it will break the back-end layout.
The '%' gets escaped himself. E.g. shortening http://en.wikipedia.org/wiki/Tarski%27s_circle-squaring_problem gives http://en.wikipedia.org/wiki/Tarski%2527s_circle-squaring_problem
Add the little icon that allows you to quickly copy the shortened URL to your clipboard.
This is a beginner friendly issue which means that it should be a nice first task if you're looking to learn Ruby or Hanami. Feel free to ask questions in the comments or hop over to gitter to chat with the maintainer and others. And remember to have fun!
hanami server
There are two options here:
Or combine both by linking to /admin on the landing page.
Try to stick to the bit.ly API as much as possible for compatibility reasons.
Allow an item to consist of just text, optionally support syntax highlighting and rendering of markdown and other markup languages, if possible.
Validate long url and return an error if it's no a valid http:// or https:// url.
Firefly currently runs properly on Ruby 1.8.7 and REE.
Currently, for ruby 1.9.2 not all tests pass:
1) Sharing hyves should escape UTF-8 correctly
Failure/Error: self.send verb, '/api/share', @params.merge(:title => title)
NoMethodError:
undefined method `empty?' for nil:NilClass
# (erb):201:in `pretty'
# ./spec/firefly/sharing_hyves_spec.rb:91:in `block (4 levels) in <top (required)>'
2) Sharing twitter should escape UTF-8 correctly
Failure/Error: self.send verb, '/api/share', @params.merge(:title => title)
NoMethodError:
undefined method `empty?' for nil:NilClass
# (erb):201:in `pretty'
# ./spec/firefly/sharing_twitter_spec.rb:87:in `block (4 levels) in <top (required)>'
This includes a generator and documentation on how to select and configure a database.
Bonus points for deployment to Heroku.
Disable auto_complete and spellchecking for big_url field.
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.