Giter Site home page Giter Site logo

cdevroe / unmark Goto Github PK

View Code? Open in Web Editor NEW
1.6K 59.0 196.0 7.22 MB

An open source to do app for bookmarks.

Home Page: https://unmark.it

License: Other

JavaScript 4.39% PHP 88.54% HTML 0.68% CSS 0.54% Dockerfile 0.01% Hack 1.01% SCSS 4.84%
php todo bookmarks-manager

unmark's Introduction

Unmark

The open source to-do application for bookmarks.

NOTICE June 15, 2020: The new default branch is named "trunk". โœŠ

We offer this source code for Unmark completely free. We do so in hopes that Unmark will live on for many years even if we stop maintaining it. You can also use it for free (with a paid upgrade) at Unmark.it

To support its further development please consider subscribing to Unmark.it, donating via Paypal. Or, you can contribute to the code.

Installation

Running Unmark is only recommended for intermediate users. This doesn't mean if you're a beginner we don't want you to try. Hack away! Just that you should expect some speedbumps (though, we're eliminating them all the time). If you need assistance beyond what is provided please create an issue on Github. Before creating a new issue we recommend search through the issues on GitHub to see how others have solved their problems.

Technical requirements

It is now recommended to use Docker / Docker Compose to install and run Unmark locally both for personal use and for development. Please see the installation instructions section below.

However, if you're going to run your own server:

  • Apache 2.x
  • PHP 5.6 or greater
  • mySQL 5.7 or greater

Common Issues

Some common issues have been reported. Some are trying to load Unmark on a sub-directory, using different versions of PHP or Apache, or using completely different databases. While it may be possible to do so, expect issues.

Other common things that come up:

  • PHP mod_rewrite isn't enabled
  • PHP mysqli extension not installed

Installation Instructions

With Docker / Docker Compose

We've included the appropriate Docker Compose, Dockerfile, and PHP.ini files to run Unmark locally on Windows or Mac with almost zero set up. We've been using Docker on both Windows and Mac for the last two releases and we like it. However, this is still in its early phases so please report any issues that you find.

Warning: Running docker-compose down -v will erase Docker volumes including your local database. If you do not include the -v argument your database will remain intact. If you need to run -v log into Unmark and export your marks first.

How to start Unmark via Docker for personal use

  • Download and install Docker
  • Download and install Docker Compose
  • Download the latest release
  • Unpack the archive into your desired location
  • Rename the file /application/config/database-sample.php to /application/config/database.php
  • In Terminal or Powershell - Run docker-compose up -d (to shut Unmark down run docker-compose down)
  • Navigate to http://localhost and click "Install"
  • If successful, you'll be asked to create an account

From start Unmark via Docker for development

  • Download and install Docker
  • Download and install Docker Compose
  • Run git clone https://github.com/cdevroe/unmark.git (Or, if you've forked the repo, use your URL)
  • Copy the file /application/config/database-sample.php to /application/config/database.php (leave database-sample.php in place)
  • Rename the file /application/config/database-sample.php to /application/config/database.php
  • Run docker-compose up -d (to shut Unmark down run docker-compose down)
  • Run npm install
  • Run grunt more info on Grunt
    • To run Grunt you'll need to also install Ruby and the SASS gem
  • Navigate to http://localhost and click "Install"
  • If successful, you'll be asked to create an account

How to start Unmark from Zip on your own server for personal use

No longer recommended, but do whatever you want!

  • Download the latest release
  • Unpack the archive into your desired location
  • Rename the file /application/config/database-sample.php to /application/config/database.php
  • Create a database for Unmark to use in mySQL
  • Fill in proper database credentials in /application/config/database.php
  • Point your browser to your-local-url/setup
  • If succesfull, you'll be asked to register a username and password

Upgrading to the latest release

From Release

  • Download the latest release
  • Shut down Unmark docker-compose down
  • Replace all Unmark files (keeping your local /application/config/database.php intact.)
  • Navigate to http://localhost/upgrade
  • Unmark will then make any database updates if needed
  • That's it!

From git repository

  • Run git pull origin trunk
  • Run npm update in the app's root directory
  • Run grunt in the app's root directory
  • Navigate to http://localhost/upgrade
  • Unmark will then make any database updates if needed
  • That's it!

Importing bookmarks

Unmark currently supports importing from Unmark's hosted version, any self-hosted version of Unmark, Readability, Pinboard, Delicious, Pocket and many other services.

To ensure this works properly be sure that your PHP.ini file's "max_upload_size" setting is larger than the file you're trying to import.

How to contribute to Unmark

