Giter Club home page Giter Club logo

grocy's Introduction


Logo

ERP beyond your fridge

Grocy is a web-based self-hosted groceries & household management solution for your home

This is a hobby project by @berrnd


Give it a try

Features

See the website. → https://grocy.info

Questions / Help / Bug Reports / Feature Requests

Please don't send me private messages or call me regarding anything Grocy. I check the issue tracker and the subreddit pretty much daily, but don't provide any support beyond that.

Community contributions

See the website for a list of community contributed Add-ons / Tools. → https://grocy.info/addons

How to install

Checkout Grocy Desktop, if you want to run Grocy without having to manage a webserver just like a normal (Windows) desktop application.

Directly download the latest release - the installation is nothing more than just clicking 2 times "next".

Grocy is technically a pretty simple PHP application, so the basic notes to get it running are:

  • Unpack the latest release
  • Copy config-dist.php to data/config.php + edit to your needs
  • Ensure that the data directory is writable
  • The webserver root should point to the public directory
  • Include try_files $uri /index.php$is_args$query_string; in your location block if you use nginx
    • Or disable URL rewriting (see the option DISABLE_URL_REWRITING in data/config.php)
  • → Default login is user admin with password admin, please change the password immediately (user menu at the top right corner)

Alternatively clone this repository (the release branch always references the latest released version) and install Composer and Yarn dependencies manually.

See the website for more installation guides and troubleshooting help. → https://grocy.info/links

Platform support

  • PHP 8.2 or 8.3 (with SQLite 3.34.0+)
    • Required PHP extensions: fileinfo, pdo_sqlite, gd, ctype, intl, zlib, mbstring
    • Recommendation: Benchmark tests showed that e.g. unit conversion handling is up to 5 times faster when using a more recent (3.39.4+) SQLite version.
  • Recent Firefox, Chrome or Edge

How to run using Docker

See grocy/grocy-docker or linuxserver/docker-grocy for instructions.

How to update

  • Overwrite everything with the latest release while keeping the data directory
  • Check config-dist.php for new configuration options and add them to your data/config.php where appropriate (the default values from config-dist.php will be used for not in data/config.php defined settings)
  • Empty the data/viewcache directory
  • Visit the main route once to apply database migrations (see below)

If you run Grocy on Linux, there is also update.sh (remember to make the script executable (chmod +x update.sh) and ensure that you have unzip installed) which does exactly this and additionally creates a backup (.tgz archive) of the current installation in data/backups (backups older than 60 days will be deleted during the update).

Localization

Grocy is fully localizable - the default language is English (integrated into code), a German localization is always maintained by me.

You can easily help translating Grocy on Transifex if your language is incomplete or not available yet.

The default language can be set in data/config.php, e. g. Setting('DEFAULT_LOCALE', 'it'); and there is also a user setting (see the user settings page) to set a different language per user.

The pre-release demo is available for any translation which is at least 70 % complete and will pull the translations from Transifex 10 minutes past every hour, so you can have a kind of instant preview of your contributed translations. Thank you!

Also any translation which once reached a completion level of 70 % (strings resource) will be included in releases.

RTL languages are unfortunately not yet supported.

Motivation

