GithubHelp home page GithubHelp logo

spatie / laravel-web-tinker Goto Github PK

View Code? Open in Web Editor NEW
1.0K 14.0 66.0 2.54 MB

Tinker in your browser

Home Page: https://spatie.be/open-source

License: MIT License

PHP 29.02% CSS 5.74% JavaScript 55.10% Vue 8.72% Blade 1.42%
php laravel debug tinker tool

laravel-web-tinker's Introduction

Artisan Tinker in your browser

Latest Version on Packagist GitHub Workflow Status Total Downloads

Artisan's tinker command is a great way to tinker with your application in the terminal. Unfortunately running a few lines of code, making edits, and copy/pasting code can be bothersome. Wouldn't it be great to tinker in the browser?

This package will add a route to your application where you can tinker to your heart's content.

Web tinker light

In case light hurts your eyes, there's a dark mode too.

Web tinker dark

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

🚨 A word to the wise 🚨

This package can run arbitrary code. Unless you know what you are doing, you should never install or use this in a production environment, or any environment where you handle real world data.

Installation

You can install the package via composer:

composer require spatie/laravel-web-tinker --dev

Next, you must publish the assets from this package by running this command.

php artisan web-tinker:install

Optionally, you can publish the config file of the package.

php artisan vendor:publish --provider="Spatie\WebTinker\WebTinkerServiceProvider" --tag="config"

This is the content that will be published to config/web-tinker.php

return [

    /*
     * The web tinker page will be available on this path.
     */
    'path' => '/tinker',

    /*
     * Possible values are 'auto', 'light' and 'dark'.
     */
    'theme' => 'auto',

    /*
     * By default this package will only run in local development.
     * Do not change this, unless you know what your are doing.
     */
    'enabled' => env('APP_ENV') === 'local',

   /*
    * This class can modify the output returned by Tinker. You can replace this with
    * any class that implements \Spatie\WebTinker\OutputModifiers\OutputModifier.
    */
    'output_modifier' => \Spatie\WebTinker\OutputModifiers\PrefixDateTime::class,

    /*
    * These middleware will be assigned to every WebTinker route, giving you the chance
    * to add your own middlewares to this list or change any of the existing middleware.
    */
    'middleware' => [
        Illuminate\Cookie\Middleware\EncryptCookies::class,
        Illuminate\Session\Middleware\StartSession::class,
        Spatie\WebTinker\Http\Middleware\Authorize::class,
    ],

    /*
     * If you want to fine-tune PsySH configuration specify
     * configuration file name, relative to the root of your
     * application directory.
     */
    'config_file' => env('PSYSH_CONFIG', null),
];

Usage

By default this package will only run in a local environment.

Visit /tinker in your local environment of your app to view the tinker page.

Authorization

Should you want to run this in another environment (we do not recommend this), there are two steps you must perform.

  1. You must register a viewWebTinker ability. A good place to do this is in the AuthServiceProvider that ships with Laravel.
public function boot()
{
    $this->registerPolicies();

    Gate::define('viewWebTinker', function ($user = null) {
        // return true if access to web tinker is allowed
    });
}
  1. You must set the enabled variable in the web-tinker config file to true.

Modifying the output

You can modify the output of tinker by specifying an output modifier in the output_modifier key of the web-tinker config file. An output modifier is any class that implements \Spatie\WebTinker\OutputModifiers\OutputModifier.

This is how that interface looks like.

namespace Spatie\WebTinker\OutputModifiers;

interface OutputModifier
{
    public function modify(string $output = ''): string;
}

The default install of this package will use the PrefixDataTime output modifier which prefixes the output from Tinker with the current date time.

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security

If you've found a bug regarding security please mail [email protected] instead of using the issue tracker.

Credits

This package was inspired by and uses code from the nova-tinker-tool package by Marcel Pociot.

License

The MIT License (MIT). Please see License File for more information.

laravel-web-tinker's People

Contributors

adrianmrn avatar ahmic avatar alexvanderbist avatar brendt avatar chapeupreto avatar craftlogan avatar d13r avatar dependabot[bot] avatar eli-s-r avatar emargareten avatar emiliopedrollo avatar freekmurze avatar geradrum avatar grahamcampbell avatar laravel-shift avatar malikkrehic avatar nielsvanpach avatar parse-dinghua avatar plunkettscott avatar riasvdv avatar rubenvanassche avatar rzv-me avatar sam-apostel avatar scil avatar sebastiandedeyne avatar setkyar avatar shaffe-fr avatar tymondesigns avatar willemvb 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