Please consider donating via Paypal. Another major way you can contribute is to report any issues you find with Unmark on Github and being as detailed as possible about the issue you're having.

Another way is to contribute your own code via Pull Requests. Here are some notes on how to do that.

Forking and Pull Requests

  • Fork the repository on GitHub into your own account
  • Create your own branch of the trunk branch git checkout -b your-branch-name
  • Update your code and push those code changes back to your fork's branch git push origin your-branch-name
  • Submit a Pull Request using that branch
  • And please accept our thanks!

This makes it easy for us to test your code locally and also allows the community to have a discussion around it.

We use Grunt to compile our SASS files into CSS and concatenate and compress our JavaScript files for use and a few other small tasks. For any updates to JavaScript or styles you will need to use Grunt too. See the Grunt web site for help. We'd like to someday move away from Grunt for most of these tasks.

History

Unmark was originally created by Colin Devroe. It was a side-project called Nilai (the Indonesian word for "mark") and rebuilt from the ground up by Plain, a small software company, which included Jeff Johns, Kyle Ruane, Tim Whitacre, Chris Fehnel, Jakub Jakubiec and Colin Devroe.

Now it is being maintained by Colin, Kyle and the community in their spare time. Please consider donating or contributing code in order to keep Unmark alive and well.

Contributors

Currently being maintained by: @cdevroe and @kyleruane.

Extra special thanks to:

  • @phpfunk - who wrote most of Unmark's original codebase
  • @twhitacre
  • @kip9 - wrote the languages and migration back-up bits
  • @cfehnel - who handled support for the app

Also contributions by @thebrandonallen, @simonschaufi, @williamknauss, @hewigovens

unmark's People

Contributors

cdevroe avatar hewigovens avatar kip9 avatar kyleruane avatar phpfunk avatar simonschaufi avatar thebrandonallen avatar waknauss 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

unmark's Issues

installation fails: table not an innodb format

following the steps https://github.com/plainmade/unmark#installation

The setup fails with the page "AN UNEXPECTED ERROR HAS OCCURED"

Checking my DB I find one table created called "migrations" (with my prefix = "unmark_" set the table name is "unmark_migrations")

Looking next into the log file (\application\logs) I am getting this hint

ERROR - 2014-03-06 19:49:56 --> Table unmark_migrations is not in InnoDB format. Migrations cannot run.

Hence I manually alter the table to Engine=InnoDB leading to the next error

ERROR - 2014-03-06 19:51:49 --> Migrating to version 20140228091723 failed. Backup from before migration stored in

Where does it go wrong?

Remove all JavaScript that replaces input text

Remove the JavaScript that replaces default input information (and use the placeholder attribute) for all of the following:

  • login form
  • create an account form
  • group creation form
  • group invite
  • search box

add link manual

Please add a mask to add links manually via the main unmark site This can be helpful when you are on a public computer.

Readme updates

Readme needs to be updated to include

  • link to submit issues
  • a workflow to show how to contribute to nilai

Add archive search UI elements

I'm using the latest master branch code, so if archive search is in the staging branch you can disregard this issue.

I didn't see any way to search the archive other than manually appending the /marks/archive/search path to the end of the site URL. We need a search box in the archive. Additionally a link to search the archive with the current search terms from the main search results would also be useful.

Issues going through db setup on ClearDB

Hello,

Using the latest 1.5 release, I get the following error after launching off from /setup:

Error Number: 1452

Cannot add or update a child row: a foreign key constraint fails (unmarkdb.labels, CONSTRAINT FK_label_smart_label_id FOREIGN KEY (smart_label_id) REFERENCES labels (label_id) ON DELETE CASCADE ON UPDATE CASCADE)

INSERT INTO labels (smart_label_id, domain, smart_key, created_on) VALUES ('2', 'php.net', '5f810408ddbbd6d349b4be4766f41a37', '2014-04-03 14:59:01')

Filename: D:\home\site\wwwroot\system\database\DB_driver.php

Line Number: 330

Please forgive my database inexperience here.. Any idea what is causing the error? I'm using a MySQL db from ClearDB. I have made no changes to the unmark configs other than providing the URL, user, pass, and DB in databases.php.

Admin tool for self hostet projekt

Hi can you add a administration tool,
that we can adminsitrate, creat, delet etc... users from whithin a admin account.
This will be great.

Thanks theo

Sign up doesn't give helpful error messages

I tried entering a simple password with no caps on sign up and I was sent to a page with only the text "Please enter a valid email and password" or something along those lines. If you require a more complex password, the sign in page should mention this requirement and then the error message could be improved to "Please enter a password with a capital letter and a number," or so on. Also, it would be nice if this happened inline, and not on another page. :)

