Git Product home page Git Product logo

tremotesf-android's Introduction

Tremotesf

Android remote GUI for transmission-daemon.

Get it on F-Droid Get it on Google Play

Features

  • View torrent list
  • Sort torrents
  • Filter torrents by name, status and trackers
  • Start/stop/verify torrents with multi-selection
  • Add torrents from torrent files and magnet links
  • Select which files to download when adding torrent
  • Manage torrent files
  • Add and remove torrent trackers
  • View torrent peers
  • Set torrent limits
  • Change remote server settings
  • View server statistics
  • Multiple servers
  • Supports HTTPS connection
  • Can connect to servers with self-signed certificates (you need to add certificate to server settings)
  • Client certificate authentication

Build

  1. Clone Git repository:
git clone https://github.com/equeim/tremotesf-android.git
cd tremotesf-android
git submodule update --init
  1. Download and install latest Android Studio.
  2. Build APK in Android Studio.

Translations

Translations are managed on Transifex.

Screenshots

tremotesf-android's People

Contributors

acheronfail avatar albertcaro avatar equeim avatar luk1337 avatar poussinou 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

tremotesf-android's Issues

Add 'share' action

It would come very handy to share torrents with friends via chat/email or to be able to send the same torrent to another server (see #41).
Sharing a magnet URI would be enough, I guess.

Bug Report: App crashed after viewing a specific torrent's peers&limits section

Hi,when I tried to view a specific torrent's peers&limits section in torrent details page,the app itself exited without any message.

But only one of my torrents has this problem,while others don't.

Here is the logcat taken from matlog app.

07-19 21:17:41.973 I/ActivityManager(839): START u0 {cmp=org.equeim.tremotesf/.torrentpropertiesactivity.TorrentPropertiesActivity (has extras)} from uid 10137
07-19 21:17:42.490 W/SurfaceFlinger(698): Attempting to set client state on removed layer: Surface(name=AppWindowToken{313ea9b token=Token{fb27eaa ActivityRecord{d03ad95 u0 org.equeim.tremotesf/.mainactivity.MainActivity t81}}})/@0x15abc6f - animation-leash#0
07-19 21:17:42.490 W/SurfaceFlinger(698): Attempting to set client state on removed layer: Surface(name=AppWindowToken{af51af7 token=Token{d6b06f6 ActivityRecord{2db3791 u0 org.equeim.tremotesf/.torrentpropertiesactivity.TorrentPropertiesActivity t81}}})/@0x9f09785 - animation-leash#0
07-19 21:17:42.490 W/SurfaceFlinger(698): Attempting to destroy on removed layer: Surface(name=AppWindowToken{313ea9b token=Token{fb27eaa ActivityRecord{d03ad95 u0 org.equeim.tremotesf/.mainactivity.MainActivity t81}}})/@0x15abc6f - animation-leash#0
07-19 21:17:42.490 W/SurfaceFlinger(698): Attempting to destroy on removed layer: Surface(name=AppWindowToken{af51af7 token=Token{d6b06f6 ActivityRecord{2db3791 u0 org.equeim.tremotesf/.torrentpropertiesactivity.TorrentPropertiesActivity t81}}})/@0x9f09785 - animation-leash#0
07-19 21:17:43.751 E/AndroidRuntime(21193): Process: org.equeim.tremotesf, PID: 21193
07-19 21:17:43.751 E/AndroidRuntime(21193): at org.equeim.tremotesf.utils.ArraySpinnerAdapterWithHeader.getItem(Adapters.kt:108)
07-19 21:17:43.751 E/AndroidRuntime(21193): at org.equeim.tremotesf.utils.ArraySpinnerAdapterWithHeader.getItem(Adapters.kt:105)
07-19 21:17:43.751 E/AndroidRuntime(21193): at org.equeim.tremotesf.utils.BaseSpinnerAdapter.getView(Adapters.kt:79)
07-19 21:17:43.754 W/ActivityManager(839): Force finishing activity org.equeim.tremotesf/.torrentpropertiesactivity.TorrentPropertiesActivity
07-19 21:17:43.760 I/ActivityManager(839): Showing crash dialog for package org.equeim.tremotesf u0
07-19 21:17:44.263 W/ActivityManager(839): Activity pause timeout for ActivityRecord{2db3791 u0 org.equeim.tremotesf/.torrentpropertiesactivity.TorrentPropertiesActivity t81 f}
07-19 21:17:44.697 W/ActivityManager(839): Force finishing activity org.equeim.tremotesf/.torrentpropertiesactivity.TorrentPropertiesActivity
07-19 21:17:44.709 W/ActivityManager(839): Force finishing activity org.equeim.tremotesf/.mainactivity.MainActivity
07-19 21:17:44.717 E/ActivityManager(839): Found activity ActivityRecord{d03ad95 u0 org.equeim.tremotesf/.mainactivity.MainActivity t-1 f} in proc activity list using null instead of expected ProcessRecord{89b6589 21193:org.equeim.tremotesf/u0a137}
07-19 21:17:44.725 I/ActivityManager(839): Killing 21193:org.equeim.tremotesf/u0a137 (adj 199): crash
07-19 21:17:44.744 W/InputDispatcher(839): channel 'b89c82 org.equeim.tremotesf/org.equeim.tremotesf.torrentpropertiesactivity.TorrentPropertiesActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
07-19 21:17:44.744 E/InputDispatcher(839): channel 'b89c82 org.equeim.tremotesf/org.equeim.tremotesf.torrentpropertiesactivity.TorrentPropertiesActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
07-19 21:17:44.753 W/InputDispatcher(839): channel '2c3cb6a org.equeim.tremotesf/org.equeim.tremotesf.mainactivity.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
07-19 21:17:44.753 E/InputDispatcher(839): channel '2c3cb6a org.equeim.tremotesf/org.equeim.tremotesf.mainactivity.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
07-19 21:17:44.755 I/WindowManager(839): WIN DEATH: Window{b89c82 u0 org.equeim.tremotesf/org.equeim.tremotesf.torrentpropertiesactivity.TorrentPropertiesActivity}
07-19 21:17:44.755 W/InputDispatcher(839): Attempted to unregister already unregistered input channel 'b89c82 org.equeim.tremotesf/org.equeim.tremotesf.torrentpropertiesactivity.TorrentPropertiesActivity (server)'
07-19 21:17:44.757 I/WindowManager(839): WIN DEATH: Window{2c3cb6a u0 org.equeim.tremotesf/org.equeim.tremotesf.mainactivity.MainActivity}
07-19 21:17:44.757 W/InputDispatcher(839): Attempted to unregister already unregistered input channel '2c3cb6a org.equeim.tremotesf/org.equeim.tremotesf.mainactivity.MainActivity (server)'
07-19 21:17:44.885 W/SurfaceFlinger(698): Attempting to destroy on removed layer: 9ac7760 Application Error: org.equeim.tremotesf#0
07-19 21:17:45.028 W/SurfaceFlinger(698): Attempting to set client state on removed layer: org.equeim.tremotesf/org.equeim.tremotesf.torrentpropertiesactivity.TorrentPropertiesActivity#0
07-19 21:17:45.028 W/SurfaceFlinger(698): Attempting to destroy on removed layer: b89c82 org.equeim.tremotesf/org.equeim.tremotesf.torrentpropertiesactivity.TorrentPropertiesActivity#0
07-19 21:17:45.028 W/SurfaceFlinger(698): Attempting to destroy on removed layer: org.equeim.tremotesf/org.equeim.tremotesf.torrentpropertiesactivity.TorrentPropertiesActivity#0
07-19 21:17:45.028 W/SurfaceFlinger(698): Attempting to destroy on removed layer: AppWindowToken{af51af7 token=Token{d6b06f6 ActivityRecord{2db3791 u0 org.equeim.tremotesf/.torrentpropertiesactivity.TorrentPropertiesActivity t81}}}#0
07-19 21:17:45.028 W/SurfaceFlinger(698): Attempting to destroy on removed layer: AppWindowToken{313ea9b token=Token{fb27eaa ActivityRecord{d03ad95 u0 org.equeim.tremotesf/.mainactivity.MainActivity t81}}}#0

Alternative limits don't work properly

In server settings, alternative limits input don't work properly.

Screenshot_20210305-164205

The download input control both download and upload speed while the upload input simply doesn't do anything.
Probably just a variable name mismatch. I didn't investigate much for now.

logo free for u

Hello, @equeimI want to contribute in "tremotesf-android" so i want to designed a new logo for "tremotesf-android" and it's free.

I hope you like it. If you like it, I will send you pull request, editable files/original source and .png format files. If there's something you want to change, I'll do it.

if you want i will send you my design

contact me on facebook for fast delivary

https://www.facebook.com/abdulmalikkhan655

Issue with certificate

Hi,
Since few weeks, termotesf don't work anymore on my android ("connection error".
I've the version : 1.8.3
I've open the logcat and I've see this warning.

09-17 21:06:21.395 25008 25024 W : (null):0 ((null)): "The issuer certificate of a locally looked up certificate could not be found"
09-17 21:06:21.395 25008 25024 W : (null):0 ((null)): QNetworkReply::NetworkError(SslHandshakeFailedError) "SSL handshake failed"
09-17 21:06:21.396 25008 25024 D : (null):0 ((null)): disconnected

My certificate is signed by let's encrypt and is valide.

Az

Add "Host: " header (or TLS SNI)

I use transmission web gui behind a ssl offloader (HAproxy) which redirect web requests to several other web backends. To dispatch traffic it uses "Host: " web header. It seems that tremotesf doesn't include it in its web requests.

EDIT: after reflexion, it's most likely lack of SNI in TLS negociation. I didn't check in details.

Https connection certificates issue

Https connection with self signed certificate option doesn't work after version 1.6.2 . I updated to the newest version and was unable to connect to the server over https with the same config. I deleted all the data and rewrote the config yet it didn't work.

New release won't install

I downloaded both the fdroid and google release and added them to my phone. Trying to install either of them tells me the app isn't compatible with my phone. I have an LG V6.

Feature request: alt speed

Is it possible to get a button somewhere to switch between enabled or disabled "Alternative limits"? Now it is buried too deep in the menus.

feature request: add web seed function

If it's enabled,it is convenient to add direct http(s) link to the seed to promote download speed especially when there aren't many seeders available.
And we can check download speed for each web seed.
As far as I know,some of linux distributions enabled web seed for their torrents. :)