A household needs to be managed. Before Grocy I did this (for almost 10 years) using my first self written software (a C# Windows forms application) and with a bunch of Excel sheets. The software was a pain to use at the end and Excel is Excel. So I searched for and tried different things for a (very) long time, nothing 100 % fitted, so this is my aim for a "complete household management"-thing. ERP your fridge!

Things worth to know

REST API

See the integrated Swagger UI instance on /api.

The web frontend uses exactly this API for pretty much everything. So everything you can do there is also possible via the API.

Barcode readers & camera scanning

Some fields (with a barcode icon above) also allow to select a value by scanning a barcode. It works best when your barcode reader prefixes every barcode with a letter which is normally not part of a item name (I use a $) and sends a TAB after a scan.

Additionally it's also possible to use your device camera to scan a barcode by using the camera button on the right side of the corresponding field (powered by Quagga2, totally offline / client-side camera stream processing, please note due to browser security restrictions, this only works when serving Grocy via a secure connection (https://)). Quick video demo: https://www.youtube.com/watch?v=Y5YH6IJFnfc

My personal recommendation: Use a USB barcode laser scanner. They are cheap and work 1000 % better, faster, under any lighting condition and from any angle.

Input shorthands for date fields

For (productivity) reasons all date (and time) input (and display) fields use the ISO-8601 format regardless of localization. The following shorthands are available:

  • MMDD gets expanded to the given day on the current year, if > today, or to the given day next year, if < today, in proper notation
    • Example: 0517 will be converted to 2024-05-17
  • YYYYMMDD gets expanded to the proper ISO-8601 notation
    • Example: 20240417 will be converted to 2024-04-17
  • YYYYMMe or YYYYMM+ gets expanded to the end of the given month in the given year in proper notation
    • Example: 202407e will be converted to 2024-07-31
  • [+/-]n[d/m/y] gets expanded to a date relative to today, while adding (+) or subtracting (-) the number of days/months/years, in proper notation
    • Example: +1m will be converted to the same day next month
  • x gets expanded to 2999-12-31 (which is an alias for "never overdue")
  • Down/up arrow keys will increase/decrease the date by 1 day
  • Right/left arrow keys will increase/decrease the date by 1 week
  • Shift + down/up arrow keys will increase/decrease the date by 1 month
  • Shift + right/left arrow keys will increase/decrease the date by 1 year

Keyboard shorthands for buttons

Wherever a button contains a bold highlighted letter, this is a shortcut key. Example: Button "P Add as new product" can be "pressed" by using the P key on your keyboard.

Barcode lookup via external services

Products can be directly added to the database via looking them up against external services by a barcode.

This can be done in-place using the product picker workflow "External barcode lookup (via plugin)" (the workflow dialog is displayed when entering something unknown in any product input field).

There is no plugin included for any service, see the reference implementation in data/plugins/DemoBarcodeLookupPlugin.php.

Database migrations

Database schema migration is automatically done when visiting the root (/) route (click on the logo in the left upper edge).

Please note: Database migrations are supposed to work between releases, not between every commit. If you want to run the current master branch (which is the development version), you need to handle that (and more) yourself.

Disable certain features

If you don't use certain feature sets of Grocy (for example if you don't need "Chores"), there are feature flags per major feature set to hide/disable the related UI elements (see config-dist.php).

Adding your own CSS or JS without to have to modify the application itself

  • When the file data/custom_js.html exists, the contents of the file will be added just before </body> (end of body) on every page
  • When the file data/custom_css.html exists, the contents of the file will be added just before </head> (end of head) on every page

Demo mode

