Giter VIP home page Giter VIP logo

maildrop's Introduction

maildrop's People

Contributors

m242 avatar vmorarian 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

maildrop's Issues

Support more than 1 level deep of multipart data in incoming emails

I setup a Maildrop server for internal use at my company for QE email testing.

However, for compatibility reasons with different servers, our email is sent in a format that looks like this:
multipart/mixed --> multipart/alternative --> text/plain, text/html

All of the emails from our product are being rejected with the error "no attachments", but it looks like the real reason for the error is that Maildrop doesn't find any of the "text/*" type fields.

See screenshot from wireshark of an example email:
jive_email_wireshark

In web, zipfile

"use the 'start' command inside the zipfile" What does it mean?

malware

High Risk Website Blocked
Location: maildrop.cc
Access has been blocked as the threat Mal/HTMLGen-A has been found on this website.

Latest commit fails to build

java.lang.RuntimeException: The incremental compiler requires absolute sources, but some were relative: ../common/src/main/scala/com/heluna/util/MailboxUtil.scala and 10 others
        at scala.sys.package$.error(package.scala:27)
        at sbt.inc.IncrementalCommon.checkAbsolute(Incremental.scala:287)
        at sbt.inc.IncrementalCommon.invalidateInitial(Incremental.scala:263)
        at sbt.inc.Incremental$.compile(Incremental.scala:35)
        at sbt.inc.IncrementalCompile$.apply(Compile.scala:27)
        at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:157)
        at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:71)
        at sbt.compiler.AggressiveCompile.apply(AggressiveCompile.scala:46)
        at sbt.Compiler$.apply(Compiler.scala:75)
        at sbt.Compiler$.apply(Compiler.scala:66)
        at sbt.Defaults$.sbt$Defaults$$compileTaskImpl(Defaults.scala:743)
        at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:735)
        at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:735)
        at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
        at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
        at sbt.std.Transform$$anon$4.work(System.scala:64)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
        at sbt.Execute.work(Execute.scala:244)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
        at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
        at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
[error] (compile:compile) The incremental compiler requires absolute sources, but some were relative: ../common/src/main/scala/com/heluna/util/MailboxUtil.scala and 10 others
[error] Total time: 49 s, completed Apr 17, 2014 11:53:55 AM

Installation problems

Anyone can help me run MailDrop for the first time? Im getting errors wieh i try to set up the web server.
This is what i get...

root@prd1:/segundoemail/maildrop/web/target/universal/web-2.0/bin# sudo ./web
Play server process ID is 15898
14:29:57,669 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
14:29:57,669 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
14:29:57,669 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/segundoemail/maildrop/web/target/universal/web-2.0/lib/default.common-2.0.jar!/logback.xml]
14:29:57,670 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs multiple times on the classpath.
14:29:57,670 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [jar:file:/segundoemail/maildrop/web/target/universal/web-2.0/lib/com.typesafe.play.play_2.10-2.3.4.jar!/logback.xml]
14:29:57,670 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback.xml] occurs at [jar:file:/segundoemail/maildrop/web/target/universal/web-2.0/lib/default.common-2.0.jar!/logback.xml]
14:29:57,692 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@2296a71f - URL [jar:file:/segundoemail/maildrop/web/target/universal/web-2.0/lib/default.common-2.0.jar!/logback.xml] is not of type file
14:29:57,881 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
14:29:57,882 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
14:29:57,891 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
14:29:57,922 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:29:57,990 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.heluna.maildrop.smtp.filters.SPFLogger] to ERROR
14:29:57,990 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
14:29:57,990 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
14:29:57,991 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
14:29:57,992 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@50b5f5f6 - Registering current configuration as safe fallback point

