Giter Site home page Giter Site logo

phpbrake's Introduction

PHPBrake

Build Status

Features

PHPBrake is the official Airbrake PHP error notifier. PHPBrake supports PHP 8.2 and higher. PHPBrake includes many useful features that give you control over when and what you send to Airbrake, you can:

Installation

composer require airbrake/phpbrake

Quickstart

// Create new Notifier instance.
$notifier = new Airbrake\Notifier([
    'projectId' => 12345, // FIX ME
    'projectKey' => 'abcdefg' // FIX ME
]);

// Set global notifier instance.
Airbrake\Instance::set($notifier);

// Register error and exception handlers.
$handler = new Airbrake\ErrorHandler($notifier);
$handler->register();

// Somewhere in the app...
try {
    throw new Exception('hello from phpbrake');
} catch(Exception $e) {
    Airbrake\Instance::notify($e);
}

API

Notifier API consists of 4 methods:

  • buildNotice - builds Airbrake notice.
  • sendNotice - sends notice to Airbrake.
  • notify - shortcut for buildNotice and sendNotice.
  • addFilter - adds filter that can modify and/or filter notices.

Adding custom data to the notice

$notifier->addFilter(function ($notice) {
    $notice['context']['environment'] = 'production';
    return $notice;
});

Filtering sensitive data from the notice

$notifier->addFilter(function ($notice) {
    if (isset($notice['params']['password'])) {
        $notice['params']['password'] = 'FILTERED';
    }
    return $notice;
});

Ignoring specific exceptions

$notifier->addFilter(function ($notice) {
    if ($notice['errors'][0]['type'] == 'MyExceptionClass') {
        // Ignore this exception.
        return null;
    }
    return $notice;
});

Add user data to the notice

$notifier->addFilter(function ($notice) {
    $notice['context']['user']['name'] = 'Avocado Jones';
    $notice['context']['user']['email'] = '[email protected]';
    $notice['context']['user']['id'] = 12345;
    return $notice;
});

Setting severity

Severity allows categorizing how severe an error is. By default, it's set to error. To redefine severity, simply overwrite context/severity of a notice object. For example:

$notice = $notifier->buildNotice($e);
$notice['context']['severity'] = 'critical';
$notifier->sendNotice($notice);

Error handler

Notifier can handle PHP errors, uncaught exceptions and shutdown. You can register appropriate handlers using following code:

$handler = new Airbrake\ErrorHandler($notifier);
$handler->register();

Under the hood $handler->register does following:

set_error_handler([$this, 'onError'], error_reporting());
set_exception_handler([$this, 'onException']);
register_shutdown_function([$this, 'onShutdown']);

Laravel integration

See https://github.com/TheoKouzelis/laravel-airbrake

Symfony integration

See https://github.com/aminin/airbrake-bundle

CakePHP 3.x integration

See https://gist.github.com/mauriciovillalobos/01a97f9ee6179ad70b17d54f37cc5010

Zend Framework integration

See https://github.com/FrankHouweling/zend-airbrake

Monolog integration

$log = new Monolog\Logger('billing');
$log->pushHandler(new Airbrake\MonologHandler($notifier));

$log->addError('charge failed', ['client_id' => 123]);

Extra configuration options

appVersion

The version of your application that you can pass to differentiate exceptions between multiple versions. It's not set by default.

$notifier = new Airbrake\Notifier([
    // ...
    'appVersion' => '1.2.3',
    // ...
]);

host

By default, it is set to api.airbrake.io. A host is a web address containing a scheme ("http" or "https"), a host and a port. You can omit the port (80 will be assumed) and the scheme ("https" will be assumed).

$notifier = new Airbrake\Notifier([
    // ...
    'host' => 'errbit.example.com', // put your errbit host here
    // ...
]);

remoteConfig

Configures the remote configuration feature. Every 10 minutes the notifier will make a GET request to Airbrake servers to fetching a JSON document containing configuration settings for your project. The notifier will apply these new settings at runtime. By default, it is enabled.

To disable this feature, configure your notifier with:

$notifier = new Airbrake\Notifier([
    // ...
    'remoteConfig' => false,
    // ...
]);

Note: it is not recommended to disable this feature. It might negatively impact how your notifier works. Please use this option with caution.

rootDirectory

Configures the root directory of your project. Expects a String or a Pathname, which represents the path to your project. Providing this option helps us to filter out repetitive data from backtrace frames and link to GitHub files from our dashboard.

