Git Product home page Git Product logo

plane2ninja's Introduction

Plane2Ninja

Small utility to export data from Invoice Plane to Invoice Ninja.

Intro

This is a small Laravel based application that connects directly to a Invoice Plane database. The data is then transformed into a JSON file which is compatible for importing directly into Invoice Ninja.

Limitations

There are some limitations for transferring data out of Invoice Plane and into Invoice Ninja. Invoice Plane has the ability to apply discounts to line items Invoice Ninja does not, there is no way to work around this yet, so if you use extensive line item discounts, this solution may not work for you.

Alpha quality

Please remember this is alpha quality, please test and create an issue if you find a bug/issues.

Setup

  1. Download / Clone repo
  2. Composer install
  3. cp .env.example .env
  4. Configure .env file with your Invoice Plane database credentials
  5. Generate artisan key (php artisan key:generate). This will fill the APP_KEY in the .env file.
  6. Clear the artisan cache (php artisan config:clear)
  7. Configure Virtual Host
  8. Navigate to Web URL
  9. Click Download Data!
  10. Import into Invoice Ninja

plane2ninja's People

Contributors

csiwek avatar svavs avatar turbo124 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

plane2ninja's Issues

'App\Models\Payment' not found

New error after #7

`(1/1) FatalThrowableErrorClass 'App\Models\Payment' not found

in HasRelationships.php (line 487)
at Model->newRelatedInstance('App\Models\Payment')in HasRelationships.php (line 220)
at Model->hasMany('App\Models\Payment', 'invoice_id', 'invoice_id')in Invoice.php (line 33)
at Invoice->payments()in Builder.php (line 527)
at Builder->Illuminate\Database\Eloquent{closure}()
at call_user_func(object(Closure))in Relation.php (line 89)
at Relation::noConstraints(object(Closure))in Builder.php (line 531)
at Builder->getRelation('payments')in Builder.php (line 499)`

Unknown column 'ip_payment_methods.invoice_id'

Seems its the same error as in #6

(2/2) QueryException SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ip_payment_methods.invoice_id' in 'where clause' (SQL: select * from ip_payment_methodswhereip_payment_methods.invoice_id in (3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 114, 118, 119, 120, 121, 122, 124, 125, 126, 127, 129, 130, 131, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 150, 151, 152, 154, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 334, 335, 336, 337, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 353, 354, 355, 356, 357, 358, 359, 360, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428))

There are only two columns in that table
payment_method_id
payment_method_name

Blank Directory When Attempting Download

I have installed the Plane2Ninja application to a virtual server. I have also ported my database to that same server. I can successfully get to the page that says "download data" but as soon as I click the button it redirects me to an empty directory /crunch/clients off the root of the web server directory. I am wondering if I have a permissions error and where I can diagnose this. Is this something that you have run across before?

Transform Quotes

Was there any particular reason you left out the "quotes" transformations? I have successfully transferred my invoicePlane data to Invoice Ninja with the exception of the quotes....

SQL error Column not found

Invoiceplane 1.5.4
I'm getting this:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ip_payment_methods.invoice_id' in 'where clause' (SQL: select * from ip_payment_methods where ip_payment_methods.invoice_id in (2, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 60, 64, 65, 66, 67, 68, 69, 70, 71))

in ip_payment_methods there's no invoice_id column.

Error when attempting download

`

(1/1) FatalThrowableErrorType error: Argument 1 passed to App\Plane2Ninja\Transformers\QuoteItemTransformer::transform() must be an instance of App\Models\QuoteItem, instance of App\Models\InvoiceItem given, called in /home/web/htdocs/plane2ninja.****.com/public/app/Plane2Ninja/Ninja/NinjaFactory.php on line 140

in QuoteItemTransformer.php (line 16)

`

Download data resolving wrong address - http://localhost/crunch/clients

Hey Team,

I have been enjoying the challenge of migrating my invoices from fusion > invoiceplane > invoiceninja

Following the instructions and issue trail, I have cloned locally, installed dependencies via composer (typing composer install after changing to correct director) edited the .env file supplied to connect to my IP database, then generate an artisan key.