[info] play - Application started (Prod)
Oops, cannot start the server.
org.jboss.netty.channel.ChannelException: Failed to bind to: /0.0.0.0:9000
at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)
at play.core.server.NettyServer$$anonfun$8.apply(NettyServer.scala:129)
at play.core.server.NettyServer$$anonfun$8.apply(NettyServer.scala:126)
at scala.Option.map(Option.scala:145)
at play.core.server.NettyServer.(NettyServer.scala:126)
at play.core.server.NettyServer$.createServer(NettyServer.scala:243)
at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:280)
at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:275)
at scala.Option.map(Option.scala:145)
at play.core.server.NettyServer$.main(NettyServer.scala:275)
at play.core.server.NettyServer.main(NettyServer.scala)
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:174)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:139)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:77)
at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:372)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:296)
at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:701)

Anyone can help me?
Really appreciate....

I have 2 issue

I have run sbt compile and it run successfully. now where it create the jar file. so i can run this command
'To run the SMTP server, use "java -jar (jarfile) MailDrop". '

Second how i can mentioned to listen my server ip instead of deafult ip .0.0.0:9000

"sbt assembly" fails with error "Not a valid command: assembly"

OS:
CentOS release 6.8 (Final)

[sysuser@jenkinsepcsslxz01 smtp]$ sbt assembly
[info] Loading project definition from /home/sysuser/.sbt/0.13/staging/062256ed7f1a43211714/smtp/project
[info] Loading project definition from /home/sysuser/.sbt/0.13/staging/8358063b5e3224d4f6d6/common/project
[info] Set current project to smtp (in build file:/maildrop/maildrop/smtp/)
[error] Not a valid command: assembly
[error] Not a valid project ID: assembly
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: assembly
[error] assembly
[error]         ^
[sysuser@jenkinsepcsslxz01 smtp]$

Any idea why this can be happening?

Address alias collision - unusable alias (previously suggested fix does not work)

Hi!
Thank you for replying to the previous issue I created.
#8

Unfortunately, your suggested fix does not appear to work. I'm running a slightly modified version of maildrop. The following gists might be relevant:
https://gist.github.com/stahlkarl/12ea502344dfc3f28763
https://gist.github.com/stahlkarl/4a97bef543c49537dc1b
https://gist.github.com/stahlkarl/59be8fb1544272e8d7f0

You suggested removing the ".toLowerCase.replaceAll" method calls in getAltInbox and getRegularInbox to prevent the collision. To clarify, what I think you mean is to replace
val regularBigInt = fromShort(regularInbox.toLowerCase.replaceAll("[^A-Za-z0-9]", ""))
with
val regularBigInt = fromShort(regularInbox)
(in getAltInbox)

and
val altBigInt = fromShort(altInbox.toLowerCase.replaceFirst(prefix.toLowerCase, ""))
with
val altBigInt = fromShort(altInbox.replaceFirst(prefix, ""))
(in getRegularInbox)

sbt assembly errors

Whenever I try to create the smtp jar via sbt assembly I get the following error. Do you have any idea how to fix this?

[info] Loading project definition from /home/test/Desktop/maildrop/smtp/project
[info] Loading project definition from /home/test/Desktop/maildrop/common/project
[info] Set current project to smtp (in build file:/home/test/Desktop/maildrop/smtp/)
[error] Not a valid command: assembly
[error] Not a valid project ID: assembly
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: assembly
[error] assembly
[error] ^

Also with latest version of play framework, it's no longer "play dist" it is "activator dist". Maybe the installation instructions need an update?

JavaMail error preventing Maildrop from working with any "multipart/*" mime types

I ran into this error:

no object DCH for MIME type multipart/mixed;

when MailDropMessageHandler called "saveMessage()".

There are discussions about this problem throughout the Internet, e.g. Stack overflow discussion.

In case it matters, I built the smtp module with these very simple steps:


cd smtp
activator assembly
cp target/scala-2.10/smtp-assembly-2.0.jar .
# Use a custom application.conf, which just modified the number of emails per inbox.
java -jar smtp-assembly-2.0.jar -Dconfig.file=application.conf  

I'm using Java 8 (the error still happens with Java 7) and Scala 2.10.

I'd be grateful if the developer could:

  • Investigate why this happens, see if you can reproduce (should be easy to reproduce by sending any multipart email)
  • Fix at the code level, if necessary, or provide documentation on how to fix your environment