Colors and shortcut

Hello, is it possible to put a different color for the download torrents, and a shortcut to add a torrent link / .torrent, like on transdroid?

transdroid-2 5 1-main-576x1024

Renaming Files Silently Fails

Using version 2.2.0 installed from the Play Store (Pixel 4a, Android 11) I can't rename filles. I long press a filename to select it, choose rename from the menu, edit the filename in the dialog, press the OK button, then the dialog goes away, but the filename is unchanged. No warning or error message is presented.

I can rename the top level directory (or the lone file if it's a single file torrent) by browsing the torrent and then choosing rename from the menu without selecting any files, but this too fails if I select the directory/filename before choosing rename from the menu.

Both ways of renaming works as expected in version 2.0.2 installed from F-Droid.

Renaming files crash the app

Hello,
When I want to rename a file the application crash, I think there are nothing more to explain :P
Thanks,

Change settings ?

Hello,
Would it be possible to change actual settings of a server already added ? Otherwise dude your app rock !!
Thanks,

Verifying progress text

On the torrents list, while a torrent is being verified, the progress text shows 0.n% (e.g. 0.3% meaning 30%) which is wrong and very confusing. I suggest showing either an actual percentage (0~100), or decimal values (0~1) like now, but without the percentage sign.

I think the code for this is here:

Torrent.Status.Checking -> context.getString(R.string.torrent_checking,
DecimalFormat("0.#").format(recheckProgress))

I can't find where the percentage sign is added, but I found that recheckProgress is a double (0~1 I think?):

public double recheckProgress() {
return libtremotesfJNI.Torrent_recheckProgress(swigCPtr, this);
}

I know absolutely no Kotlin, so sorry if this is wrong, but does this come close to being ok?

diff --git a/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt b/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt
index ae2a2d2..27e0d2f 100644
--- a/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt
+++ b/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt
@@ -54,7 +54,7 @@ class TorrentData(val id: Int, val torrent: Torrent, private val context: Contex
                 Torrent.Status.QueuedForDownloading,
                 Torrent.Status.QueuedForSeeding -> context.getString(R.string.torrent_queued)
                 Torrent.Status.Checking -> context.getString(R.string.torrent_checking,
-                        DecimalFormat("0.#").format(recheckProgress))
+                        DecimalFormat("#").format(recheckProgress))
                 Torrent.Status.QueuedForChecking -> context.getString(R.string.torrent_queued_for_checking)
                 Torrent.Status.Errored -> errorString
                 else -> ""
@@ -71,7 +71,7 @@ class TorrentData(val id: Int, val torrent: Torrent, private val context: Contex
         private set
     var isFinished = torrent.isFinished
         private set
-    var recheckProgress = torrent.recheckProgress()
+    var recheckProgress = torrent.recheckProgress() * 100
         private set
     var eta = torrent.eta()
         private set
@@ -122,7 +122,7 @@ class TorrentData(val id: Int, val torrent: Torrent, private val context: Contex
             sizeWhenDone = torrent.sizeWhenDone()
             percentDone = torrent.percentDone()
             isFinished = torrent.isFinished
-            recheckProgress = torrent.recheckProgress()
+            recheckProgress = torrent.recheckProgress() * 100
             eta = torrent.eta()
             downloadSpeed = torrent.downloadSpeed()
             uploadSpeed = torrent.uploadSpeed()

Tell me what you think! :)

Download directory filter doesn't work correctly

On the download directories list, all paths have the trailling / removed -- even paths that should have it (looking at the output of transmission-remote -t <torrent> -i) -- and (this is me guessing) these are used to filter torrents. However, (also me guessing) since Tremotesf uses string comparison, the filter doesn't give the right results.

I tested this by adding and removing the trailling / to some torrents with transmission-remote: when I remove the trailling / from some torrent, it shows up in the results; when I add the trailling / it doesn't show up anymore.

If you can point me to where changes are required, I can try to provide a PR. I can't build/test/etc, though, because I don't have a clue on how to do that for Android.

Feature request: select server from add torrent dialog

Thanks for writing and sharing this awesome software.
If you have multiple servers configured, it would be helpful to present a server selection drop-down in the add torrent dialog.
For instance, when you manage different servers for several users, or if you want to quickly add the same torrent to several of your servers.
Also, when sharing one torrent's magnet link from Tremotesf to Tremotesf itself to start downloading the same file from another server.

Feature request : tips

Hello,
Could you add little tips in the navigation : e.g In servers category ; " Click on the server to modify their properties " for example ! Because I got lost the first time I wanted to modify them. Up to you next !
Thanks for the debugging btw :)

Installation problem

screenshot_20180619-091110
Fdroid version 1.7.0 came up recently,but when I finished downloading it and trying to install it,it says "Failed to install due to unknown error."And I tried to uninstall previous version and install the latest version,the problem persists.

OS:LineageOS 14.1
Model:Redmi Note 3

Rename folder or file when adding a torrent

Hi

Thanks for new features for adding a new torrent.

I have noticed that I m unable to rename torrent contents when there is a single file or a single folder inside the torrent. I can't access to the option rename when adding the torrent. It is just possible after adding it .

Did you notice this issue ?

Thanks

[proposal]Display the comment completely

sometimes the comment of torrent is so long that it cannot be displayed completely(only show the first two lines,which is a bit inconvenient.Could you please allow the display the comment completely in the torrent info screen?

Feature request: Add location path list history

Hello,

First of all thanks for this great app.

I was wondering, if the location path chose when adding a torrent could be saved somewhere for future use. Thus, when you add a new torrent the location previously used could be displayed as a list.

In my case, I use several subfolders in my download folder and this improvement would be great.

Thank you

Feature request: compact view

Nice app! However if there are many torrents, the list is too long to scroll. Could you add a compact view to show one-line torrents?

Feature request: delete torrent file

Can you add function: after adding torrent to transmission delete the initial .torrent file? Files are downloaded to doenload folder, and after adding them to transmission I do not need them.

1.7.0 install fails

Install fails on fdroid and with a downloaded APK from the fdroid website. APK is 16mb compared to 2mb for the 1.6 version.

Feature request: seed progress bar

This is my attempt

diff --git a/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt b/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt
index 1da98f2..13c2624 100644
--- a/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt
+++ b/app/src/main/kotlin/org/equeim/tremotesf/TorrentData.kt
@@ -87,6 +87,10 @@ class TorrentData(val torrent: Torrent, private val context: Context) {
         private set
     var totalUploaded = torrent.totalUploaded()
         private set
+    var ratioLimitMode = torrent.ratioLimitMode()
+        private set
+    var ratioLimit = torrent.ratioLimit()
+        private set
     var ratio = torrent.ratio()
         private set
 
diff --git a/app/src/main/kotlin/org/equeim/tremotesf/mainactivity/TorrentsAdapter.kt b/app/src/main/kotlin/org/equeim/tremotesf/mainactivity/TorrentsAdapter.kt
index c8fbf09..6372a3f 100644
--- a/app/src/main/kotlin/org/equeim/tremotesf/mainactivity/TorrentsAdapter.kt
+++ b/app/src/main/kotlin/org/equeim/tremotesf/mainactivity/TorrentsAdapter.kt
@@ -333,7 +333,15 @@ class TorrentsAdapter(private val activity: MainActivity) : RecyclerView.Adapter
             }
             etaTextView.text = Utils.formatDuration(activity, torrent.eta)
 
-            progressBar.progress = (torrent.percentDone * 100).toInt()
+            if ((torrent.status == Torrent.Status.Seeding || torrent.status == Torrent.Status.StalledSeeding)
+                    && torrent.ratioLimitMode != Torrent.RatioLimitMode.UnlimitedRatio) {
+                progressBar.progress = (torrent.ratio / torrent.ratioLimit * 100).toInt()
+                progressBar.secondaryProgress = 100
+            } else {
+                progressBar.progress = (torrent.percentDone * 100).toInt()
+                progressBar.secondaryProgress = 0
+            }
+
             downloadSpeedTextView.text = activity.getString(R.string.download_speed_string,
                                                             Utils.formatByteSpeed(activity,
                                                                                   torrent.downloadSpeed))

Feature request: display full date and time details

I'd like to request the option to display timestamps on the torrent details tab as full dates and times. For example, instead of "23 hours ago" or "Feb 22, 2019", I would like to always see something along the lines of "Feb 22, 2019 at 9:05 PM" or "2019-02-22 09:05 PM"

This feature request applies to the "Last activity", "Created on", and "Added date" fields, as well as any other timestamp fields that might be added in the future. For example, it would also be amazing to have a "Completed on" field. (See the fourth screenshot from the Transmission Remote page to get a sense of what I'm trying to describe.)

P.S. I just discovered this app today and I'm already in love with it! Thanks for making such a great, open-source app! :-)

app outside home network

hi there, i downloaded your app for sailfish and after some configuration i made it work. it a very fantastic app and i love it so far, but unfortunately seems to be working only on the network where transmission is connected to. can you give me some help on how to make it work even with another network?

connect to Transmission over Tor, with .onion support

Tor Onion Services provide a private way to securely connect to network services. They are also easier to setup and run than HTTPS. It would be great if tremotesf supported .onion addresses. Then someone can install Transmission on a home server, enable the .onion address for it, then privately and securely reach Transmission from anywhere on the Internet.

The easy way to do this is just add support for HTTP CONNECT and/or SOCKS proxy settings. Then the Orbot app will provide Tor to Tremotesf when the user sets the proxy settings. There are somethings that can be added to make that easier to do, like an "Orbot" or "Tor" proxy setting that sets the proxy to SOCKS on localhost on port 9050.

French translation

French translation is not that good. How can I help?
On transifex I can't ask to join the team to translate to the french language.

[Bug/Intrusive design] kb's and kib's

Consider changing the unit on your app, its bad design by default. I ignore setting limits trough tremotesf because of it.
Its important it being equal to transmission.

Orientation change bug

When a user changes screen orientation, first server is selected automatically instead of last selected one

Feature request : Notification

Hi !
I know that you won't be able to do that right now but I'll send my ideas anyway to keep making think that this project, your project is important to some people ! So.. It can ne great to add notification whether a torrent is finished or uploaded more than x GB of bandwidth ect..

Thanks for your awesome app !
Best regards.

Turkish Language

I completed the Turkish translation. When does the F-Droid come to the store to update?

App freezes complete Android

tremotesf worked very well until the amount of torrents growthed to much. When I reached some kind of limit (~1500 torrents) most of the time tremotesf completly freezed my android 9.0 smartphone with linageos installed on it. I haven't encountered this kind of issue on any other app. Sometime when waiting a lot time (~30 mins) it works again. Sometimes not.

The issue occurs when initially connecting to the server. If all the data was parsed initially it also works well.
It freezes at some point when it shows the connecting ring.

My assumption is, that parsing or collection that much information at a short time breaks the app. The app transdroid meanwhile still works very well (but doesn't have some cool features tremotesf has). The built-in webui of transmission-daemon also works well with this many torrents.

If I can activate logging or stuff, I will provide more infos.

Feature request:rename torrent

sometimes torrent name is too long (for Linux ext4 and NTFS the limit is 255,but I cannot find the solution on the Internet)
And then I want to rename it so that I can download from other peers.

It is available in transmission webui.But it might be easier if it is implemented in this app.
Thanks in advance :)

Feature request:sort by upload speed

Hi,
Can you add function:sort by upload speed.
And show seeds of every torrent On the main screen.
Sorry for my poor english
Thanks a lot!
Best regards

Honor global limits issue

I have 'Honor global limits' checked by default.
When I tap the torrent and go to 'Limits' tab directly, everything is fine.
But when I tap the torrent, go to 'Peers' tab, then wait for update and go to 'Limits' tab, 'Honor global limits' is unchecked.
It is reproduced only with 'Peers' tab, others are ok.

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.