laravel-web-tinker's Issues

Not detecting correct last statement

This is a smaller issue, but one that requires me to tweak my usage slightly toward how I might use the CLI, which goes against one of the purposes of this package. Great job, by the way!

My issue is that commented lines do not allow the previous line to be output to the right-side display.

Scenario:
I run a statement (let's say a query) and see the output.
I then run another statement and see its result.
I comment out the last statement so I can see the previous one, but now I've hit the bug and cannot see anything.

Sample code:

$newUsers = User::latest()->take(3)->get();

// $allUsers = User::all();

I can just cut the code that causes the bug and then paste it back in once I've seen the result, but this can get bothersome.

Thanks again! 😁
Parker

error after composer update

Laravel 8

Upgrading psy/psysh (v0.11.2 => v0.11.4)

web tinker not working

exception:

Undefined array key "argv" {"userId":1,"exception":"[object] (ErrorException(code: 0): Undefined array key "argv" at vendor/psy/psysh/src/Readline/Hoa/Protocol.php:90)

'null' file created in public folder

In windows, a 'null' file containing history commands is created at public folder. This can be accesed/viewed through the URL.
Could you move the location to storage path or making customized in config file?

The file is spatie/laravel-web-tinker/src/Tinker.php.
The line is
$config->setHistoryFile(defined('PHP_WINDOWS_VERSION_BUILD') ? 'null' : '/dev/null');

Idea: add a new option "auto" for dark theme

I was tinkering (no pun intended) with the idea of a new option for dark theme called "auto" (so it will accept true/false and "auto").

    /*
     * If light hurts you eyes, set this to true.
     */
    'dark_theme' => 'auto',

All that it does is adding a new class to html element and then using media queries the interface of the package will changed based on user's OS preference. The media query is not yet supported by many browsers, but Safari already tested it in Safari Technology Preview and it will become standard.

image

Quick demo:
image

What do you say, it is worth doing it? When the media query becomes a standard on all browser, this package would already support it.

The Mix manifest does not exist.

In Local environment i have "The Mix manifest does not exist." error, when i try to get /tinker page

\vendor\laravel\framework\src\Illuminate\Foundation\Mix.php:42

instead of
[LARAVELDIR]/public/mix-manifest.json
script is trying to find manifest in:
[LARAVELDIR]/public/vendor/web-tinker/mix-manifest.json

Doesn't work behind a reverse proxy

If web-tinker is used behind an HTTPS reverse proxy, but the server itself is not HTTPS, it will generate HTTP based absolute URLs which then the tinker client will make requests to, and fail because of Mixed Content security errors.

The code that generates absolute URLs is in src/Http/Controllers/WebTinkerController.php

I have set the APP_URL environment variable to an HTTPS url.

PHP 8 support

Will Laravel Web Tinker support PHP 8 in the future?

Thank you in advance!

Dark Theme not working in Nova iframe

I integrated webtinker into Laravel Nova like this:

Nova::mainMenu(function (Request $request, Menu $menu)
{
    $menu->append(
        MenuSection::make('Developer Tools', [
            MenuItem::link('Tinker', '/tinker'),
        ])
    );

    return $menu;
});

If i click on the Nova-Menu link, it opens an iframe that shows /tinker in the white theme. (But the dark theme is configured in the config)
If i open the /tinker route manually in the browser, the dark theme is working as expected.

PHP deprecation warning stops web tinker

I have Laravel 5.8 and after a recent composer update, I find myself seeing this deprecation warning:

PHP Deprecated: The "Doctrine/Common/Inflector/Inflector::pluralize" method is deprecated and will be dropped in doctrine/inflector 2.0.

In web tinker, this results in an inability to produce output for Laravel-related code, e.g.:

echo 'hello';
Model::find(1);

returns

hello
[deprecation warnings..]

In artisan tinker, the above shows the output for Model::find(1) in addition to the warnings.

Error after update

I'm getting an error (exception) after upgrading the package:

Undefined index: argv {"exception":"[object] (ErrorException(code: 0): Undefined index: argv at /opt/rh/httpd24/root/var/www/afr/vendor/psy/psysh/src/Readline/Hoa/Protocol.php:90)

and

Undefined offset: 0 {"exception":"[object] (ErrorException(code: 0): Undefined offset: 0 at /opt/rh/httpd24/root/var/www/afr/vendor/psy/psysh/src/Readline/Hoa/Protocol.php:90)

after enabling register_argc_argv on php.ini.

User is always null?

image

If I remove = null I get a 403. Am I doing something wrong here or is this part broken?

>>> env('WEB_TINKER_ENABLED', false)
=> true

Lumen Support

Hi
Just was trying to make this awesome package work with lumen and it worked with a little tweak.
Are you open to PR for this?

Encoding issues with Laravel 6

I installed this package on Laravel 6 project. But I am encountering some encoding problems. Please see the screenshot below. I don't face such a problem with tinker in the terminal, it is only happening in tinker-web. I checked both Chrome and Safari are having the same problem. I am using a Mac. Any suggestions how to fix this?

Screenshot 2020-12-06 at 10 21 21 PM

I came across similar issues with tinker in terminal on stackoverflow, but my problem is only with this package, not in the terminal:
https://stackoverflow.com/questions/33537366/artisan-showing-inserting-32m-344m-and-similar/39955445

Any help is greatly appreciated!

Possible to allow config to change public path of css/js files?

The web-tinker folder is hard coded to sit inside a vendor folder within the public path. This conflicts with any internal Vendor classes and when saving a new Vendor, it redirects 403 Forbidden.

Is it possible for the published config file to allow the user to change where that folder sits within the public path - even a higher level web-tinker would be great.

I can't find where laravel-web-tinker looks for that file in the code to change it, even temporarily.

Thank you for this great tool.

Fallback

In a project that I use, I do have a fallback and a catch-all {?slug} route. They are intercepting all /tinker requests.

Do you have any way of helping me reach web-tinker prior to falling back?

echo not working in whileloop

Please help me to resolve this problem
i tried many time but echo is not working in while loop
and if i type echo out of while loop then it work properly.
but i want in while loop


Screenshot (6)

Console outputs: INFO Ctrl + D

Updated to Laravel 10 and now the console outputs INFO Ctrl + D.

Example:

2023-02-28 02:27:58
- 
[!] Aliasing 'User' to 'App\Models\User' for this Tinker session.
= Illuminate\Database\Eloquent\Collection {#3772
    all: [],
  }


   INFO  Ctrl+D.

I mean, it's not an error and just something "visual", it doesn't affect the execution.

500 Internal Server Error Laravel Web Tinker

OS: windows 10
Laravel Version: 7.30.5
Laravel Web Tinker Version: 1.7.7
Environment: Laragon php 7.4

When I press ctrl+enter browser console showing 500 response but laravel/tinker is working fine.

Capture

In the network tab:
Capture

Please make compatible with laravel/tinker:^2.0

  Problem 1
    - spatie/laravel-web-tinker 1.6.0 requires laravel/tinker ^1.0 -> satisfiable by laravel/tinker[1.x-dev, v1.0.0, v1.0.1, v1.0.10, v1.0.2, v1.0.3, v1.0.4, v1.0.5, v1.0.6, v1.0.7, v1.0.8, v1.0.9] but these conflict with your requirements or minimum-stability.

But laravel latest has already updated to tinker:^2.0

Error 500

I have error 500 in the browser`s console after I am trying run the code but from the terminal, the tinker works perfectly. How to fix the error 500?
Screenshot 2019-05-15 at 14 25 23
Thanks

No response after Ctrl+Enter

This is the log of my terminal:

test@SOMEWHERE:/mnt/c/Users/test/Documents/projects/test$ php artisan serve --port=8080
Laravel development server started: <http://127.0.0.1:8080>
[Wed Jul 10 20:02:38 2019] 127.0.0.1:62125 [200]: /vendor/web-tinker/app.css?id=899f99be02229222ee1b
[Wed Jul 10 20:02:38 2019] 127.0.0.1:62126 [200]: /vendor/web-tinker/app.js?id=745ec8810b33383dd0eb
[Wed Jul 10 20:02:38 2019] 127.0.0.1:62128 [200]: /favicon.ico
Killed


Do note that laravel's serve isn't exited yet. This is what happened when I typed in 1+1 and Ctrl+Enter.

Publish Named Routes

It would be nice to have the published routes name. we have a backend console and would like to include it using named routes.

Empty user

I have install web-ticker

➜ composer require spatie/laravel-web-tinker --dev
Using version ^1.7 for spatie/laravel-web-tinker
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing spatie/laravel-web-tinker (1.7.3): Downloading (100%)         
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: intervention/image
Discovered Package: laravel-shift/blueprint
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: spatie/laravel-medialibrary
Discovered Package: spatie/laravel-permission
Discovered Package: spatie/laravel-web-tinker
Package manifest generated successfully.
51 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

i_skiridomov in crm on ξ‚  master [!?] via β¬’ v12.18.0 via 🐘 v7.4.8 on 🐳 v19.03.12 (docker) at ☸️  qa  took 22s 
➜ php artisan web-tinker:install
Publishing Web Tinker Assets...
Web tinker installed successfully.

Tried to get my user:
Screen Shot 2020-07-11 at 3 19 57 PM

tincker from Psy Shell works:

Psy Shell v0.10.4 (PHP 7.4.8 β€” cli) by Justin Hileman
>>> User::first();
[!] Aliasing 'User' to 'App\User' for this Tinker session.
=> App\User {#3921
     id: 1,
     name: "admin",
     email: "[email protected]",
     email_verified_at: null,
     created_at: "2020-07-11 05:58:24",
     updated_at: "2020-07-11 05:58:24",
   }
>>> 
>>> App::environment()
=> "local"
>>> 

config tinker

According to the documentation, the .psysh file must be placed in the root of the project, and Tinker finds it using the "getcwd" function, but when using tinker web, the "getcwd" returns "/ public" instead of the root of the project ("/") and does not correctly load the ".psysh" file

my file .psys example
<?php return [ 'runtimeDir' => './.psysh', 'configDir' => './.psysh', ];

Display timestamp of execution

Mostly, I use web tinker to test third-party connections (oracle db, ldap) to see if I am connected to these services while fiddling through the config values. When I get the same output every time, I get confused. Is there a way to display a timestamp of execution at the top, so that i can see something changes in the screen despite the same output. Please.

Thank you.

Custom path no longer works

Due to the changes in 253cf4b it's no longer possible to set a custom path in the config file in 1.4.3 - it's hard-coded to '/tinker' in the JS, so changing it in the PHP just results in a 404 error.

https://github.com/spatie/laravel-web-tinker/blob/1.4.3/resources/js/components/TinkerInput.vue#L60

I was about to submit a PR changing it to window.location.pathname, but I see it used to be window.location until 0fb53dc and I'm not sure why it was changed.

Related: #28

Uncaught (in promise) Error: Network Error

I get the GET /tinker page, but when is it sent (Ctrl + Enter), the POST fails, and it does nothing.

In the dev-tool console appears "Uncaught (in promise) Error: Network Error".

I'm using Laravel 8. Using Laragon for the server config on Windows.

How can I debug what is wrong?

Laravel 7.0 Support Request

Laravel Version: 7.0.2
Laravel-web-tinker version: 1.6

please add support for laravel 7.0 when I try to install laravel-web-tinker beside laravel 7.0 it occurs.

Your requirements could not be resolved to an installable set of packages.

Problem 1

  • Conclusion: remove laravel/framework v7.0.2
  • Conclusion: don't install laravel/framework v7.0.2
- spatie/laravel-web-tinker 1.6.0 requires illuminate/session ^5.8|^6.0 -> satisfiable by laravel/framework[6.x-dev], illuminate/session[5.8.x-dev, 6.x-dev, v5.8.0, v5.8.11, v5.8.12, v5.8.14, v5.8.15, v5.8.17, v5.8.18, v5.8.19, v5.8.2, v5.8.20, v5.8.22, v5.8.24, v5.8.27, v5.8.28, v5.8.29, v5.8.3, v5.8.30, v5.8.31, v5.8.32, v5.8.33, v5.8.34, v5.8.35, v5.8.36, v5.8.4, v5.8.8, v5.8.9, v6.0.0, v6.0.1, v6.0.2, v6.0.3, v6.0.4, v6.1.0, v6.10.0, v6.11.0, v6.12.0, v6.13.0, v6.13.1, v6.14.0, v6.15.0, v6.15.1, v6.16.0, v6.17.0, v6.17.1, v6.18.0, v6.2.0, v6.3.0, v6.4.1, v6.5.0, v6.5.1, v6.5.2, v6.6.0, v6.6.1, v6.6.2, v6.7.0, v6.8.0].
- spatie/laravel-web-tinker 1.6.1 requires illuminate/session ^5.8|^6.0 -> satisfiable by laravel/framework[6.x-dev], illuminate/session[5.8.x-dev, 6.x-dev, v5.8.0, v5.8.11, v5.8.12, v5.8.14, v5.8.15, v5.8.17, v5.8.18, v5.8.19, v5.8.2, v5.8.20, v5.8.22, v5.8.24, v5.8.27, v5.8.28, v5.8.29, v5.8.3, v5.8.30, v5.8.31, v5.8.32, v5.8.33, v5.8.34, v5.8.35, v5.8.36, v5.8.4, v5.8.8, v5.8.9, v6.0.0, v6.0.1, v6.0.2, v6.0.3, v6.0.4, v6.1.0, v6.10.0, v6.11.0, v6.12.0, v6.13.0, v6.13.1, v6.14.0, v6.15.0, v6.15.1, v6.16.0, v6.17.0, v6.17.1, v6.18.0, v6.2.0, v6.3.0, v6.4.1, v6.5.0, v6.5.1, v6.5.2, v6.6.0, v6.6.1, v6.6.2, v6.7.0, v6.8.0].
- Can only install one of: laravel/framework[6.x-dev, v7.0.2].

Nothing happens on ctrl+enter

Hi, I have followed the installation instructions and the tinker appear on /tinker route.
When I press "CTRL+ENTER' on any inputs - nothing happens. There is nothing in browser console.

There is a request to a server (post request to /tinker), which returns error 500 after timeout.

Browser is Firefox 72
Laravel environment: latest laravel on PHP 7.3.7, Apache, Windows 10 (laragon).

Is there anything else i have to consider by setup?

tinker url shows 403 forbidden

hi,

sorry if i missed any instruction provided but seems i've followed them carefully but get to see 403 forbidden page when tried to navigate to /tinker url.

my debug begins at routes found as follow:

|        | GET|HEAD  | tinker                                                                             |                                    | Spatie\WebTinker\Http\Controllers\WebTinkerController@index                                | Illuminate\Cookie\Middleware\EncryptCookies,Illuminate\Session\Middleware\StartSession,Spatie\WebTinker\Http\Middleware\Authorize |
|        | POST      | tinker                                                                             |                                    | Spatie\WebTinker\Http\Controllers\WebTinkerController@execute                              | Illuminate\Cookie\Middleware\EncryptCookies,Illuminate\Session\Middleware\StartSession,Spatie\WebTinker\Http\Middleware\Authorize |

so i disable middleware being set in https://github.com/spatie/laravel-web-tinker/blob/master/src/WebTinkerServiceProvider.php#L52-L54 and no more error 403 forbidden.

my question is how do i disable middleware without modifying as above?

Response from command are empty except for errors

I am trying this repo in a new fresh Laravel 7 project and I installed this package. For any reason, the response is always empty for success commands but errors are shown like it should.

image

I have tried this in previous version without an error. Am I missing a step for laravel 7 package installation only?

Thanks in advance. This is a great package!

Echo command does not work

The echo command does not work to due the regular expression in Tinker.php at the cleanOutput method. I will be submitting a pull request to fix this problem. Thanks Logan

screen shot 2019-02-15 at 10 48 51 am

screen shot 2019-02-15 at 10 50 27 am

403 error

Laravel 5.8
Local dev
/tinker gets me a 403

touch(): Utime failed

Running to this error local.ERROR: touch(): Utime failed: Invalid argument {"exception":"[object] (ErrorException(code: 0): touch(): Utime failed: Invalid argument at C:\laragon\www\laravel6\vendor\psy\psysh\src\ConfigPaths.php:233)

Windows 10, laravel 6.0, PHP 7.2.18

It has something to do with this piece of code in Tinker.php :

$config->setHistoryFile(defined('PHP_WINDOWS_VERSION_BUILD') ? 'nul' : '/dev/null');

I don't know with other people, but nul file just doesn't work on my computer, so change it to something like :

$config->setHistoryFile(defined('PHP_WINDOWS_VERSION_BUILD') ? base_path().'/web-tinker-history.txt' : '/dev/null');

solves the problem. At least it's working as a temporary fix until the real culprit is found

Ctrl+Enter not working

When i press Ctrl + Enter, php artisan serve shows "Killed" and stops working.
OS: Ubuntu 20.10
Laravel: 6
PHP: 7.4.3

UI Tweak

This blinks the timestamp, makes it easier to know the output updated. I'm using text-dimmed because that's the only class on the timestamp, I find it friendlier than watching the timestamp closely. Would be good to add this.

.text-dimmed {
    animation: fadein 2s;
}
@keyframes fadein {
  from { background: var(--color-warning); }
  to { background: none; }
    
}

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.