Git Product home page Git Product logo

hyper-haskell's Introduction

Welcome to HyperHaskell, Hackage Build Status Hype level

… the strongly hyped Haskell interpreter.

HyperHaskell is a graphical interpreter for the programming language Haskell. You use worksheets to enter expressions and evaluate them. Results are displayed graphically using HTML.

HyperHaskell is intended to be easy to install. It is cross-platform and should run on Linux, Mac and Windows. Internally, it uses the GHC API to interpret Haskell programs, and the graphical front-end is built on the cross-platform Electron framework.

HyperHaskell's main attraction is a Display class that supersedes the good old Show class. The result looks like this:

Releases

The latest release of HyperHaskell is Level α (version 0.2.3.0).

Installation

Overview

HyperHaskell is intended to be easy to install. The easiest way to install it is to download the binary distribution. This is explained in the next subsection. However, there is a pitfall which you have to know about, and which requires knowledge of the installation structure.

A HyperHaskell installation consists of two parts:

  1. The graphical front-end.

    Currently written in HTML and JavaScript, packaged with the Electron framework.

  2. The interpreter back-end.

    Consists of an executable hyper-haskell-server, written in Haskell using the GHC API, and a library (module) Hyper for visualizing and pretty printing Haskell values.

    Both parts depend on several different Haskell packages. Unfortunately, the versions of the packages used to compile the executable and to compile the library have to be exactly the same.

    This is why, at the moment, the front-end does not come with the back-end executable included. Instead, the user is asked to install the hyper-haskell-server back-end into his or her own database of Haskell packages, and then tell the front-end about it. This way, the user is free to use different package or compiler versions.

Installation of the binary distribution

Installation from the binary distribution follows the structure explained above.

  1. Download the graphical front-end from the latest release and unpack it.

    App

    At the moment, binaries for macOS and Windows (thanks to Nicholas Silvestrin) are provided. Since Heinrich Apfelmus only has access to a macOS machine, help is appreciated!

  2. Install the back-end server

    1. Make sure that you have a working installation of the GHC Haskell compiler.

    2. Install the back-end with Cabal by executing

       cabal install hyper hyper-haskell-server
      

      It is also recommended (but not necessary) that you install the additional support for other popular Haskell packages, e.g. the Diagrams library by additionally executing

       cabal install hyper-extra
      
    3. Now you can start the front-end application and create a new worksheet, or open an existing one. Make sure that the "Interpreter Back-end" in the "Settings" section of the worksheet is set to "cabal". (The path field does not matter in this case.)

      Settings

      It is also possible to use Stack by using stack install, but that is not fully explained here, only to some extent below.

That's it! Happy hyper!

Run from source

When developing HyperHaskell itself, it is also possible to run it from source. Follow these steps:

  1. Download and install Electron

    The whole thing is currently developed and tested with Electron version 10.1.5.

    (If you use the npm package manager, you can install it in your home directory with cd ~ && npm install [email protected]. On Debian-based Linux distributions, Electron currently requires the nodejs-legacy package.)

  2. Make sure that you have a working installation of

    • the GHC Haskell compiler
    • the stack utility

    (See the Haskell homepage for more on how to obtain these.)

  3. You also need the make utility, which should be standard on any UN*X platform. Edit the file named Makefile and tell it where to find the Electron executable

    On macOS: Typically,

     ELECTRON=/Applications/Electron.app/Contents/MacOS/Electron
    

    On Linux: Typically,

     ELECTRON=/usr/local/bin/electron
    

    On Windows: You can locate electron.exe and double-click it. Then simply drop the hyper-haskell\app folder onto the lower pane of the window. Alternatively, from the terminal invoke what is suggested in the upper portion of the Electron window, i.e.

     <path-to-electron>\electron.exe hyper-haskell\app
    
  4. Go into the root directory of this repository and type make run.

     $ cd hyper-haskell
     $ make run
    

    This will call the stack utility to build the server back-end, and finally run the front-end.

  5. Use the File menu to open one of the example worksheets from the worksheets folder. Voilà!

    You can also create a new worksheet, but note that you have to set the back-end path in the "Settings" section. The path is relative to the directory where the worksheet was saved. For instance, if you run a worksheet from the worksheets directory, the path ../haskell/stack.yaml will point to the right hyper-haskell-server executable. Screenshot:

    Settings

    Note that for this setting, the stack utility has to be in your path. You can also set an explicit path for this utility in the "Preferences…" menu item.