I ended up adding this code to fix the issue at the top of MailDropMessageHandler:


        val mc = CommandMap.getDefaultCommandMap.asInstanceOf[MailcapCommandMap]
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html")
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml")
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain")
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed")
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822")
        CommandMap.setDefaultCommandMap(mc)

Docker

Any chance to get Docker container here?

Maildrop API

Not exactly an issue, but do you intend to provide a maildrop API?

Cant run

Hi guys

I am trying to run a copy of this on Windows server 2012 R2, but when I get up to this step:

Go into "web" and run "play dist".

I cant seem to find play dist. Sorry if this is a stupid question, but i'm a bit confused on what I am suppose to do here.

Thanks for the great service!

Postfix reporting significant delays

Our configuration is set to relay via Postfix to a Maildrop deployment. Postfix occasionally reports significant delays. Responses range from 3 seconds to 3 minutes. Neither postfix nor maildrop are reporting any errors. Delays do not appear to correspond to usage spikes. Any idea how to troubleshoot this issue?

Address alias collision - unusable alias

Hi!
Than you for providing the source code for this excellent service!

While reading
https://github.com/m242/maildrop/blob/master/common/src/main/scala/com/heluna/maildrop/util/AltInbox.scala
I realized that two identical addresses (except for the non alfa-numeric characters) would result in the same alias. Ex:
http://maildrop.cc/inbox/alfred
http://maildrop.cc/inbox/alfred+-~
Both have the alias: [email protected]

When sending an email to the alias address, it only appeared in the "alfred" inbox.

Questions and Issues

Hi.
This isn't really a issue i'm sending,but stll a issue.. just using this to ask you few questions
1.) What happened to maildrop.cc site? it says that its possible to contact you via your maildrop.cc email,but there is no way of receiving or sending email.. why do I get any received emails at all,no matter what emal service I use? HAve you stopped with the maildrop.cc site?
2.) Is the maildrop.cc site just for receiving emails people dont want,but still not receive emails or is it really stopped working? because I can't see any email to contact you. if try to send a emal to you using the @maildrop.com service,I get a email back that it wasn't sent.. Could you fix it so I can really see that I have received it?
3.) What if you want to register on a site,but don't want spam or anything,but can't use disposable emailaddress like maildrop.cc .. How you going to prevent the spam?

Log critical error messages from MailDropMessageHandler instead of hiding them

This block of code in "MailDropMessageHandler" will print "rejected: no attachements" regardless of the actual error. This made it very difficult to troubleshoot some errors that were happening and wasted about a day of my time! I'm not upset, but I think good error handling is critical


    case Continue() =>
                        // Save the message
                        Try(MailDropMessageHandler.saveMessage(sender, recipient, message)).toOption match {
                            case Some(x) =>
                                logger.info("Message saved from " + ip + " " + sender + " to " + recipient)
                                // Cache this sender
                                CacheFilter.add(inet, helo, Accept())
                                HostEntry.touch(inet, helo)
                                Metrics.message()
                            case None =>
                                logger.info("Data from " + ip + " " + sender + " to " + recipient + " rejected: no attachments")
                                Metrics.blocked()
                                throw new RejectException("No attachments allowed.")
                        }

Please modify this block of code to print the actual Exception that is thrown by saveMessage()

Messagebody encoding issue

There does not appear to be any utf-8 support for the message body. The string "åäö" looks correct in the message title, but in the body it looks like this "���".

Documentation on configuration

I'm interested in knowing to what extent maildrop is configurable. For example, it it possible to change the length of time emails are kept? The 24 hours that maildrop.cc keeps emails seems too short.

Alias inbox problems

When an email is sent to an alias addr, it only shows up in the mailbox which generated the alias and not in the inbox for the alias.
Example:
[email protected] has alias [email protected]. Emails sent to [email protected] only shows up in http://maildrop.cc/inbox/alfred and not http://maildrop.cc/inbox/d-2aa0sp7 .

