Giter Site home page Giter Site logo

aligeenius / kimai-rfid-esp Goto Github PK

View Code? Open in Web Editor NEW
15.0 3.0 2.0 1.31 MB

This programm is build for for an ESP8265/ESP8266 to communicate with the open source Kimai timetracking software via the API sending RFIDs to the server for starting/stopping timesheets.

C++ 82.94% C 17.06%
kimai-timetracking rfid kimai-api kimai-plugin kimai-bundle kimai2 esp8266 sonoff

kimai-rfid-esp's People

Contributors

alexlienert avatar aligeenius avatar

Stargazers

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

Watchers

 avatar  avatar  avatar

Forkers

ymarkus laverma

kimai-rfid-esp's Issues

Hardcoded IP

Today I was browsing the code, trying to understand it and stumbled upon:

http.begin(client, "192.168.178.200", port, request, false);

Is that on purpose or a mistake where the config should be used instead?

How to configure Kimai?

Hello,
I tried to get your stuff running and now I'm stuck at the point how to get it to talk with Kimai. Is there a plugin for Kimai I have to install?

Package not building

I am having some issues compiling the project.

I am using an Node MCU ESP8266

Is this an issue with the library setup for Brzo I2C?

My platform.ini is

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[platformio]
default_envs = nodemcu

[env]
platform = espressif8266
framework = arduino
board_build.f_cpu = 80000000L
monitor_speed = 115200
upload_speed = 921600
lib_deps = 
	bblanchon/ArduinoJson
	miguelbalboa/MFRC522
	tzapu/WiFiManager
	thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 [email protected]
	pasko-zh/Brzo I2C@^1.3.3
	arduino-libraries/NTPClient

[env:esp8285]
board = esp8285
lib_deps = 
	bblanchon/ArduinoJson
	miguelbalboa/MFRC522
	tzapu/WiFiManager
	thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 [email protected]
	pasko-zh/Brzo I2C@^1.3.3
	arduino-libraries/NTPClient

[env:nodemcu]
board = nodemcu
lib_deps = 
	bblanchon/ArduinoJson
	miguelbalboa/MFRC522
	tzapu/WiFiManager
	thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 [email protected]
	pasko-zh/Brzo I2C@^1.3.3
	arduino-libraries/NTPClient

[debug]
build_flags = 
	-DDEBUG_ESP_HTTP_CLIENT=1
	-DDEBUG_ESP_PORT=Serial