I was excited to see the download data button, but then stopped dead by it resolving the address:
http://localhost/crunch/clients. I've updated IP, tested the connection to the database and deleted and gone through the install three times now. What should I be looking at next?

Here's my .env file

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:long-ass-key
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_invoiceplane
DB_USERNAME=un_invoiceplane
DB_PASSWORD=securedpassword

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=

Failed to import certain records (already exist or are missing fields?)

I'm not sure if this is related to the recent quotes code push but when trying to import I receive this error.. Undefined index: account_email_settings

When Importing the Data and Settings checkboxes were checked. Looking at the exported json, there's no settings or account_email_settings arrays.

NOTE: This is on a fresh install of the latest InvoiceNinja.


Issue 1 - Errors importing data only

Now that I think about it, settings wouldn't really be the same and you don't even back them up, duh. I however did try to re-import again and received this error with just the data checked:

Successfully created 33 client(s)
Successfully created 81 invoice(s)
Successfully created 64 payment(s)
Successfully created 4 quotes(s)
Successfully created 7 product(s)
The following records failed to import, they either already exist or are missing required fields.
{"invoice_id":6}
{"invoice_id":30}
{"invoice_id":42}
{"invoice_id":43}
{"invoice_id":44}
{"invoice_id":45}
{"invoice_id":46}
{"invoice_id":47}
{"invoice_id":49}
{"invoice_id":50}
{"invoice_id":51}
{"invoice_id":52}
{"invoice_id":53}
{"invoice_id":54}
{"invoice_id":55}
{"invoice_id":56}
{"invoice_id":61}
{"invoice_id":63}
{"invoice_id":82}
{"invoice_id":83}
{"invoice_id":84}
{"invoice_id":85}

Issue 2 - Client/invoice balance is negative

Another note: when viewing the clients, the balance shows negative numbers i.e. $-620.00 for a client who's already paid up? This is what's show in the activity area after I create the client.. see https://goo.gl/e43i2Z

I click the invoices tab and it shows the invoice, the amount of 620 then balance equals 0 and status is paid. The payments tab shows the +620 payment. So why would this customer's balance be -$620? Is this perhaps an InvoiceNinja bug instead?


Issue 3 - Invoice due date not moved over

It seems the due date is not moved over for the invoice


Issue 4 - Client Portal does not show invoices or payments?

Perhaps we're getting into an InvoiceNinja bug here but shouldn't all invoices paid or unpaid show in the client's web portal? The same goes for the payments area on the web portal? The dashboard shows $620 paid to date and an open balance of $-620 for the same client with the negative issue above.

403 Forbidden - nginx

hi,
I'm hoping I could get some help with my nginx .conf file to get your project to run?

`server {
listen 1022;
server_name 192.168.1.113;
#access_log /var/log/nginx/p2n/p2n.access.log main;
error_log /var/log/nginx/p2n/p2n.error.log warn;

root /var/www/html/p2n;
index index.php index.html index.htm info.php;

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
    try_files $uri $uri/ =404;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

}`

When I go to the project on my box, I get a '403 forbidden'

I assume its because of this line:

index index.php index.html index.htm info.php;

but I'm not sure what to place here.

Thanks!

Payment "The amount field is required."

I believe this is similar issue to #4
I've exported from Invoice Plane, and when attempting to import to InvoiceNinja I get the following errors.

The following records failed to import, they either already exist or are missing required fields.
{"invoice_id":2,"type":"payment","error":"The amount field is required."}
{"invoice_id":9,"type":"payment","error":"The amount field is required."}
{"invoice_id":14,"type":"payment","error":"The amount field is required."}
{"invoice_id":116,"type":"payment","error":"The amount field is required."}
{"invoice_id":121,"type":"payment","error":"The amount field is required."}
{"invoice_id":122,"type":"payment","error":"The amount field is required."}
{"invoice_id":129,"type":"payment","error":"The amount field is required."}
{"invoice_id":134,"type":"payment","error":"The amount field is required."}
{"invoice_id":146,"type":"payment","error":"The amount field is required."}
{"invoice_id":155,"type":"payment","error":"The amount field is required."}
{"invoice_id":158,"type":"payment","error":"The amount field is required."}
{"invoice_id":159,"type":"payment","error":"The amount field is required."}