$notifier = new Airbrake\Notifier([
    // ...
    'rootDirectory' => '/var/www/project',
    // ...
]);

environment

Configures the environment the application is running in. Helps the Airbrake dashboard to distinguish between exceptions occurring in different environments. By default, it's not set.

$notifier = new Airbrake\Notifier([
    // ...
    'environment' => 'staging',
    // ...
]);

httpClient

Configures the underlying http client that must implement GuzzleHttp\ClientInterface.

// Supply your own client.
$client = new Airbrake\Http\GuzzleClient(
    new GuzzleHttp\Client(['timeout' => 3])
);

$notifier = new Airbrake\Notifier([
    // ...
    'httpClient' => $client,
    // ...
]);

Filtering keys

With keysBlocklist option you can specify list of keys containing sensitive information that must be filtered out, e.g.:

$notifier = new Airbrake\Notifier([
    // ...
    'keysBlocklist' => ['/secret/i', '/password/i'],
    // ...
]);

Running tests

Run via docker:

docker compose run tests

Or run locally

composer install
vendor/bin/phpunit

PHPDoc

composer require phpdocumentor/phpdocumentor
vendor/bin/phpdoc -d src
firefox output/index.html

Contact

In case you have a problem, question or a bug report, feel free to:

License

PHPBrake is licensed under The MIT License (MIT).

phpbrake's People

Contributors

aminin avatar anmic avatar bcrowe avatar danielpieper avatar desheffer avatar ethanpooley avatar gbirke avatar ilpaijin avatar kyrylo avatar mauriciovillalobos avatar mike-sheppard avatar mmcdaris avatar nebez avatar sagikazarmark avatar stuartmoore1023 avatar themizzi avatar theokouzelis avatar thompiler avatar vinkla avatar vmihailenco 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

Watchers

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

phpbrake's Issues

Last commit made in src/MonologHandler.php break old versions of PHP

Good Afternoon,

You did a change 22 days ago to support monolog 2.0 that included the following change in the file "src/MonologHandler.php":

protected function write(array $record): void

This syntax is only supported by PHP 7.0 or greater, but you didn't change the version of you required php in composer.json:

"require": { "php": ">=5.4",

So when we did a "composer update" in our project, we downloaded the last version of your library being v0.7.3 breaking our project because we have PHP version 5.6.40

The following is the error we got:

syntax error, unexpected ':', expecting ';' or '{' in /vendor/airbrake/phpbrake/src/MonologHandler.php:31

Class 'Airbrake\Errors\Warning' not found

We started receiving this errors quite frequently, we been using Airbrake for couple of years and this just started. Any idea what this might be?

SoapFault exception: [Client] Class 'Airbrake\Errors\Warning' not found in /var/www/avn.com/shared/vendor/airbrake/phpbrake/src/ErrorHandler.php:36

Airbrake\ErrorHandler reports errors that are suppressed with the `@` operator

Currently, if a PHP notice/warning/error occurs that is suppressed using the @ operator, the Airbrake ErrorHandler reports these errors as if they were not suppressed.

Reproduction steps:

$handler = new Airbrake\ErrorHandler($notifier);
$handler->register();

$foo = [];
echo @$foo[0]; // generates E_NOTICE

Expected result: no error is reported

Actual result: error is reported

Remote Config failing to load, and setting 'remoteConfig' to false does nothing

About 9 days ago, our airbrake/phpbrake v0.8.0 connection with CodebaseHQ stopped reporting errors; it was working previously

On closer inspection, the remote config is failing to load - "Project not found. Disabled config returned." I'm assuming this is an issue with CodebaseHQ's remote config file disappearing, but it appears to have been hosted on airbrake.io previously

Honesty I'm a bit confused about the whole remote config thing and whether it's even necessary, I wasn't even aware it existed before, so I attempted to turn it off with

new Notifier([
        'host' => 'xxx',
        'projectId' => 'yyy',
        'projectKey' => 'zzz',
        'environment' => 'eee',
        'remoteConfig' => false,
 ]);

but the Notifier constructor contains the lines:

if (empty($opt['remoteConfig'])) {
    $opt['remoteConfig'] = true;
}

which seems to ensure $opt['remoteConfig'] is alwaystrue

This feels like a bug as Notifier::remoteErrorConfig() checks this value when deciding whether to use the RemoteConfig::DEFAULT_CONFIG

I'm going to attempt to downgrade to 0.7.5

Notifier not adding the required project key as a query param to the endpoint

According to the airbrake specs, the project key is required as a query param:

POST https://airbrake.io/api/v3/projects/PROJECT_ID/notices?key=PROJECT_KEY

Currently the code is attempting to POST without the key (although it is putting it in an HTTP Authorization header):
https://airbrake.io/api/v3/projects/PROJECT_ID/notices

This results in a 404 return and no exception being tracked in my case.

Unfortunately extending the class isn't as easy as I'd hoped because the $opt array is private but I've come up with the following extension workaround:

namespace common\components;

use Airbrake\Exception;
use Airbrake\Notifier;

/** @class AirbrakeNotifier */
class AirbrakeNotifier extends Notifier
{
    /** @var string */
    private $projectKey;

    /** @inheritdoc */
    public function __construct(array $opt)
    {
        // Throw same exception as parent for empty project key
        if (empty($opt['projectKey'])) {
            throw new Exception('phpbrake: Notifier requires projectId and projectKey');
        }

        // Allow project key access from this class
        $this->projectKey = $opt['projectKey'];

        // Call parent
        parent::__construct($opt);
    }

    /** @inheritdoc */
    protected function buildNoticesURL()
    {
        // Parent Url
        $url = parent::buildNoticesURL();

        // Extract any existing query params
        $query = parse_url($url,PHP_URL_QUERY);
        parse_str($query, $params);

        // Add project key to params
        $params['key'] = $this->projectKey;

        // Rebuild url
        $url = str_replace('?'.$query,'',$url);
        return $url.'?'.http_build_query($params);
    }
}

Test issue

Testing notifications for our support account.

Undefined variable: http_response_header

We're using phpbrake in a Symfony application.

This error occurs only outside of the request scope. This is possible because we have registered a shutdown function which checks for errors and sends them to Airbrake.

In general Symfony's default error handler will handle the errors (and return true thereby removing the error so error_get_last will return false. It seems there is some situation though where the Symfony handler is not able to handle the error. In this case the shutdown function tries to notify Airbrake but it fails with this message

Undefined variable: http_response_header

Monolog 3 support

Monolog 3 has changed the signature of the AbstractProcessingHandler::write method from an array to a record object, leading to type errors and static analysis errors.

If you want to stay backwards-compatible, you could avoid typing write method and accept both arrays or records. Monolog\LogRecord implements the ArrayAccess interface, so the method body can stay the same

Notifier Logs Sensitive Data

Hi I have been using your phpbrake package in my Laravel projects and I noticed lots of sensitive data like keys and passwords turning up in the airbrake logs. Laravel uses the phpdotenv package to handle configuration for the framework, which will set all variables in the .env file into the $_SERVER and $_ENV super globals.

Looking through the phpbrake I can see that the package always logs entire content of $_SERVER, $_REQUEST and $_SESSION.

Is it advisable that users unset any sensitive from these super globals before calling notify() or should the package only be logging a list of safe keys from these super globals?

Does not take into account max post size

For errors that exceed that max allowed size on airbrake, it doesn't truncate the data and silently fails.

This seems to happen when there's a stack of errors that try to get reported at once.

Instead silently failing so that the error never gets discovered, it should truncate the error like in the airbrake/airbrake repo below:

airbrake/airbrake#626

Notifier trying to get /.git/HEAD

Whenever I am having an exception this is connected to a tracking before and after where phpbrake tries to read /.git/HEAD:

20230121-20:53:40-Selection-001

The error is located in vendor/airbrake/phpbrake/src/Notifier.php:505

Why is it trying to go from system root?

My setup is this:

// initialize tracking
$airbrakeId = Env::getString('AIRBRAKE_ID');
$airbrakeKey = Env::getString('AIRBRAKE_KEY');

// configure notifier for Airbrake
$notifier = new Notifier([
    'projectId' => $airbrakeId,
    'projectKey' => $airbrakeKey,
    'appVersion' => Config::getVersion(),
    //'rootDirectory' => Constants::getString('ROOT_DIR'),
    'environment' => Config::getEnvironment(),
]);

// register error handlers
Instance::set($notifier);
$handler = new ErrorHandler($notifier);
$handler->register();

It tries to go for system root with rootDirectory set and not set.

What might cause this behaviour? The actual error/exception is tracked properly.

cURL error 60: SSL certificate problem: unable to get local issuer certificate

Occurred on a local PC running Windows 10.

[Server thread/CRITICAL]: GuzzleHttp\Exception\RequestException: "cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)" (EXCEPTION) in ".../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory" at line 201

Relevant Stack Trace:

[17:07:14] [Server thread/DEBUG]: #0 .../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory(155): GuzzleHttp\Handler\CurlFactory::createRejection(object GuzzleHttp\Handler\EasyHandle, array[41])
[17:07:14] [Server thread/DEBUG]: #1 .../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory(105): GuzzleHttp\Handler\CurlFactory::finishError(object GuzzleHttp\Handler\CurlHandler, object GuzzleHttp\Handler\EasyHandle, object GuzzleHttp\Handler\CurlFactory)
[17:07:14] [Server thread/DEBUG]: #2 .../vendor/guzzlehttp/guzzle/src/Handler/CurlHandler(43): GuzzleHttp\Handler\CurlFactory::finish(object GuzzleHttp\Handler\CurlHandler, object GuzzleHttp\Handler\EasyHandle, object GuzzleHttp\Handler\CurlFactory)
[17:07:14] [Server thread/DEBUG]: #3 .../vendor/guzzlehttp/guzzle/src/Handler/Proxy(28): GuzzleHttp\Handler\CurlHandler->__invoke(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #4 .../vendor/guzzlehttp/guzzle/src/Handler/Proxy(51): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #5 .../vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware(37): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #6 .../vendor/guzzlehttp/guzzle/src/Middleware(29): GuzzleHttp\PrepareBodyMiddleware->__invoke(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #7 .../vendor/guzzlehttp/guzzle/src/RedirectMiddleware(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #8 .../vendor/guzzlehttp/guzzle/src/Middleware(57): GuzzleHttp\RedirectMiddleware->__invoke(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #9 .../vendor/guzzlehttp/guzzle/src/HandlerStack(71): GuzzleHttp\Middleware::GuzzleHttp\{closure}(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #10 .../vendor/guzzlehttp/guzzle/src/Client(361): GuzzleHttp\HandlerStack->__invoke(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #11 .../vendor/guzzlehttp/guzzle/src/Client(113): GuzzleHttp\Client->transfer(object GuzzleHttp\Psr7\Request, array[11])
[17:07:14] [Server thread/DEBUG]: #12 .../vendor/guzzlehttp/guzzle/src/Client(130): GuzzleHttp\Client->sendAsync(object GuzzleHttp\Psr7\Request, array[12])
[17:07:14] [Server thread/DEBUG]: #13 .../vendor/airbrake/phpbrake/src/Notifier(337): GuzzleHttp\Client->send(object GuzzleHttp\Psr7\Request, array[2])
[17:07:14] [Server thread/DEBUG]: #14 .../vendor/airbrake/phpbrake/src/Notifier(308): Airbrake\Notifier->sendRequest(object GuzzleHttp\Psr7\Request)
[17:07:14] [Server thread/DEBUG]: #15 .../vendor/airbrake/phpbrake/src/Notifier(386): Airbrake\Notifier->sendNotice(array[2])
[17:07:14] [Server thread/DEBUG]: #16 .../vendor/airbrake/phpbrake/src/Instance(46): Airbrake\Notifier->notify(object Exception)
[17:07:14] [Server thread/DEBUG]: #17 .../internal/ErrorTracker(68): Airbrake\Instance::notify(object Exception)

The ... has been done as the project directory names are private. Thanks for understanding, all relevant information has been provided.

According to HHVM, this code is semantically invalid.

The compiler hh_client from HHVM tells me that I can't run this code.

/vendor/airbrake/phpbrake/src/MonologHandler.php:10:30,71: Unbound name: Monolog\Handler\AbstractProcessingHandler (an object type) (Naming[2049])
/vendor/airbrake/phpbrake/src/MonologHandler.php:22:72,77: Unbound name: Monolog\Logger (an object type) (Naming[2049])

I tend to agree with hh_client here. MonologHandler::class extends \Monolog\Handler\AbstractProcessingHandler, which I am unable to find.

The default argument for parameter 2 Level on MonologHandler::__construct loads a constant from the Monolog\Logger class/interface. I am unable to find this class/interface.

I was looking into porting the library to HHVM, but I believe this isn't right.
Feel free to correct me if I am wrong.

Support For Exception Chaining

Currently, if a chained exception is passed to Airbrake, only information about the top most exception is registered to airbrake.

For example:

try {
    try {
        //...
    } catch (LowLevelException $e) {
       throw new DomainSpecificException($message, $code, $e);
    }
} catch (Exception $e) {
     $airbrake->notify($e);
}

only the message, code and stack trace of DomainSpecificException gets shown in the airbrake logs, while the information about the LowLevelException is discarded (which is honestly the most useful bit for tracking down the problem).

Is there any way for Airbrake to retain this information within the logs?

[Critical] All app secrets stored in environment variables are passed to airbrake

I'm using phpbrake in my php app deployed on heroku.

As good practice, heroku suggests to store all app secrets in environment variables.

I noticed that phpbrake is sending the entire content of the $_SERVER variable in its report, indeed passing all app secrets.

https://github.com/airbrake/phpbrake/blob/master/src/Notifier.php#L148

Heroku documentation states:

Any config var you set on your Heroku application will be available at runtime using getenv() or in $_ENV/$_SERVER. We will use this mechanism to dynamically read the AWS security keys (key ID and secret key) and the S3 bucket name in our code; all you need to do is set these three bits information.

https://devcenter.heroku.com/articles/s3-upload-php#setting-application-config-vars

I think this is really bad and pretty critical and should be fixed in some way. However I'm not sure you or heroku should deal with this.

Request for a support branch

Hello,

Thank you to the maintainers of this project for a helpful tool!

I have a selfish and embarrassing request - In addition to master, would you consider opening a support branch for improvements to legacy versions of this project?

For the dinosaurs among us who are still on php 5.3 (sigh), we'd like to make an improvement for consideration, to build atop v0.0.7 - the last available version of phpbrake that supports php 5.3.

We are making enhancements to phpbrake 0.0.7 and want to contribute back, in case they changes may benefit others. If you'd be willing to open a "support/0.0.7.x" branch, we can target a PR to that for consideration. If you feel that opening an additional support branch is not worth the overhead, no worries - we'll still rebase and propose our changes atop master so that other people can benefit.

Thanks for considering!

Add StyleCI Support?

StyleCI will check all commits and pull requests for syntax errors.

This is the guide to add StyleCI support:

  1. Sign up at https://styleci.io/

  2. Go to the repositories page https://styleci.io/account#repos

  3. Enable this repository.

  4. Press Show Analysis and then Settings.

  5. Add the following settings:

    enabled:
      - unalign_double_arrow
    
    disabled:
      - psr0
      - align_double_arrow
      - phpdoc_align
  6. Press Save Configuration.

  7. Press Analyze Now.

This has to be done by the owner of the repository.

MonologHandler using its own debug backtrace, losing exception context

When the exception is being written via Monolog, the $record contains context parameter with the whole exception and the stack trace of the exception.

MonologHandler ignores this and uses its own stack trace causing all exceptions having stack trace pointing to Monolog\Logger - https://github.com/airbrake/phpbrake/blob/master/src/MonologHandler.php#L33.

If available, MonologHandler should try to read trace from $record['context']['exception']->getTrace().

Composer error

$ composer require airbrake/phpbrake

Using version ^0.7.3 for airbrake/phpbrake
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

Problem 1
- Installation request for airbrake/phpbrake ^0.7.3 -> satisfiable by airbrake/phpbrake[v0.7.3].
- Conclusion: remove guzzlehttp/guzzle 7.0.1
[calindra]
- Conclusion: don't install guzzlehttp/guzzle 7.0.1
- airbrake/phpbrake v0.7.3 requires guzzlehttp/guzzle ^6.3 -> satisfiable by guzzlehttp/guzzle[6.3.0, 6.3.1, 6.3.2, 6.3.3, 6.4.0, 6.4.1, 6.5.0, 6.5.1, 6.5.2, 6.5.3, 6.5.4, 6.5.5, 6.5.x-dev].
[calindra]
- Can only install one of: guzzlehttp/guzzle[6.3.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.3.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.3.2, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.3.3, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.4.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.4.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.2, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.3, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.4, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.5, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.x-dev, 7.0.1].
- Installation request for guzzlehttp/guzzle (locked at 7.0.1) -> satisfiable by guzzlehttp/guzzle[7.0.1].

Latest versions not in packagist

Hello,

Packagist only has releases of this library up to 0.6.0. We were hoping to take advantage of the nested exception handling offered in 0.6.1, but that is not available in the public package manager. I imagine this is just something that needs to be triggered in packagist to sync the available tags?

Empty notification

I'm trying to debug why I don't get any error messages in my production environment. This is a dump of the notification after running \Airbrake\Instance::notify(new \Exception('TEST'));

vendor/airbrake/phpbrake/src/Notifier.php +193

array(2) {
  ["headers"]=>
  NULL
  ["data"]=>
  bool(false)
}

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.