When the MODE setting is set to dev, demo or prerelease, the application will work in a demo mode which means authentication is disabled and some demo data will be generated during the database schema migration (pass the query parameter nodemodata, e.g. https://grocy.example.com/?nodemodata to skip that).

Embedded mode

When the file embedded.txt exists, it must contain a valid and writable path which will be used as the data directory instead of data and authentication will be disabled (used in Grocy Desktop).

In embedded mode, settings can be overridden by text files in data/settingoverrides, the file name must be <SettingName>.txt (e. g. BASE_URL.txt) and the content must be the setting value (normally one single line).

Contributing / Say Thanks

Any help is welcome, feel free to contribute anything which comes to your mind or see https://grocy.info/#say-thanks if you just want to say thanks.

Roadmap

There is none, this is a hobby project. The progress of a specific bug/enhancement is always tracked in the corresponding issue, at least by commit comment references.

Milestones are used to indicate in which version the corresponding request was done (vNEXT means it's currently planned to do that for the next release).

Screenshots

Stock overview

Stock overview

Shopping List

Shopping List

Meal Plan

Meal Plan

Chores overview

Chores overview

License

The MIT License (MIT)

grocy's People

Contributors

akoshpinter avatar andreheuer avatar ape avatar berrnd avatar blizzwave avatar d-rickyy-b avatar dependabot[bot] avatar edenhaus avatar esclear avatar fgrsnau avatar fipwmaqzufheoxq92ebc avatar forceu avatar grahamc avatar jayaddison avatar jtommi avatar kriddles avatar ktibow avatar lowlee avatar lwis avatar mik- avatar mrkriskrisu avatar raupie avatar shadow7412 avatar tallyrald avatar talmai avatar thedodger avatar tjhowse avatar torqu3wr3nch avatar tsia avatar zsarnett 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  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

grocy's Issues

Quantity unit purchase Red

image

For some reason Quantity unit purchase and Quantity unit stock are red and im unable to change it at all.

Tooltips stay when using touch input

References also #66

Maybe use native tooltips again (they are not bad, Bootstrap/Popper.js tooltips are just nicer) or just disable them on touch input devices (they can also not or only hardly be triggered without being able to hover the element)...

Login and Logout issue

I think there is something wrong with the login session cookies. I tested several browser.
On Firefox 61.0 i can login, but after i always on the login page again. I can as an example, go to the purchase page, but when i go to the stockoverview page i see the login page again. Some pages are available and some show the login page.

On my mobile device i can login with Brave, but i can't logout. anymore.

The cookies and cache are deleted several times!

Creating a recipe issue

Its not possible to add ingredients without losing data entered in preparations field.

You have to first write the recipe preparation and click save. Then go back in and edit the recipe to add ingredients.

Bug: Prompt to add known items in purchase page

Please have a look at gif "video" underneath.

I manually type in "egg", then grocy suggests "Eggs". I click that, but it still uses what I typed in, "egg"

Funny thing, if you only type in "e" and then click on "Eggs" it works.

grocy_issue

Issue: Recipes can only use quantity units for amount needed

When adding a new recipe to grocy you are only allowed to use quantity units.
So for example, making a cake:
Ingredients required is 250 grams of flour. But the quantity unit might be a pack.

I'm not really sure how we would accomplish this.
Maybe let grocy just see if you have the products in stock and just ignore quantity units?

Ideas/Needs for chores analysis

What do we want to have for chores analysis:

  • An overview page with

    • Most often done chores
    • Percentage of who did the most chores
  • A detail page per chore with

    • A list of the executions
    • How often the chore was done on average per week/month/year

On both pages the period (date from - date to) should be selectable.

Responsive design - navbar overlapping content

Since (at least) v1.8.0 the navbar is overlapping the content at certain resolutions.
I uploaded a video/gif of it here.

You can test it for yourself on your demo page, while using the dev tools of your browser.


Not sure if you'd prefer another issue for that, but the big no-real-buttons on the main site are too big for mobile screens, so that the page becomes horizontally scrollable and the hamburger menu button is out of view when opening the page

Idea: Products at which location

At first thank you for that management programm. Great work. 👍

What i would wish is a location overview. To see which products are at which location.

'Slim Application Error': misuse of aliased aggregate best_before_date

While attempting to install grocy 1.16.0 on a fresh install on CentOS 7.5 with PHP versions 7.2 or 7.3, an error is thrown with the title 'Slim Application Error'.

Expected Result

Grocy webapp shows up.

Actual Result

The following error message is thrown while navigating to the grocy web app

Slim Application Error

The application could not run because of the following error:
Details
Type: PDOException
Code: HY000
Message: SQLSTATE[HY000]: General error: 1 misuse of aliased aggregate best_before_date
File: /var/www/grocy/services/DatabaseService.php
Line: 45
Trace

#0 /var/www/grocy/services/DatabaseService.php(45): PDO->exec('CREATE VIEW sto...')
#1 /var/www/grocy/services/DatabaseMigrationService.php(30): Grocy\Services\DatabaseService->ExecuteDbStatement('CREATE VIEW sto...')
#2 /var/www/grocy/services/DatabaseMigrationService.php(21): Grocy\Services\DatabaseMigrationService->ExecuteMigrationWhenNeeded(8, 'CREATE VIEW sto...')
#3 /var/www/grocy/controllers/LoginController.php(60): Grocy\Services\DatabaseMigrationService->MigrateDatabase()
#4 [internal function]: Grocy\Controllers\LoginController->Root(Object(Slim\Http\Request), Object(Slim\Http\Response), Array)
#5 /var/www/grocy/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php(41): call_user_func(Array, Object(Slim\Http\Request), Object(Slim\Http\Response), Array)
#6 /var/www/grocy/vendor/slim/slim/Slim/Route.php(335): Slim\Handlers\Strategies\RequestResponse->__invoke(Array, Object(Slim\Http\Request), Object(Slim\Http\Response), Array)
#7 /var/www/grocy/middleware/SessionAuthMiddleware.php(25): Slim\Route->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#8 [internal function]: Grocy\Middleware\SessionAuthMiddleware->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\Route))
#9 /var/www/grocy/vendor/slim/slim/Slim/DeferredCallable.php(43): call_user_func_array(Object(Grocy\Middleware\SessionAuthMiddleware), Array)
#10 [internal function]: Slim\DeferredCallable->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\Route))
#11 /var/www/grocy/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func(Object(Slim\DeferredCallable), Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\Route))
#12 /var/www/grocy/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\Route->Slim\{closure}(Object(Slim\Http\Request), Object(Slim\Http\Response))
#13 /var/www/grocy/vendor/slim/slim/Slim/Route.php(313): Slim\Route->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#14 /var/www/grocy/vendor/slim/slim/Slim/App.php(513): Slim\Route->run(Object(Slim\Http\Request), Object(Slim\Http\Response))
#15 /var/www/grocy/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\App->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#16 /var/www/grocy/vendor/slim/slim/Slim/App.php(406): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#17 /var/www/grocy/vendor/slim/slim/Slim/App.php(314): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))
#18 /var/www/grocy/app.php(54): Slim\App->run()
#19 /var/www/grocy/public/index.php(3): require_once('/var/www/grocy/...')
#20 {main}

Steps to reproduce the issue

Fresh install of CentOS 7.5
Install/enable Remi Repos for PHP 7.2 or 7.3
Install php-pdo (with respect to above versions)
Install grocy to /var/www/grocy
Navigate to webapp

Information on your system

  • grocy 1.16.0
  • CentOS Linux release 7.5.1804 (Core)
  • PHP 7.2 or PHP 7.3 from REMI repos
  • Apache 2.4
  • SELinux set to permissive
  • Data directory owned by Apache user with read/write permissions

Feature Request: Relative path for reverse proxy setup

I have my Grocy now on ubuntu18.04/nginx running on http/80 default-vhost.

It's locally available on http://grocy.mydomain.lan or http://192.168.1.105 or http://sub.mydomain.local and it works.

I do my SSL Termination with HAproxy on https://grocy.mydomain.tld. LETS Certificate with an ALT is already created and working. Grocy is shown.

But now it looks broken. All links are available like "http://grocy.mydomain.tld/node_modules/bootstrap/dist/css/bootstrap.min.css?v=1.18.1" rel="stylesheet">
Blocked loading mixed active content <-- or something like this.

Is it possible to have relative paths to use both, http for internal use and https for external usage?

The ampache project is having a similar problem with absolute/relative paths. ampache/ampache#181

I'm aware i could use a self-signed or any snakeoil certificate to run my local grocy also behind https/443:grocy.mydomain.lan , so the reverse proxy would just show and serve https://grocy.mydomin.tld and my browser wouldn't find a mixed content problem.

If it's possible to have relative paths, or to select "http/https" in absolute paths would be a nice option and feature.

Feature Request: Isle Field

I'm not sure why this isn't a thing with any grocery apps, but I'd love to see an "isle" field attached to products. I'd think most people shop at the same stores the majority of the time.

If adding the isle of items meant you could then sort by isle number as a column you could make shopping trips much more efficient.

New setup shows a blank page

I have tried using both docker with a lamp stack or my regular hosted webhost and both times i get a blank page when trying to connect to public/index.php

Missing htaccess?

Shouldn't there be a htaccess file?

The URL's are SEO friendly, but there's not htaccess to rewrite them

Issue: Search keyword being retained

If you search for something on the stock overview page it will retain the search keyword even if you change to another page. When you return to the stock overview page the search box will be blank, but its still showing the result of what you searched for.
To get it to remove the results you have to search for something new and then remove it (backspace).

The retain feature is actually nice, but would be nice if it would remember the keyword even if changing pages.
Maybe also a "Clear Search" button?

grocy_issue

Feature Request: Auto refresh (db watchdog)

Is it possible to have some kind of auto refresh if the database changes (watchdog?) ?

I have a tablet in the kitchen that shows grocy 24/7. But sometimes I do updates to grocy on my laptop.
I have to manually refresh the tablet to see changes.

Minor UI issue

When managing master data the scrollbar overlaps sligtly.

capture

Issue: GUI in shopping list needs a colored explanation.

In the shopping list when you click the "Add products that are below defined min. stock amount"
It adds the products that are below minimum stock (duh..). It also sets a color for these items.
But its confusing to a new user if he goes into the shopping list and see's items that are colored.
Just need a simple colored bar that says something like "products below min stock"

Ideas/Needs for stock analysis

What do we want to have for stock analysis:

  • An overview page with

    • Most bought/used products
    • The value of the current stock (based on tracked prices)
    • Percentage of spoiled products
  • A detail page per product with

    • A list of the last bookings
    • How often the product was bought/used on average per week/month/year

On both pages the period (date from - date to) should be selectable.

Date picker 1.13.1

There is an issue with the date picker in 1.13.1
In the "Inventory" and "Purchase" the date picker is not working. The Icon is also not aligned correctly.

Not able to get version 1.9.2 running

Hey there,

when I try to run the version 1.9.2 of grocy, it returns a 500 - Internal Server Error, because of an error in one of the dependencies (cors-middleware).

This is the error I get:

Fatal error: 
Uncaught TypeError: Return value of Tuupola\Middleware\CorsMiddleware::origin() must be an instance of Tuupola\Middleware\void, none returned in /var/www/html/vendor/tuupola/cors-middleware/src/CorsMiddleware.php:165 

Stack trace: 
#0 [internal function]: Tuupola\Middleware\CorsMiddleware->origin(Array) 
#1 /var/www/html/vendor/tuupola/cors-middleware/src/CorsMiddleware.php(119): call_user_func(Array, Array) 
#2 /var/www/html/vendor/tuupola/cors-middleware/src/CorsMiddleware.php(51): Tuupola\Middleware\CorsMiddleware->hydrate(Array) 
#3 /var/www/html/routes.php(88): Tuupola\Middleware\CorsMiddleware->__construct(Array) 
#4 /var/www/html/app.php(42): require_once('/var/www/html/r...') 
#5 /var/www/html/public/index.php(3): require_once('/var/www/html/a...') 
#6 {main} thrown in /var/www/html/vendor/tuupola/cors-middleware/src/CorsMiddleware.php on line 165

My php version is:

root@debian-vm:~# php -v
PHP 7.0.28-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.28-1~dotdeb+8.1, Copyright (c) 1999-2017, by Zend Technologies

I also tried with php 7.1.17 without success.

If you want to try on your own - I created a little installation script to automate the process. Thanks in advance for the help.

Feature Request: Stock with MHD/Shelf Life/Best Before Date for FIFO

For example: I have posted goods receipt (purchased) 2kg of Flour with BestBeforeDate of 01.06.2019 and also 4 kg of Flour with BestBeforeDate of 01.06.2022. So i can rotate them with FIFO and use the oldest one. (assumed the first one is the piece with the lowest remaining shelf life)

So i have now 6 kg of Flour. Both BestBefore Date are now mixed together and the information is lost. Which one to pick for FIFO is now hard.

https://de.wikipedia.org/wiki/Quant_(Wirtschaft) <-- If a stock is having the same characteristics, it should merge. If not it should be a second stock item with a different BestBeforeDate of the same product.

At the moment i rotate my stock, for examples dried lentils and atm with grocy i'd never know if 99% or just 1% of the stock will be expired tomorrow.

Feature Request: Bigger amount buttons

I have a tablet in my kitchen that shows Grocy 24/7. But I find it difficult to set amount with those tiny arrow buttons. (I dont want to show the on-screen keyboard) What do you think about making them a little bigger for a more touch friendly interface?

Feature Request: No expire date

Is is possible to get a "no expiry checkbox" because there is certain things that does not have expiry dates?
Toilet paper, soap, q-tips etc.
I know that you can press x in the date selection box and it will give you year 2999.
This "trick" is mentioned in the readme.

Just seems a little unpolished in my opinion.

Document API

Is it possible to create a simple API to add product to the fridge?
My idea is a simple Android App with a barcode scanner, which add items to the fridge.

[Suggestion] Allow adding products without best before date

I would like to use grocy to also track things in my household that do not have best before dates (toilet paper rolls for example) but grocy forces me to put in a best before date.
You can of course use an absurd date like 9999-12-31 but I'd love to just put in "none" (or something similar) for convenience.

//Nevermind, I didnt read the readme carefully enough. Sorry about that

404 Error

When I try to access /grocy/public on my Ampps web server, it immediately redirects me to /stockoverview and a not found 404 error. I'm running on Ampps (apache and php 7.1). I followed the instructions with the config.php file. What am I missing?

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.