What is odd, is that some of those payments exist in the JSON file, and they do have the amount field! Checking in InvoiceNinja, those payments have failed to import. (There are payments that are missing, which is fine, but there should only be about 6 missing payments)

For example, invoice_id 2 and 9 payments:

"invoices": [
                {
                    "client_id": 5,
                    "invoice_number": "0257",
                    "amount": "15.00",
                    "po_number": "",
                    "terms": "",
                    "public_notes": "",
                    "invoice_date": "2015-07-01",
                    "due_date": null,
                    "invoice_status_id": 6,
                    "is_amount_discount": null,
                    "discount": 0,
                    "tax_name1": "",
                    "tax_rate1": 0,
                    "tax_name2": "",
                    "tax_rate2": 0,
                    "invoice_design_id": 1,
                    "is_public": 1,
                    "invoice_items": [
                        {
                            "product_key": "XXXXX",
                            "notes": "XXXXX",
                            "cost": "15.00",
                            "qty": "1.00",
                            "tax_name1": "",
                            "tax_rate1": 0,
                            "invoice_item_type_id": 1,
                            "discount": "0.00"
                        }
                    ],
                    "payments": [
                        {
                            "id": 2,
                            "amount": 15,
                            "payment_date": "2015-07-09",
                            "client_id": 5,
                            "invoice_id": 2,
                            "payment_type_id": 3
                        }
                    ]
                },


{
                    "client_id": 5,
                    "invoice_number": "0269",
                    "amount": "15.00",
                    "po_number": "",
                    "terms": "",
                    "public_notes": "",
                    "invoice_date": "2015-09-01",
                    "due_date": null,
                    "invoice_status_id": 6,
                    "is_amount_discount": null,
                    "discount": 0,
                    "tax_name1": "",
                    "tax_rate1": 0,
                    "tax_name2": "",
                    "tax_rate2": 0,
                    "invoice_design_id": 1,
                    "is_public": 1,
                    "invoice_items": [
                        {
                            "product_key": "XXXXX",
                            "notes": "XXXXX",
                            "cost": "15.00",
                            "qty": "1.00",
                            "tax_name1": "",
                            "tax_rate1": 0,
                            "invoice_item_type_id": 1,
                            "discount": "0.00"
                        }
                    ],
                    "payments": [
                        {
                            "id": 9,
                            "amount": 15,
                            "payment_date": "2015-09-09",
                            "client_id": 5,
                            "invoice_id": 14,
                            "payment_type_id": 3
                        }
                    ]
                },

Update composer.json name attribute for compatibility with Composer v2

The following error occurs when using Composer v2

[Composer\Json\JsonValidationException]   "./composer.json" does not match the expected JSON schema:
- name : Does not match the regex pattern ^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$   

install [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--dry-run] [--dev] [--no-suggest]
[--no-dev] [--no-autoloader] [--no-scripts] [--no-progress] [--no-install] [-v|vv|vvv|--verbose]
[-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] 
[--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--ignore-platform-req IGNORE-PLATFORM-REQ] 
[--ignore-platform-reqs] [--] [<packages>]...

Uppercase characters are not allowed in the name attribute and this is now enforced in Composer v2 and was just a deprecation warning in Composer v1.

Deprecation warning: Your package name vendor_name/PhpProjec is invalid, it should not contain uppercase characters. We suggest using vendor_name/php-projec instead. Make sure you fix this as Composer 2.0 will error.

The workaround currently is to update the name attribute to be in lowercase, i.e. "name": "turbo124/plane2ninja"

Clicking on "Download Data" throws an error

Hi,

after configured and running on web server, when clicking on the "Download Data" button it displays a "Whoops, looks like something went wrong." page with the following error.

I need to export data from InvoicePlane 1.5.9.

What's wrong? Thanks.

`
(1/1) ErrorException
Trying to get property 'tax_rate_name' of non-object

in InvoiceTransformer.php line 62

at HandleExceptions->handleError(8, 'Trying to get property 'tax_rate_name' of non-object', '/var/www/html/plane2ninja.lan/app/Plane2Ninja/Transformers/InvoiceTransformer.php', 62, array('invoice' => object(Invoice), 'index' => 1, 'taxName' => array(array('invoice_tax_rate_id' => 1, 'invoice_id' => 7, 'tax_rate_id' => 0, 'include_item_tax' => 1, 'invoice_tax_rate_amount' => '0.00')), 'tax_rate' => null))in InvoiceTransformer.php line 62
at InvoiceTransformer->getTaxName(object(Invoice), 1)in InvoiceTransformer.php line 33
at InvoiceTransformer->transform(object(Invoice))in NinjaFactory.php line 84
at NinjaFactory->buildInvoices(object(Collection))in ClientTransformer.php line 45
at ClientTransformer->transform(object(Client))in NinjaFactory.php line 58
at NinjaFactory->buildNinja(object(Collection))in ImportController.php line 46
at ImportController->crunch('clients')
at call_user_func_array(array(object(ImportController), 'crunch'), array('class_name' => 'clients'))in Controller.php line 55
at Controller->callAction('crunch', array('class_name' => 'clients'))in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), object(ImportController), 'crunch')in Route.php line 203
at Route->runController()in Route.php line 160
at Route->run()in Router.php line 572
at Router->Illuminate\Routing{closure}(object(Request))in Pipeline.php line 30
at Pipeline->Illuminate\Routing{closure}(object(Request))in SubstituteBindings.php line 41
at SubstituteBindings->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in VerifyCsrfToken.php line 65
at VerifyCsrfToken->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in Pipeline.php line 102
at Pipeline->then(object(Closure))in Router.php line 574
at Router->runRouteWithinStack(object(Route), object(Request))in Router.php line 533
at Router->dispatchToRoute(object(Request))in Router.php line 511
at Router->dispatch(object(Request))in Kernel.php line 176
at Kernel->Illuminate\Foundation\Http{closure}(object(Request))in Pipeline.php line 30
at Pipeline->Illuminate\Routing{closure}(object(Request))in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in ValidatePostSize.php line 27
at ValidatePostSize->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure))in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline{closure}(object(Request))in Pipeline.php line 53
at Pipeline->Illuminate\Routing{closure}(object(Request))in Pipeline.php line 102
at Pipeline->then(object(Closure))in Kernel.php line 151
at Kernel->sendRequestThroughRouter(object(Request))in Kernel.php line 116
at Kernel->handle(object(Request))in index.php line 53

`

.env sample config?

Hey,

Configure .env file with your Invoice Plane database credentials

I've poked around the Laravel app & tried to guess at what the .env file needs to contain, however I think it'd be much better if I could base one off a pre-made sample.

Would it be possible for one to please be provided?

Cheers,

Unable to "Install"

I downloaded the release and uploaded to a sub-folder of my Invoice Ninja installation with no luck. I then tried creating a new subdomain just for Plane2Ninja and it doesn't work either. Is there supposed to be a .htaccess file or something?

Not able to click download, sends me to blank directory

After finally being able to install, I am unable to download any data. Once clicking on "download" it tries taking me to http://localhost/crunch/clients which is unavailable. I am running on Linux Apache and my .env file and virtual host file are below.

My .env file (Blanked out sql details)

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:Longasskey
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=remotesqlserver
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=username
DB_PASSWORD=supersecretpassword
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=

My vhost file

ServerAdmin [email protected]
ServerAlias xxxx.domain.org
DocumentRoot /var/www/html/Plane2Ninja/public

Any help would be amazing. Thank you :)

Sales Tax causes a negative?

Several invoices show a negative balance. These were paid invoices from Invoiceplane with sales tax items. The negative amounts are exactly the sales tax.

I can reimport again, is there a way to fix this though?

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.