install instructions (selfhosted)

I'm having troubles setting up unmark on my webspace. What is meant by:

Navigate to /setup

I found /application/views/setup.php, but accessing the file via the browser results in 403 Forbidden Error. Even tough I changed the permissions to 755. I followed the other instructions and configured a mysql database properly.

The Path to my unmark instance is domain.com/unmark/. I configured a subdomain to unmark.domain.com but it still doesnt work.

Any Suggestions?

Regards

Store date archived

Store the date archived so that stats can be tallied. Stats, such as: "You marked 5 links today and archived 3."

[] Create migration.
[] Update Marks model for saving date when setting a mark as archived.
[] Update Marks model to include basic statistics methods.
[] Update view to show number of marked/archived for the day as proof-of-concept

bookmarklet design

Two points regarding the self-hosted version. Not sure if same behavior in hosted version. -

  1. The tags (to read/to watch/to buy) keep changing position when the bookmark is called upon. This is somewhat irritating. Consistency is better.
  2. The save button comes after the 'Delete Link' button. This means that a keyboard power user will have to press tab twice to get to the 'Update & Close' button. Is this by design?

Synchronisation android App Feature Request

In the android market I found new app to organice notes.
https://play.google.com/store/apps/details?id=it.feio.android.omninotes
I think this will be a good combination for unmark to host the bookmarks in a app on android.
Thinking also, that unmark can be a great backend for this project, to have the notes and bookmarks on one place syncronised on a (my own) server, look like evernote or so.
What you guis thinking about this Idea?
Here is the google+ group for this project:
https://plus.google.com/communities/112276053772152071903?partnerid=gplp0

Hope this is the right place also for feature requests.

Best Theo

Setup 404

Hi,

I'm hitting a wall installing unmark on my web-server. Trying to open /setup gives me a 404. /index.php and /index.php?/setup both give me a formatted page with "AN UNEXPECTED ERROR HAS OCCURED" message.

I'm guessing the mod_rewrite isn't working but can't figure out why. Any ideas?

Warning: file_exists() [function.file-exists]: open_basedir restriction in effect

I'm having troubles with the installation. I tried setting the path for open_basedir, but had no success. Thoughts?

Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. 
File(/etc/unmark/environment.php) is not within the allowed path(s): 
(/nfs:/tmp:/usr/local:/etc/apache2/gs-bin) in <my site directory>/html/index.php on line 47

Language locale error on Windows Machine

I'm trying to setup the app on my local machine using a virtual domain. I got a blank screen and logging at the error log I saw this

 ERROR - 2014-05-21 01:44:12 --> Array
  (
    [message] => Warning: Setting language to en_US.UTF-8 failed - no such locale
    [type] => Warning
    [backtrace] => C:\wamp\www\unmark\application\hooks\Unmark_Localization.php
    [custom_data] => Array
        (
            [language] => en_US.UTF-8
        )

    [enviornment] => production
    [user] => Array
        (
        )

)

How do I proceed from here. Has anybody experienced such

Missing .htaccess in release 1.2.3

I had to manually create the htaccess so that I can reach /setup page

EDIT : Hidden files was not copied, but htaccess was there. Sorry...

remove automatically utm_* google analytics parameter from url

lots of links have campaing tracking parameters in the url which should not be stored in the database (and also make the link very long). I know this can be very tricky but i think it's possible ;)

found this ruby example: http://stackoverflow.com/questions/12822347/how-can-i-remove-google-tracking-parameters-utm-from-an-url
and this javascript example: https://gist.github.com/paulirish/626834
maybe that helps.

maybe it's also possible to use the canonical meta tag if that's available?

Unmark+ Navigates away from page I am currently browsing.

Setup:
Linux
i3 tiling window manager
firefox nightly
Unmark+ added as bookmarklet

Action:
navigate to a page you want to bookmark.
click Unamark+

Effect:
1.Current browser tab is directed to :
jjavascript:(function(){l%3D"http://unmark.it%2Fmark%2Fadd%3Furl%3D"%2BencodeURIComponent(window.location.href)%2B"%26title%3D"%2BencodeURIComponent(document.title)%2B"%26v%3D1%26nowindow%3Dyes%26"%3Bvar e%3Dwindow.open(l%2B"noui%3D1"%2C"Unmark"%2C"location%3D0%2Clinks%3D0%2Cscrollbars%3D0%2Ctoolbar%3D0%2Cwidth%3D594%2Cheight%3D485")%3Breturn false})()

  1. New window opens to update and close or delete link.
  2. Everything else works as expected but now I have to click back to hit the website I bookmarked. The auto close bookmarklet behaves similarly but doesn't auto close as expected.