Packaging

The normal way to obtain HyperHaskell is to download the application bundle in binary form. This section describes how to generate this from source.

We use the electron-packager utility. To install it, you need to use the npm package manager and execute the following commands:

cd ~
npm install electron-packager
npm install [email protected] --save-dev

To create an application bundle and compress it in a zip-file, use the following commands:

  • On macOS:

    make pkg-darwin
    make zip-darwin
    
  • On Windows: You need the 7zip utility in your path.

    make pkg-win32
    nake zip-win32
    
  • On Linux: not implemented yet

Contributors

Many thanks to everyone who contributed, provided feedback or simply found a nice application for HyperHaskell! In particular, many thanks to:

Moritz Angermann, Simon Jakobi, Rodney Lorrimar, Karshan Sharma, Nicholas Silvestrin, and many others.

The project was started by Heinrich Apfelmus.

hyper-haskell's People

Contributors

amigalemming avatar heinrichapfelmus avatar karshan avatar nsilv avatar rrampage avatar rvl avatar sjakobi avatar thielema avatar

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

hyper-haskell's Issues

Cannot bind variables with `let`

let x = 5

results in

<hint>:3:23: error: parse error on input ‘}’

Using just

x = 5

results in the very helpful message:

<hint>:2:3: error:
    parse error on input ‘=’
    Perhaps you need a 'let' in a 'do' block?
    e.g. 'let x = 5' instead of 'x = 5'

:)

Could not load import 'Csound.Patch'

It seems that when using stack hyper-haskell doesn't know where to look for packages (or similarly I don't know where it's looking for packages). I've run stack build csound-expression from the haskell/ directory before running make run from the project root and then opening the Csound.hhs worksheet. After those steps I get the error:

Status: Could not load imports: <no location info>: Could not find module ‘Csound.Patch’ Use -v to see a list of the files searched for.

screenshot 2016-10-17 10 16 24

"Quit" doesn't

Change a worksheet -> quit -> don't save -> program stays open

Configuration of font size

For presentations I'd like to increase the font size, either by hitting Ctrl-+ at runtime or in a configuration file. Maybe that's already possible via Electron?

Use annotated Haskell modules as notebook format

Currently hyper-haskell uses a custom JSON format for its notebooks.
What about to also support loading Haskell modules, i.e. parsing LANGUAGE pragmas, import statements and top-level definitions? It would simplify to switch between hyper-haskell and GHCi.
A problem would be that the user might expect that all module information and even formatting is maintained when hyper-haskell writes back an edited module. Also there must be a way to store cell inputs like this one:

test <- return “Test”
test

Support qualified imports with module aliases

Currently I can only list module names in the Module imports field:

Hyper.Extra
Diagrams.Prelude

I also need qualified imports. How about this syntax:

qualified Hyper.Extra as Extra
qualified Diagrams.Prelude as Diagrams

?

Hyper.Graphics should be an alias for a Blaze.Html type

For Hyper.Display instances for container types it would be nicer to work on Blaze.Html. I could then call Hyper.display on the container elements and arrange the obtained HTML objects on the HTML level. Blaze.Html would be better for composability than Text.

Cell evaluation fails when done too early after opening

After opening a worksheet with associated .hs file (Main module) and too soon evaluating a cell, I get:

<interactive>:2:1: Not in scope: `Hyper.displayIO'
<interactive>:3:1: Not in scope: `mooreImg'
<interactive>:5:38: Not in scope: type constructor or class `IO'
<interactive>:5:41:
    Not in scope: type constructor or class `Graphic'

A remedy could be

  • disabling evaluation until the interpreter is ready
  • delaying submission of evaluation request until the interpreter is ready

instances Display List, Tuples ...

How about Display instances for lists and tuples? This would simplify displaying the results of functions that return multiple results. E.g. the tuple members could be displayed in tiers.

Can't run interpreter with my GHC setup

How ever I build the back end, stack or cabal sandbox -- when I start the front end and ask for a new worksheet I get the following error:
WontCompile [GhcError {errMsg = "<no location info>: error:\n Could not find module \8216Hyper\8217\n Use -v to see a list of the files searched for."}] hyper-haskell-server: hyper-haskell-server: signal: 15 Interpreter stopped (Exit code 1)