The terminal gives this output.

Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif8266/nodemcu.html
PLATFORM: Espressif 8266 (4.2.1) > NodeMCU 0.9 (ESP-12 Module)
HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash
PACKAGES: 
 - framework-arduinoespressif8266 @ 3.30102.0 (3.1.2) 
 - tool-esptool @ 1.413.0 (4.13) 
 - tool-esptoolpy @ 1.30000.201119 (3.0.0) 
 - toolchain-xtensa @ 2.100300.220621 (10.3.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 43 compatible libraries
Scanning dependencies...
Dependency Graph
|-- ArduinoJson @ 7.1.0
|-- MFRC522 @ 1.4.11
|-- WiFiManager @ 0.16.0
|-- ESP8266 and ESP32 OLED driver for SSD1306 displays @ 4.3.0
|-- Brzo I2C @ 1.3.3
|-- NTPClient @ 3.2.1
|-- DNSServer @ 1.1.1
|-- ESP8266HTTPClient @ 1.2
|-- ESP8266WebServer @ 1.0
|-- ESP8266WiFi @ 1.0
|-- SPI @ 1.0
|-- Ticker @ 1.0
|-- Wire @ 1.0
Building in release mode
Compiling .pio/build/nodemcu/src/main.cpp.o
Compiling .pio/build/nodemcu/lib4a2/Brzo I2C/brzo_i2c.c.o
Compiling .pio/build/nodemcu/FrameworkArduino/WMath.cpp.o
Compiling .pio/build/nodemcu/FrameworkArduino/WString.cpp.o
.pio/libdeps/nodemcu/Brzo I2C/src/brzo_i2c.c: In function 'brzo_i2c_write':
.pio/libdeps/nodemcu/Brzo I2C/src/brzo_i2c.c:72:2: error: cannot find a register in class 'RL_REGS' while reloading 'asm'
   72 |  asm volatile (
      |  ^~~
.pio/libdeps/nodemcu/Brzo I2C/src/brzo_i2c.c:72:2: error: 'asm' operand has impossible constraints
*** [.pio/build/nodemcu/lib4a2/Brzo I2C/brzo_i2c.c.o] Error 1
Compiling .pio/build/nodemcu/FrameworkArduino/abi.cpp.o
In file included from src/main.cpp:1:
src/main.h:67:40: error: 'MILLIS' was not declared in this scope
   67 | Ticker wifiTicker(sigRefresh, 5000, 0, MILLIS);
      |                                        ^~~~~~
src/main.h:110:21: error: no matching function for call to 'ArduinoJson::V710PB22::JsonDocument::JsonDocument(int)'
  110 | JsonDocument doc(512);
      |                     ^
In file included from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.hpp:33,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.h:9,
                 from src/main.h:2,
                 from src/main.cpp:1:
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:40:3: note: candidate: 'template<class T> ArduinoJson::V710PB22::JsonDocument::JsonDocument(const T&, ArduinoJson::V710PB22::Allocator*, ArduinoJson::V710PB22::detail::enable_if_t<((((ArduinoJson::V710PB22::detail::IsVariant<T>::value || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonArray>::value) || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonArrayConst>::value) || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonObject>::value) || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonObjectConst>::value)>*)'
   40 |   JsonDocument(
      |   ^~~~~~~~~~~~
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:40:3: note:   template argument deduction/substitution failed:
In file included from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Polyfills/type_traits.hpp:8,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Polyfills/limits.hpp:7,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Memory/StringNode.hpp:11,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Memory/StringPool.hpp:8,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Memory/ResourceManager.hpp:8,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Variant/JsonVariantConst.hpp:10,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Variant/VariantRefBase.hpp:9,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Array/ElementProxy.hpp:7,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Array/JsonArray.hpp:7,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.hpp:29,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.h:9,
                 from src/main.h:2,
                 from src/main.cpp:1:
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/enable_if.hpp: In substitution of 'template<bool Condition, class T> using enable_if_t = typename ArduinoJson::V710PB22::detail::enable_if::type [with bool Condition = false; T = void]':
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:40:3:   required by substitution of 'template<class T> ArduinoJson::V710PB22::JsonDocument::JsonDocument(const T&, ArduinoJson::V710PB22::Allocator*, ArduinoJson::V710PB22::detail::enable_if_t<((((ArduinoJson::V710PB22::detail::IsVariant<T>::value || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonArray>::value) || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonArrayConst>::value) || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonObject>::value) || ArduinoJson::V710PB22::detail::is_same<T, ArduinoJson::V710PB22::JsonObjectConst>::value)>*) [with T = int]'
src/main.h:110:21:   required from here
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Polyfills/type_traits/enable_if.hpp:21:7: error: no type named 'type' in 'struct ArduinoJson::V710PB22::detail::enable_if<false, void>'
   21 | using enable_if_t = typename enable_if<Condition, T>::type;
      |       ^~~~~~~~~~~
In file included from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.hpp:33,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.h:9,
                 from src/main.h:2,
                 from src/main.cpp:1:
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:33:3: note: candidate: 'ArduinoJson::V710PB22::JsonDocument::JsonDocument(ArduinoJson::V710PB22::JsonDocument&&)'
   33 |   JsonDocument(JsonDocument&& src)
      |   ^~~~~~~~~~~~
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:33:31: note:   no known conversion for argument 1 from 'int' to 'ArduinoJson::V710PB22::JsonDocument&&'
   33 |   JsonDocument(JsonDocument&& src)
      |                ~~~~~~~~~~~~~~~^~~
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:28:3: note: candidate: 'ArduinoJson::V710PB22::JsonDocument::JsonDocument(const ArduinoJson::V710PB22::JsonDocument&)'
   28 |   JsonDocument(const JsonDocument& src) : JsonDocument(src.allocator()) {
      |   ^~~~~~~~~~~~
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:28:36: note:   no known conversion for argument 1 from 'int' to 'const ArduinoJson::V710PB22::JsonDocument&'
   28 |   JsonDocument(const JsonDocument& src) : JsonDocument(src.allocator()) {
      |                ~~~~~~~~~~~~~~~~~~~~^~~
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:24:12: note: candidate: 'ArduinoJson::V710PB22::JsonDocument::JsonDocument(ArduinoJson::V710PB22::Allocator*)' (near match)
   24 |   explicit JsonDocument(Allocator* alloc = detail::DefaultAllocator::instance())
      |            ^~~~~~~~~~~~
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/Document/JsonDocument.hpp:24:12: note:   conversion of argument 1 would be ill-formed:
In file included from src/main.cpp:1:
src/main.h:110:18: error: invalid conversion from 'int' to 'ArduinoJson::V710PB22::Allocator*' [-fpermissive]
  110 | JsonDocument doc(512);
      |                  ^~~
      |                  |
      |                  int
src/main.h:114:29: error: 'MILLIS' was not declared in this scope
  114 | Ticker ticker(tick, 600, 0, MILLIS);
      |                             ^~~~~~
src/main.cpp: In function 'void setup()':
src/main.cpp:10:10: error: 'class Ticker' has no member named 'start'
   10 |   ticker.start();
      |          ^~~~~
src/main.cpp: In function 'void loop()':
src/main.cpp:43:10: error: 'class Ticker' has no member named 'update'
   43 |   ticker.update();
      |          ^~~~~~
src/main.cpp:44:14: error: 'class Ticker' has no member named 'update'
   44 |   wifiTicker.update();
      |              ^~~~~~
src/main.cpp:72:14: error: 'class Ticker' has no member named 'state'
   72 |   if (ticker.state() == RUNNING)
      |              ^~~~~
src/main.cpp:72:25: error: 'RUNNING' was not declared in this scope
   72 |   if (ticker.state() == RUNNING)
      |                         ^~~~~~~
src/main.cpp:74:12: error: 'class Ticker' has no member named 'stop'
   74 |     ticker.stop();
      |            ^~~~
src/main.cpp:171:12: error: 'class Ticker' has no member named 'interval'
  171 |     ticker.interval(800);
      |            ^~~~~~~~
src/main.cpp:183:12: error: 'class Ticker' has no member named 'interval'
  183 |     ticker.interval(500);
      |            ^~~~~~~~
src/main.cpp:196:12: error: 'class Ticker' has no member named 'interval'
  196 |     ticker.interval(100);
      |            ^~~~~~~~
src/main.cpp: In function 'void wifiManInit()':
src/main.cpp:211:7: warning: 'SPIFFS' is deprecated: SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems. [-Wdeprecated-declarations]
  211 |   if (SPIFFS.begin())
      |       ^~~~~~
In file included from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/CertStoreBearSSL.h:26,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h:30,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecure.h:23,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServerSecure.h:20,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFi.h:41,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src/ESP8266WebServer.h:30,
                 from src/main.h:5,
                 from src/main.cpp:1:
/Users/reedact/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FS.h:286:15: note: declared here
  286 | extern fs::FS SPIFFS __attribute__((deprecated("SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems.")));
      |               ^~~~~~
src/main.cpp:213:9: warning: 'SPIFFS' is deprecated: SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems. [-Wdeprecated-declarations]
  213 |     if (SPIFFS.exists("/config.json"))
      |         ^~~~~~
In file included from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/CertStoreBearSSL.h:26,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h:30,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecure.h:23,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServerSecure.h:20,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFi.h:41,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src/ESP8266WebServer.h:30,
                 from src/main.h:5,
                 from src/main.cpp:1:
/Users/reedact/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FS.h:286:15: note: declared here
  286 | extern fs::FS SPIFFS __attribute__((deprecated("SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems.")));
      |               ^~~~~~
src/main.cpp:220:25: warning: 'SPIFFS' is deprecated: SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems. [-Wdeprecated-declarations]
  220 |       File configFile = SPIFFS.open("/config.json", "r");
      |                         ^~~~~~
In file included from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/CertStoreBearSSL.h:26,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h:30,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecure.h:23,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServerSecure.h:20,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFi.h:41,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src/ESP8266WebServer.h:30,
                 from src/main.h:5,
                 from src/main.cpp:1:
/Users/reedact/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FS.h:286:15: note: declared here
  286 | extern fs::FS SPIFFS __attribute__((deprecated("SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems.")));
      |               ^~~~~~
src/main.cpp:227:32: warning: 'DynamicJsonDocument' is deprecated: use JsonDocument instead [-Wdeprecated-declarations]
  227 |         DynamicJsonDocument doc(256);
      |                                ^
In file included from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.hpp:56,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.h:9,
                 from src/main.h:2,
                 from src/main.cpp:1:
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/compatibility.hpp:125:58: note: declared here
  125 | class ARDUINOJSON_DEPRECATED("use JsonDocument instead") DynamicJsonDocument
      |                                                          ^~~~~~~~~~~~~~~~~~~
src/main.cpp:289:10: error: 'class Ticker' has no member named 'stop'
  289 |   ticker.stop();
      |          ^~~~
src/main.cpp:301:28: warning: 'DynamicJsonDocument' is deprecated: use JsonDocument instead [-Wdeprecated-declarations]
  301 |     DynamicJsonDocument doc(256);
      |                            ^
In file included from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.hpp:56,
                 from .pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson.h:9,
                 from src/main.h:2,
                 from src/main.cpp:1:
.pio/libdeps/nodemcu/ArduinoJson/src/ArduinoJson/compatibility.hpp:125:58: note: declared here
  125 | class ARDUINOJSON_DEPRECATED("use JsonDocument instead") DynamicJsonDocument
      |                                                          ^~~~~~~~~~~~~~~~~~~
src/main.cpp:307:23: warning: 'SPIFFS' is deprecated: SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems. [-Wdeprecated-declarations]
  307 |     File configFile = SPIFFS.open("/config.json", "w");
      |                       ^~~~~~
In file included from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/CertStoreBearSSL.h:26,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h:30,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiClientSecure.h:23,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/WiFiServerSecure.h:20,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src/ESP8266WiFi.h:41,
                 from /Users/reedact/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src/ESP8266WebServer.h:30,
                 from src/main.h:5,
                 from src/main.cpp:1:
/Users/reedact/.platformio/packages/framework-arduinoespressif8266/cores/esp8266/FS.h:286:15: note: declared here
  286 | extern fs::FS SPIFFS __attribute__((deprecated("SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems.")));
      |               ^~~~~~
src/main.cpp: In function 'void uiInit()':
src/main.cpp:418:14: error: 'class Ticker' has no member named 'start'
  418 |   wifiTicker.start();
      |              ^~~~~
*** [.pio/build/nodemcu/src/main.cpp.o] Error 1
========================================================================================= [FAILED] Took 2.42 seconds =========================================================================================

Environment    Status    Duration
-------------  --------  ------------
nodemcu        FAILED    00:00:02.424
==================================================================================== 1 failed, 0 succeeded in 00:00:02.424 ====================================================================================

 *  The terminal process "platformio 'run'" terminated with exit code: 1. 
 *  Terminal will be reused by tasks, press any key to close it. 

Missing video file

Hello!

I recently stumbled upon your project repository. Nice work!

The preview video is not found via your cloud link anymore.

Maybe you want to update/fix that.

Thanks!

kimai2 api bridge

Hi Ali!
A friend is trying to implement your great sonoff stuff! But I guess he needs the api, so what is the cost of the kimai2 bridge ?

All the best
.A.

Tagging the repo

Could you tag the repository (with the topics), then its easier to find. Like this:

Bildschirmfoto 2020-04-15 um 23 43 12

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.