Setting SQLite fails to load page

There seems to be an issue with SQLite support. I tried installing with SQLite because I didn't feel like installing MySQL and SQLite comes with OSX, yet I failed to get even an error screen.

Setting $db['default']['dbdriver'] = 'mysql'; on line 65 of database.php shows this screen:
screen shot 2014-01-07 at 20 20 03

$db['default']['dbdriver'] = 'sqlite'; shows this blank page:
screen shot 2014-01-07 at 20 20 48

Is this my bad?

PostgreSQL Support

I am having issues with the installation. Specifically the migrations and postgre. Although the config lists support for postgre, there have been some choices made that prevent its use.

In migrations the checks for innoDB fail, the quoted identifier syntaxes on all migrations fail.

I can't immediately see how these could be patched sensibly to work with postgre, but wanted to ask if it is possible.

Untitled PDF tabs not getting saved

Google Chrome offers to open PDF files in a new tab for you using their own PDF implementation. Upon trying to save the tab, Unmark says that the link is saved but it doesn't actually appear in the stream.

Two things -

  1. The above bug and
  2. Editing of titles needs to be allowed.

The PDF in question - http://arxiv.org/pdf/1402.0412v2.pdf

Importing Pinboard bookmark JSON file fails silently

I just set up unmark on my web host. Everything seems to be working nicely, but importing my bookmarks from Pinboard fails silently. I have exported my 11.344 bookmarks which resulted in a JSON file of about 9 MB. When I selected that file in the import view, the file uploads and I'm redirected back to an empty view: http://d.pr/i/Y1L6

Please let me know if you need any additional information.

Figure out a better way to handle $data for all views

There is a lot of unneeded and crappy code for loading views. Example: https://github.com/cdevroe/nilai/blob/master/application/controllers/nilai.php#L157-L159

Which is: (incase those lines change)

$data['label'] = '';
$data['group']['groupuid'] = '';
$data['when'] = 'all';

I'd like to figure out a way to ditch the need for all of these in some way. Perhaps by using isset($var) inside of all of the views to stop errors from happening?

Other ideas?

Release 0.5.1 bookmarklet logged error

Hi,

While trying to bookmark a tab that had a PDF open in it, the bookmarklet said that there had been an error and that it had been logged.

Is there something I can do to submit the error to you guys or does the app automatically contact your servers about the issue? Where would the log files for such an error be?

The error appeared for a couple more tries on the same page and then disappeared and the bookmarklet worked fine.

Subfolder Hosting - selfhostet

Hi,

I tried to install this great tool in a subfolder on my hosting server, but god then errors and the installation worked only, when I install direkt under /www
Is there a howto wich explains the installation in this way?
Also to assign all links, mailadresses for password reset etc... to the own server.
I will be also helpfuel for selfhostet Projects to have a admin account to assign then other users for the unmark system.

Import from Other?

The Unmark help page says you can import bookmarks from Pinboard and other services, but the self-hosted version from here on GitHub does not seem to have an Import from Other feature.

Release 0.5.1 bookmarklet change Note Default text to placeholder

Hi,

I was able to install 0.5.1 on my shared host and have been using it.

One issue - In the Bookmarklet, there's a section to Add a Note. When you click on that button (Why is it a button and not a text field instead?), you get a text field to enter your note. The text inside the text field says "Type note text here...". This text should be a placeholder and not actual text, as this adds an extra step of having to select that text and remove it.

I tried to look into the app to find the place where it's located (to make the changes myself) but only found the "Add a Note" button and not the text field code. Else I would love to start contributing code here, instead of just filing issues.

setup/install - Eek, something is wrong.

OK, so I've read previous Issues that you've closed regarding this but I figured I would give it a shot.

I initially installed unmark in a subfolder which I understand is not how you recommend it to be set up. So I set up a subdomain and put the files in the root folder for the subdomain. I am an experienced Apache admin so I'm pretty sure I have it all configured correctly. When I visit my subdomain website I get the error page (Eek something is wrong), which is to be expected since you need to run the install first. So I tried to go to my subdomain/setup but I again got the (Eek) message. I checked the .htaccess file included with unmark and it looks fine and my server is reading it.

I do run my websites, including the new subdomain I set up on https (to get around a port 80 restriction) so the only thing I can think is that maybe the unmark software cant run over a SSL connection ?