Installation/running on linux

Hi

I tried to install hyper-haskell for the first time, on a blank ubuntu (Xubuntu 16.04.1 LTS).

sudo apt-get install haskell-platform
sudo apt-get install haskell-stack
sudo apt-get install nodejs
sudo apt-get install nodejs-legacy
sudo apt-get install npm
cabal update
cabal install hyper-haskell-server
sudo npm install [email protected] -g

Electron seems correctly installed. I can run /usr/local/lib/node_modules/electron/dist/electron, which opens an electron window asking to specify an app.

Added export PATH=$HOME/.cabal/bin:"$PATH"
Then hyper-haskel-server runs fine, with Waiting for Haskell expression (but can't be killed with ctrl-c).

cd ~/hask/hyper-haskell-0.1.0.0

updated Makefile to ELECTRON=/usr/local/lib/node_modules/electron/dist/electron

make run

All seems fine until '/usr/local/lib/node_modules/electron/dist/electron app', which I expected to open a window, but nothing happens and it also does not terminate. What did I miss?

hyper-haskell-server.nix out of date

$ NIXPKGS_ALLOW_BROKEN=1 nix-env -if haskell/hyper-haskell-server.nix
error: attribute 'mkDerivation' missing

       at /home/thielema/programming/haskell-other/hyper-haskell/haskell/hyper-haskell-server.nix:29:9:

           28|
           29|   drv = pkgs.mkDerivation {
             |         ^
           30|     pname = "hyper-haskell-server";

I am on channel nixpkgs-23.11.

Add URL cells

These can probably modeled just like text cells. I have no idea whether the JS part supports URL-loading, though.

In the meantime I found a stop-gap solution for showing locally stored html/svg files:

import qualified Data.Text.IO (readFile)
import System.IO.Unsafe (unsafePerformIO)

readSVG = html . unsafePerformIO . Data.Text.IO.readFile

Then in an evaluation cell you can put readSVG "my.svg". The bad thing is that I have to re-evaluate those cells after opening the worksheet.

Does HyperHaskell work with Plotly?

Suppose I have generated the following plotly

<!DOCTYPE HTML><html><head><meta charset="utf-8"><script src="https://cdn.plot.ly/plotly-latest.min.js"></script></head><body><div id="myContour"></div><script>Plotly.newPlot('myContour', [{"z":[[10,10.625,12.5,15.625,20],[5.625,6.25,8.125,11.25,15.625],[2.5,3.125,5,8.125,12.5],[0.625,1.25,3.125,6.25,10.625],[0,0.625,2.5,5.625,10]],"x":[-9,-6,-5,-3,-1],"type":"contour","orientation":"h","y":[0,1,4,5,7]}],{}, {displayModeBar: false});</script></body></html>

I can render this in my browser. Can it be rendered in a cell in HyperHaskell? I have failed to do this in IHaskell although I believe it to be possible.

reference to 'acceptNewSock' undefined

I installed the hyper-haskell-server with Haskell-platform-8.6.3 as follows:
cabal unpack hyper-haskell-server ——> change the dependencies in the .cabal file ——> cabal build

However, I got the following errors:

Failed to install hyper-haskell-server-0.2.1.0
Build log ( D:\Program Files\Haskell Platform\cabal\logs\ghc-8.6.3\hyper-haskell-server-0.2.1.0-CozCChDfS9X97YEz3apKeV.log ):
Preprocessing executable 'hyper-haskell-server' for hyper-haskell-server-0.2.1.0..
Building executable 'hyper-haskell-server' for hyper-haskell-server-0.2.1.0..
[1 of 1] Compiling Main ( Main.hs, dist\build\hyper-haskell-server\hyper-haskell-server-tmp\Main.o )
Linking dist\build\hyper-haskell-server\hyper-haskell-server.exe ...
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(Socket.o):fake:(.text+0x12ba1):对‘acceptNewSock’未定义的引用 (means undefined reference to 'acceptNewSock'. The following are the silimar error message.
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(Socket.o):fake:(.text+0x12e7a):对‘newAcceptParams’未定义的引用
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(Socket.o):fake:(.text+0x12e8e):对‘acceptDoProc’未定义的引用
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(Internal.o):fake:(.text+0x18b):对‘initWinSock’未定义的引用
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(Internal.o):fake:(.text+0x383):对‘getWSErrorDescr’未定义的引用
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(HsNet.o):HsNet.c:(.text+0x13):对‘__imp_getnameinfo’未定义的引用
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(HsNet.o):HsNet.c:(.text+0x23):对‘__imp_getaddrinfo’未定义的引用
D:\Program Files\Haskell Platform\cabal\x86_64-windows-ghc-8.6.3\network-2.8.0.0-2CyxvHbPvRZAIM6yl0QQaq/libHSnetwork-2.8.0.0-2CyxvHbPv
RZAIM6yl0QQaq.a(HsNet.o):HsNet.c:(.text+0x33):对‘__imp_freeaddrinfo’未定义的引用
collect2.exe: error: ld returned 1 exit status
gcc.exe' failed in phase Linker'. (Exit code: 1)
cabal: Leaving directory '.'

My cabal version is 2.4.1.0, ghc 8.6.3.

I think this is probably due to the newest haskell platform I used. But I don't know how to fix it.

Thanks for any help!

stack build fails in OS X 10.11.4, stack 1.1.2

$ stack --stack-yaml=haskell/stack.yaml build

Fails with this error:

...
aeson-0.9.0.1: configure
aeson-0.9.0.1: build
wai-logger-2.2.5: copy/register
http-date-0.0.6.1: copy/register
aeson-0.9.0.1: copy/register
Progress: 5/29'cabal copy' failed.  Error message:

--  While building package hyper-0.1.0.0 using:
      /Users/homam/.stack/setup-exe-cache/x86_64-osx/setup-Simple-Cabal-1.22.5.0-ghc-7.10.3 --builddir=.stack-work/dist/x86_64-osx/Cabal-1.22.5.0 copy
    Process exited with code: ExitFailure 1
    Logs have been written to: /Users/homam/dev/haskell/hyper-haskell/haskell/.stack-work/logs/hyper-0.1.0.0.log

    Configuring hyper-0.1.0.0...
    Warning: The 'license-file' field refers to the file 'LICENSE' which does not
    exist.
    Preprocessing library hyper-0.1.0.0...

    src/Hyper/Internal.hs:1:33: Warning:
        -XOverlappingInstances is deprecated: instead use per-instance pragmas OVERLAPPING/OVERLAPPABLE/OVERLAPS
    In-place registering hyper-0.1.0.0...
    setup-Simple-Cabal-1.22.5.0-ghc-7.10.3: LICENSE: does not exist

One possible cause of this issue is:
* No module named "Main". The 'main-is' source file should usually have a header indicating that it's a 'Main' module.

Stack version: Version 1.1.2 x86_64 hpack-0.14.0

Scaling (via diagrams) doesn't work

Apparently there is some kind of autoscale in the rendering process, which sometimes makes for absurd results:

-- Should fit on screen without scrolling, but does not.
dia $ circle 1 # scaleY 100 # scale 0.01

In general, any scale applied to the entire diagram has no effect.

It also makes it so that a diagram does not maintain a constant size after operations that add other diagrams next to it. So:

-- Now it fits on the page!  But adding a circle on the
-- right shouldn't change the size of anything on the left.
dia $ circle 1 # scaleY 100 # scale 0.01 ||| circle 1

Embedded GHC interpreter cannot find any modules or symbols

As I mentioned on #4 I had to run this differently from the instructions to get a window to show up:

$ make interpreter && (cd worksheets && TESTING=y exec electron ../app)

This produces the following output:

stack --stack-yaml=haskell/stack.yaml build
Setting phasers to stun... (port 14200) (ctrl-c to quit)
Waiting for Haskell expression
Got Haskell expression, evaluating
Wrote result
Waiting for Haskell expression
Got Haskell expression, evaluating
Wrote result
Waiting for Haskell expression
WontCompile [GhcError {errMsg = "<no location info>:\n    Could not find module `Csound.Base'\n    Use -v to see a list of the files searched for."}]

If I try to evaluate hello, I get a whole lot of undefined symbols:

<interactive>:2:1: Not in scope: `Hyper.displayIO'
<interactive>:3:1: Not in scope: `hello'
<interactive>:5:38: Not in scope: type constructor or class `IO'
<interactive>:5:41:
    Not in scope: type constructor or class `Graphic'

Automated HTML rendering of notebooks

jupyter's nbconvert is very handy when rendering ipynb into HTML for report generation. It would be nice to have the same thing for hyper-haskell notebooks. To that end I have a dummy implementation here: https://github.com/ejconlon/hyper-eval . (I still have to set cwd right and use stack.yaml and such to configure the interpreter environment, but it works for Prelude examples.) Let me know if this is a feature you'd like to see!

App fails to open

Here's my experience trying to get hyper-haskell to run on linux.
First off I had to add $(STACK) setup before $(STACK) build because I didn't have the correct version of ghc installed.
Secondly, when I try to run the app using electron nothing happens. If I point electron to one of the html files in the app directory I get a window displaying that page, for instance worksheet.html. But the whole app doesn't want to start. I've tried it using electron 1.4.0.

Ctrl-Return in "Module Imports" should reload imports

Currently when I alter the module imports I have to choose "Reload imports and options" from the "Evaluation" menu. I'd prefer to just hit Ctrl-Return like in the evaluation cells in order to trigger reloading imports.

Bundle an interpreter back-end with the front-end application

Proposal

At the moment, people who wish to install HyperHaskell have to install two things:

  1. The graphical front-end application
  2. A Haskell development environment (GHC + Cabal/Stack + some packages from Hackage)

For experienced users, this is the right approach, because they usually already have a Haskell environment (2) installed, and HyperHaskell should be compatible with it.

However, for absolute beginners, it is probably much more convenient to only install

  1. The graphical front-end application, bundled with a smallish default Haskell development environment.

The idea is that experienced users can still opt to install their own environment (2) and use it with HyperHaskell, but beginners have an easier time getting started if the front-end includes a default environment that does not have to be installed separately.

Implementation

To implement the proposal, we have to bundle the following items with the application bundle

  • The hyper-haskell-server executable
  • A GHC package data base that includes the hyper package

and add a new option "default" to the "Settings" pane of a worksheet. When the user chooses "default", then this bundled package database will be used for evaluating worksheet expressions. If the user chooses any other option ("cabal" or "stack"), then the already established procedure for that option applies, and the bundled package database is ignored.

Adding the "Settings" option is not difficult, but unfortunately, there is a problem with bundling: The executable and package database need to be relocatable, because, in general, people are free to move the front-end application bundle around, there is no fixed location at which it is installed. The problem is that at the time of this writing, Cabal does not fully support relocatable package databases.

Cabal has some preliminary support for relocatable packages, but it's not enough. It seems to work for cabal sandboxes

The GHC for MacOS X project has managed to make at least those packages relocatable that are shipped with GHC. Essentially, it does so by manually overwriting the paths in the package.conf.d database. This may possible for a selected set of packages, but I'm not sure how it interacts with dynamic linking, external C libraries, data-file, or executables. Preliminary experiments suggest that it's not straightforward.

I guess that Haskell for Mac found a (partial) solution to this problem already, but being a proprietary product, I'm not sure if they are willing to share their approach.

MacOS: "Error: 1" using stack back-end

Steps to reproduce:

  • download the Mac binary release 0.2.1.0
  • install the backend with stack (stack install hyper hyper-haskell-server) - global resolver is lts-11.15, and stack is in ~/.local/bin/
  • open frontend; set interpreter back-end to stack; set location of stack executable in preferences
  • reload imports

Result:

Status: Could not load imports:
Interpreter not running (Error: 1)

Related observations:

If the stack path is set to the folder containing stack (rather than the full path) the error message is unhelpful:
image

It's not clear when changes to the stack path preference are actually applied; I could change which error I got by changing the interpreter back-end to cabal, reloading, and then changing back to stack.

Paths on Mac?

I was very impressed by your demo of HyperHaskell at ICFP, Heinrich! I have just tried installing it (Mac 10.14.5, GHC 8.4.3) using cabal. The install went smoothly, but on starting up the front end, the Imports and options -> Status box reports

Interpreter not running (Error: spawn /Users/jg/.cabal/bin/hyper-haskell-server ENOENT)

Indeed, that path won't find my server:

jg$ which hyper-haskell-server
/Users/jg/Library/Haskell/bin/hyper-haskell-server
jg$ ls ~/.cabal/
config logs where-is-my-stuff.txt config.platform packages

Did I do something wrong?

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.