One might think this is due to the address alias collision issues (#14), but the problem persists even though the email address does not include any non-alfanumeric characters (that includes the alias address and the prefix).

Figuring out proper CSP

As I was trying to setup my usual nginx headers, serving the web worker behind a reverse proxy, adding SSL, ...

Here's the last error I can read in chrome console

maildrop.example.com/:30 Refused to load the stylesheet 'http://fonts.googleapis.com/css?family=Open+Sans:400,300,600' because it violates the following Content Security Policy directive: "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com ".

Or:

Mixed Content: The page at 'https://maildrop.example.com/' was loaded over HTTPS, but requested an insecure stylesheet 'http://fonts.googleapis.com/css?family=Open+Sans:400,300,600'. This request has been blocked; the content must be served over HTTPS.

Would require editing web/app/views/template.scala.html, although I'm not sure how to proceed to ensure HTTP clients won't suffer that issue ....

sbt compile error

I'm on Ubuntu 18.04, I cloned the git, installed the latest sbt, oracle java jdk 11, redis and playframework.

Trying to run 'sbt compile' in the smtp folder and I get:

Copying runtime jar.
Getting org.scala-sbt sbt 0.13.8 (this may take some time)...
:: retrieving :: org.scala-sbt#boot-app
confs: [default]
52 artifacts copied, 0 already retrieved (17674kB/100ms)
Getting Scala 2.10.4 (for sbt)...
:: retrieving :: org.scala-sbt#boot-scala
confs: [default]
5 artifacts copied, 0 already retrieved (24459kB/43ms)
[info] Loading project definition from /root/maildrop/smtp/project
java.lang.NullPointerException
at java.base/java.util.regex.Matcher.getTextLength(Matcher.java:1770)
at java.base/java.util.regex.Matcher.reset(Matcher.java:416)
at java.base/java.util.regex.Matcher.(Matcher.java:253)
at java.base/java.util.regex.Pattern.matcher(Pattern.java:1133)
at java.base/java.util.regex.Pattern.split(Pattern.java:1261)
at java.base/java.util.regex.Pattern.split(Pattern.java:1334)
at sbt.IO$.pathSplit(IO.scala:744)
at sbt.IO$.parseClasspath(IO.scala:859)
at sbt.compiler.CompilerArguments.extClasspath(CompilerArguments.scala:62)
at sbt.compiler.MixedAnalyzingCompiler$.withBootclasspath(MixedAnalyzingCompiler.scala:189)
at sbt.compiler.MixedAnalyzingCompiler$.searchClasspathAndLookup(MixedAnalyzingCompiler.scala:167)
at sbt.compiler.MixedAnalyzingCompiler$.apply(MixedAnalyzingCompiler.scala:177)
at sbt.compiler.IC$.incrementalCompile(IncrementalCompiler.scala:138)
at sbt.Compiler$.compile(Compiler.scala:128)
at sbt.Compiler$.compile(Compiler.scala:114)
at sbt.Defaults$.sbt$Defaults$$compileIncrementalTaskImpl(Defaults.scala:814)
at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:805)
at sbt.Defaults$$anonfun$compileIncrementalTask$1.apply(Defaults.scala:803)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
at sbt.std.Transform$$anon$4.work(System.scala:63)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
at sbt.Execute.work(Execute.scala:235)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
[error] (compile:compileIncremental) java.lang.NullPointerException

Any tips on what I can do to address this?

Alias addresses do not work

Alias addresses appear to be non-functional. I've got a clean, unmodified copy of the latest version of maildrop running. I receive any email sent to my selected email address, but never receive any email sent to an alias.

This issue appears to be happening on the main http://maildrop.cc site, too. I always receive email sent to my selected address, but never receive mail sent to an alias.

More secure alt inbox addresses generation

Hi,

I noticed that alt-inboxes are generated using some simple binary math. By looking at the code, it seems that any reversible function would work for that purpose. How about using AES-OFB with a server key? Such key can be generated at deployment or first start if necessary. Using OFB mode shouldn't impact output size, and base32 would still guarantee valid characters are used.

I am personally not terribly familiar with scala, but would be happy to look into submitting a PR if you think this is a good idea.

P.S. Also would be nice to provide an address to alt-address API...

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.