I looked at the routes.php file but really couldnt figure out how to edit it to to possibly make it work. I am not familiar with the CodeIgniter but I did read some of the documentation for the routes.php and it seemed to me that I wouldnt need to edit it if I was running the site in the root folder.

Anyway, if you or someone else who has it running could point me in the right direction I'm sure I can get it working. Thanks !

Mike

Bookmarklet should not be loaded in main window

Whenever I use the bookmarklet to save a link, the bookmarklet opens a new window (which is fine), but it also loads the following in the main window, replacing the URL I'm saving:

javascript:(function(){l%3D"http://unmark.[mySite.com]%2Fmark%2Fadd%3Furl%3D"%2BencodeURIComponent(window.location.href)%2B"%26title%3D"%2BencodeURIComponent(document.title)%2B"%26v%3D1%26nowindow%3Dyes%26"%3Bvar e%3Dwindow.open(l%2B"noui%3D1"%2C"Unmark"%2C"location%3D0%2Clinks%3D0%2Cscrollbars%3D0%2Ctoolbar%3D0%2Cwidth%3D594%2Cheight%3D485")%3Breturn false})()

The save action still works, but it's not nice.

unmark-1.5.2 installation /setup returns 500

Hi, I'm trying to install unmark-1.5.2 on my vps(debain 7.0).

Steps to reproduce

  1. download and unzip unmark 1.5.2
  2. install mysql and create database
  3. update application/config/database.php
  4. php -S xxx:8000 (in ~/workspace/unmark-1.5.2)
  5. navigate to xxx:8000/setup
  6. returns 500

Am I missing something? Thanks

/setup missing ?

Hey guys. I just found out about this project and I cloned your repo to test it out. I seem to be missing the /setup directory. I checked your master and it does not seem to have it nor do the zips. Am I missing something ?

Release 0.5 install.php redirects to register/index.php instead of register.php

I am trying to install nilai/unmark on a shared web host (much cheaper than running a VPS) and I'm running into a problem. It seems that the /register view keeps redirecting to register/index.php and I can't understand how to fix that. The corresponding code in the register.php file is

$this->view('register/index');

Nowhere in the CodeIgniter docs can I find out what that means or how to rectify that. Can someone please shed some light on this issue? I understand that 0.5 is still in dev mode, but I was hoping the basic app would still keep working...

initial migration, timestamp and 32-bit machine

I tried to install unmark on a Linode VM to try it out, and I had a lot of trouble getting the initial migration scripts to run. Every time, it came back with "Migrating to version 20140228091723 failed." with a little red Band Aid X.

I have never used Code Igniter before, but it seemed fairly easy to debug.

I sprinkled some log statements through the code, and I found that in Plain_Migration.php, the parent::version($target_version) was returning an empty string.

I traced this into the system migration module, and it looks like the problem is related to using the YYYYMMDDhhmmss format for the timestamp, the sscanf function that reads the numeric part of the filenames, and the fact that I am running on a 32-bit VM. It looks like PHP on a 32-bit system only allows integers up to 2^32. This 14-digit timestamp is going to use at least 45 bits, unless you treated it as a string (and that adds some other snags).

I renamed the migration file to 011_label_sort.php and I changed the migration_type to 'sequential', and it worked... at least enough to get me to the initial login / account creation screen.

I did not try this on a 64-bit web server.

I am now up against a new error, but I think it is unrelated to the initial migration.

Thanks for sharing your work, and for inadvertently exposing me to Code Igniter.

Alan

Language support

We've recently pushed an update to Unmark that allows for internationalization (i8n). So if you're running anything newer than 1.4.0 you can begin translating Unmark into your language.

We've written up some basic instructions on how to do this and we'd love some help translating Unmark into the following languages:

  • English
  • Polish
  • Spanish
  • German
  • Dutch
  • Simplified Chinese
  • Japanese
  • Swedish
  • Your language

If your language isn't listed please feel free to add it and get started.

Import bookmarks from Chrome / self-hosted

Hi, just setup my unmark self-hosted domain. Easy as pie!

Now, I'm trying to import all my Chrome bookmarks. I've read everywhere online that the 'bokmarks' file located (WIN7) in User\AppData\Local\Google\Chrome\User Data\Default was indeed a JSON file, which is cool seeing it's the type of file needed to import my stuff to Unmark.

Tough when trying to import this one, I'm always getting this error:
ERROR: Invalid file format uploaded. Only JSON files accepted

So now I'm at a loss on how to proceed...
Any ideas?

Thanks for your help, and most of all for developing such gracious open-source soft
ed

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.