GithubHelp home page GithubHelp logo

elias-sundqvist / obsidian-annotator Goto Github PK

View Code? Open in Web Editor NEW
1.4K 18.0 61.0 33.07 MB

A plugin for reading and annotating PDFs and EPUBs in obsidian.

License: GNU Affero General Public License v3.0

JavaScript 37.96% TypeScript 26.86% CSS 0.89% HTML 34.29%
obsidian obsidian-md obsidian-plugin pdf-viewer pdf epub epub-reader pdf-annotator

obsidian-annotator's Introduction

GitHub release (latest SemVer) GitHub All Releases

Obsidian Annotator

This is a plugin for Obsidian (https://obsidian.md). It allows you to open and annotate PDF and EPUB files.

The plugin is based on https://web.hypothes.is/, but modified to store the annotations in a local markdown file instead of on the internet.

Demonstration

annotator demo

Warning! In the above gif I use Dataview syntax to specify the annotation-target. If you do not have the dataview plugin installed, you must instead write the annotation-target in the frontmatter, like this:

---
annotation-target: https://arxiv.org/pdf/2104.13478.pdf
---

Known issues

  1. Plugin doesn't work on iOS 16.3 or higher. Follow #289 issue state up to date.
  2. Reader doesn't show annotations if they were changed on different platforms.

Getting Started

Add the property annotation-target to the frontmatter of your obsidian note, with a value corresponding to the location of the EPUB/PDF file. The location can either be a file in the vault (such as Pdfs/mypdf.pdf), or online (such as https://arxiv.org/pdf/2104.13478.pdf)

Then you can, in the open note pane, select "more options" (the three dots in the top right), and a new option "annotate" should be available.

The plugin automatically tries to determine whether the file is an epub or pdf based on the file path, but in case this doesn't work, you can also add the property annotation-target-type and specify whether it is epub or pdf manually.

If you have dataview installed, then you can also specify the annotation target with a dataview attribute. In this case, obsidian-style links can be used instead of a plain-text path.

WARNING! Don't rename an original pdf or epub file! The plugin is going to lose the connection between annotations and file in that case.

Annotating

Annotation is self-explanatory. Select text with your mouse to get started.

In the future, it would be nice to add colored highlights and image/region highlights. These features will have to be added to hypothes.is first, however. See these relevant issues: hypothesis/product-backlog#198, hypothesis/product-backlog#669

The annotations in markdown

To return to the regular obsidian markdown editing mode, you can select more optionsOpen as MD. Each annotation has an associated quote block with a block reference. Be careful with modifying these blocks. Minor edits to PREFIX, HIGHLIGHT, and POSTFIX are typically ok. But if the edits are too major, hypothesis may no longer be able to identify the corresponding text.

The COMMENT region can be freely edited. (but ensure that it is still part of the quote block.)

The TAGS region should consist of a comma-separated list of obsidian tags. (like #tag1, #tag2, #tag3)

Dark Mode

The plugin has built-in dark mode support. To toggle dark mode, select more optionsToggle Dark Mode while annotating. You can also tweak the dark mode behavior in the settings tab for the plugin.

Linking to annotations

An obsidian link to an annotation block-reference will, when clicked, open the corresponding file and scroll to the associated highlight. If the file is already open in a pane, then the link will cause the existing pane to scroll instead.

Contributing

Visit CONTRIBUTING.md for information on building from source or contribution improvements. To report a bug, ask a question or suggest an improvement for this plugin, you can create an issue.

Changelog

0.2.11 (2024-01-06)

  • Fix issue with rendering annotator in Obsidian 1.5.3 and later (See issue #356)

0.2.10 (2023-01-09)

  • Fix bug #284 Plugin didn't start on iOS

0.2.9 (2023-01-05)

  • Click on annotation link in markdown causes an immediate jump to annotation in PDF (Thanks to @HardwayLinka)
  • Fix broken drag-and-dropped link to highlight caused by line breaks. (See issue #267, Thanks to @HardwayLinka)

0.2.8 (2022-11-27)

  • Fixed issue with "Annotate" button not appearing (See issue #253)
  • Fixed issue with scroll getting stuck after clicking annotation link (See PR #259, Thanks to @HardwayLinka for the contribution)
  • Partially fixed issue with annotation links not working (See PR #231, Thanks to @XSAM for the contribution)

0.2.7 (2022-10-31)

  • Fixed issue with Latex Equations not rendering in annotations (See issue #228)
  • Removed "sign-in/log-in" buttons (See issue #241)
  • CSS Snippets can now be used to style the hypothesis sidebar

0.2.6 (2022-08-19)

  • Fix bug #208 introduced in 0.2.5 It was impossible to open an internal link because of the plugin

  • Internal changes

    • Use dataview package to communicate with dataview plugin

0.2.5 (2022-08-14)

  • Move buttons 'Annotate', 'Toggle Dark Mode', 'Open as Markdown' to top of options menu

  • Video annotation

  • Internal changes

    • CodeMirror updated to v6
    • obsidian-api updated to 0.15.9
    • betterer was installed with strict typing settings to make plugin more stable and reliable in a future

0.2.4 (2022-07-23)

0.2.2 (2022-05-14) Minor improvement

  • hypothes.is updated up to v1.1055.0

0.2.1 (2022-03-06) BRAT release Basic web and video annotation

  • annotation-target-type can now take on the values web and video.
    • With web the annotation target can (in theory) be any website. Some work better than others. Link navigation does not work.
    • With video, only youtube links are supported. In order to use this feature, a link to a zip file with the annotator.tv resources must be provided in the plugin settings. It cannot be bundled with the plugin since that would most likely violate copyright.
    • Other improvements:
      • Some behind-the-scenes changes have been made so that the hypothes.is version can be more easily upgraded in the future.

0.2.0 (2022-01-26) BRAT release Improved markdown rendering, epub reader

  • Markdown in the hypothesis sidebar should now fully support the regular obsidian syntax. (including links, embeds, custom codeblocks etc.)
  • Several Epub improvements, Thanks to @aladmit for these!
    • New option added for font size scaling (See PR #127)
    • New "epub reader mode" setting added. Infinite scrolling is now supported! (See PR #114)
    • Reduced page padding so that maximum available space is used. (See PR #126)

0.1.9 (2022-01-17) Minor fix

  • Removed sentry logging, again, (See issue #97)

0.1.8 (2022-01-16) Minor fixes, added default annotation mode setting

  • Fixed issue with pane loading on startup
  • Fixed some issues with epub highlighting
  • Added setting to choose default annotation mode, Thanks to @aladmit for the PR! (See PR #113)

0.1.7 (2022-01-14) BRAT release chinese file name support

  • Fixed issue with chinese file names, as discussed in issue #53

0.1.6 (2022-01-12) BRAT release Live Preview Drag and Drop fix + chinese character support

  • Drag and drop should now work in live preview (See issue #103)
  • Upgraded pdf.js to a newer version.
    • Improved character support. (Japanese and Chinese letters should now work), (See issue #53)
  • Removed sentry logging (See issue #97)

0.1.5 (2021-12-19) Quick fix

  • Apparently the previous update broke some of the old annotations for some people (See issue #95). This version hopefully fixes that.

0.1.4 (2021-12-18) Fix Issue With Ipad + Windows/Android compatibility.

  • See issue #70, Thanks to @jonasmerlin for the fix!

0.1.3 (2021-09-12) Basic CORS support for desktop

  • Added a basic workaround for CORS issues. This should make more links possible to view. (See issue #15)
    • Note that this workaround only works on the desktop version of obsidian.

0.1.2 (2021-09-11) Quick Fix

  • Fixed critical bug that prevented any annotations from being saved. (See issue #61)

0.1.1 (2021-09-10) Drag & Drop Fixes, Open links in new pane, Multi-Line Comments Fix

  • Drag and drop has been improved. The drop handlers are now unloaded when the plugin is unloaded. The issues regarding interferrence with other Drag and Drop functionality are hopefully also resolved. (See Issue #50)
  • Using an array format for the annotation target should now work. This improves compatibility with MetaEdit (See Issue #51)
  • Holding ctrl and clicking links (or clicking with the mouse-wheel) now opens annotations in a new pane. (See Issue #54)
  • Issue with multi-line comments should be resolved. (See Issue #47)
  • A new command (`Toggle Annotation/Markdown mode) has been added. This can be bound to a hotkey in obsidian, enabling more efficient switching between the two modes. (See issue #39)
  • Other things
    • A basic unit-test for annotation loading has also been added. More tests will be added as issues arise. This will guarantee that the plugin becomes increasingly stable over time.

0.1.0 (2021-09-03) Added annotation highlight drag and drop

  • By holding the shift key you can now drag highlights from the epub/pdf into a separate Obsidian note, and a link to the highlight will be inserted. highlight drag and drop

0.0.9 (2021-09-03) Quick fix for annotation id bug

  • See #37

0.0.8 (2021-09-03) Added Pre/Postfix setting toggles, Fixed scrolling issue, More size reductions.

  • The plugin is now available in the community plugins list!
  • The Pre- and Postfix parts of the annotation markdown can now be disabled in the settings. (See #30)
  • Clicking a PDF annotation link now causes an immediate jump to the annotation. No more glitchy scrolling. (See #21)
  • Potential fix to the memory leak mentioned in #28 added.
  • Added core-js. Will hopefully mean that the plugin works with older versions of node (see #34)
  • Disabled global WebSocket override. Should resolve issues with Obsidian Sync (see #36)
  • Further size reductions of the plugin
    • React is now built in 'production' mode.
    • All the embedded resources now use the highest zip compression ratio.

0.0.7 (2021-09-01) Added Custom Default Path setting, Page notes fix, Slight JSON size reduction, etc.

  • Added a new setting called Custom Default Path. See this comment on #19 for more info.
  • Top-level values in the annotation JSON will now be ommited if their values are "unsurprising". See #24
  • Fixed page notes breaking the loading of annotations.
  • Made the Post to... button always say Post to Only Me to reduce privacy confusion.
  • Further reduced plugin size
    • Switched from base64 to full unicode encoding
    • Added minimization of resources before zip generation
    • Added minimization of final rollup output
  • Minor fixes
    • Removed warning about websocket userid mismatch
    • Added possible fix to #13

0.0.6 (2021-08-30) file: protocol support, various url fixes, privacy improvements, minor fixes

  • Fixed so that no initial http request is made to the hypothes.is servers.
  • Hypothes.is performance trackers removed.
  • No more error messages from the websocket api.
  • The stored annotations no longer reference the sample pdf url, since that confused some users. (See issue #7)
  • Initial support for file: protocol links added. (Has not been tested much yet.)
  • The placeholder staus bar text has been removed (See issue #17)

0.0.5 (2021-08-26) Fixed EPUB bug, minor file restructuring

  • The files necessary for the epub reader were .gitignored, which prevented it from working in the previous releases. (See issue #6)
  • The code files has been moved to the src directiory so that the repo looks a bit less messy.

0.0.4 (2021-08-26) Chinese File name support

  • Added support for chinese file names. (See issue #4)

0.0.3 (2021-08-26) Plugin Size Reduction

  • Removed some unnecessary files to reduce plugin size.

0.0.2 (2021-08-26) Minor fixes

  • Removed logging,
  • Simplified link handling
  • viewer height is now 100% instead of fixed to 1000px.

0.0.1 (2021-08-25) First Release

  • Basic functionality of the plugin implemented

License

Note: The files under the resources folder are scraped from the web. Each website has its licence file attached in the associated folder.

Obsidian Annotator is licensed under the GNU AGPLv3 license. Refer to LICENSE for more information.

Support

If you want to support me and my work, you can sponsor me on Github (preferred method) or donate something on Paypal.

obsidian-annotator's People

Contributors

aladmit avatar elias-sundqvist avatar hardwaylinka avatar jonasmerlin avatar matthewturk avatar rdimaio avatar xsam 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

obsidian-annotator's Issues

Add selected text as an alias for block references

Add selected text as an alias for block references

For example: I selected in this PDF "nvestment Thesis" as a highlight, the note will be dragged to other notes when the display is: [[NOTE#^6cltnr737q5]]

image

can generate such: [[NOTE#^6cltnr737q5|Investment Thesis]]
which is the selected field as an alias for the block name.

Because then the content of the block reference can be known during the edit state. If the selected text is too long, perhaps it could also be displayed like this.
[[NOTE#^6cltnr737q5|Investment Thesis Since its inception in 2007......]]

[idea] Annotation extraction to MD file?

Hi there,

Thanks again for creating such a nice plugin.

Meanwhile, I wonder if the plugin could allow annotation extraction to pure MD files?

  1. I appreciate annotation-related information is currently stored in a json format, which is rich and nice, but probably less interesting from a user's side, as seen in #24 and #30 .
  2. If annotations could be further extracted to a clean MD file, they will become even more useful together with other obsidian plugins. For example, with mind map, the user could have a nice tree view of annotations.

Just a naive idea. Feel free to omit it : )

Console error when flipping any note (non pdf annotation note) to preview mode

This seems to happen the first time I change a note in a pane from edit to preview mode. After I do it once it doesn't seem to happen again when flipping between edit and preview mode until I change to a new note in that pane or restart obsidian at which point it will do it again. Seems to be the "first time" because likely having to do with the markdown preview render actions that happen the first time obsidian renders in preview mode and "caches" much of the file in preview mode.

It seems like it may have to do with block references rendering.

image

Use 100% height for css

The height of the iframe is currently set to 1000px. However, for 4K screens, this doesn't span the full frame of the pane. Can you set it to 100% instead?

.7 Release Interfering with Obsidian Sync

On my installation, enabling the .7 release causes Obsidian Sync to stop working. After enabling the plugin and restarting Obsidian, files no longer sync and "version history" for all files is blank. Sync activity shows "1000 normal closure error" repeatedly -- and the same error shows up in dev console.

Disabling this plugin and restarting Obsidian resolves all issues immediately for me.

Where to donate!?

Hi again,

I searched your website but couldn't find where one can donate to the plugin. Is this possible? Do you accept donations?

Regards,
6-9

Memory "leak" / high consumption - 1.2gb RAM when typically Obsidian sits at ~400mb

I can't explain exactly when/what causes this but if I open up a couple PDFs to annotate and then close them it seems like maybe the plugin is not "cleaning up" / "garbage collecting" as my RAM begins to spike and then even if I close all annotation panes and even disable the annotator plugin, it stays at this high RAM consumption until I completely close and re open Obsidian.

RAM after opening a few PDFs with annotate and then closing them. You see CPU is at virtually nothing because it isn't actually doing anything but the memory/RAM consumption is still there:

image

Normal RAM of Obsidian at "steady state":

image

In the notes bar on the right, it is suggested that can drag a note to other notes by pressing and holding it directly.

Thanks for all the hard work!
In the notes bar on the right, it is suggested that can drag a note to other notes by pressing and holding it directly.

In addition, since I personally use panning CSS, sometimes the notes I need to drag to are far apart, so I suggest adding a copy function to the notes bar on the right, so that I can directly copy the reference of a note, which is convenient to paste in other notes afterwards.

New drag and drop feature conflicting with other drag and drop Obsidian plugins

The new drag and drop feature conflicts with my plugin I am developing that does drag and drop stuff. Additionally it also gives the same error when trying to do Obsidian native drag and drop of search results from left sidebar search view into a file/pane which creates a link to where the search result came from.

For my plugin it completely breaks it on the onDrop event. For obsidian native search result dragging it still looks like it does what it is supposed to but gives the same error. I assume you hook into the Drag event drop listener... I would first add a check to see if the drag is coming from one of your PDF annotator leafs/views and if not, abort. Otherwise it appears it is running your code on any drop event which several plugins use.

What I do to check for this is on dragstart event I set a variable that tells me it was my plugin drag handle that was started so that then on drop I know to do stuff for it. And then I always clear that variable on any drop. That way if it wasn't started by my plugin drag and drop handle then my code won't try to run. Alternatively I think you can add a custom property to the evt.dataTransfer object that handles drag and drop data.

image

I have to disable your plugin right now because otherwise my drag and drop plugin won't work... and the native search drag and drop appears to work but puts the error in the console each time (so everyone is effected by it, not just when using my plugin).

Let me know if you have any questions.

Login Button is sometimes visible in the Epub Reader

It's very exciting to see this plugin. Thanks so much for supporting ePub.

Unfortunately, I cannot log in to my Hypothesis account. When I click the link to login, nothing happens. I'm on Windows Desktop.

I can open ePubs but not annotate them.

Annotation view doesn't load when restoring a workspace.

When using the Obsidian Core Workspaces plugin (where you can save/load your currently open panels), the annotation view does not load when restoring.

How to reproduce:

  1. Create an annotations.md for a local PDF (one that is stored within an Obsidian Vault)
  2. Click "annotate" to go to the annotation view
  3. Vertically split the view, and on the other panel, open the markdown version (annotations.md) so that you have the PDF annotation view side-by-side with the md version.
  4. Save this workspace
  5. Open another workspace that does not include the PDF that is being edited
  6. Click around a bit, edit some stuff
  7. Try to restore the workspace that you created in step 4.
  8. The panel that should show the PDF annotator is empty

[[Idea]] Retrieve metadata from PDF's with option to add as YAML

This is super exciting! Thanks for all the hard work. A couple suggestions/ideas:

  1. It would be awesome to be able to retrieve metadata from pdf's (authors, year, DOI, etc). Most pdfs have this already baked in, but it can also be retrieved via DOI numbers (like Zotero does). This is particularly helpful when creating dataview queries and to build networks of papers around topics.
  2. Having the option to add that metadata in YAML format. Mdnotes, the other. PDF annotator lots of folks in Obsidian use leverages this via Zotero/Zotfile.

Cheers!

bug: annotation disappear

if comment have two or more ‘\n’, annotation will disappear when markdown file from MD to Annotate.

How can i load a local epub file?

I try to use it for local files, as for pdf file, I works great

annotation-target:: [[Tricks of the 3D Game.pdf]]

But i try to load epub file like this but failed

annotation-target:: file:///D:\OneDrive\Vault\Vault\Assets\Epubs\Game.epub

YAML Frontmatter in the gif seems to be outdated

I've reproduced the flow from the gif exactly, but it did not trigger the "Annotate" button in the pane's menu. However, the following syntax did work:

---
annotation-target: Pdfs/mypdf.pdf
---

Probably a good idea to either

  1. fix the issue so that the syntax from the gif works again
  2. change the gif so that it shows the syntax shown above

Error when enabling community plugin

I'm trying to install obsidian-annotator via the community plugins menu. I'm able to install it, but when I click "enable" I get the error message "Failed to load plugin obsidiain-annotator".

Console logs

After installing but before clicking "enable"

Annotator: styles.css not found

Each time I click "enable"

Plugin failure: obsidian-annotator TypeError:
Zu.substring(...).replaceAll is not a function
    at anonymous (eval at <anonymous> (app.js:1), <anonymous>:49031:193)
    at t.<anonymous> (app.js:1)
    at app.js:1
    at Object.next (app.js:1)
    at s (app.js:1)

Other context that might help

I don't have too complex of a setup. I did try to manually install this plugin the other day before it was added to the community plugins list, but I couldn't get it to open a PDF so I decided to remove it and try again later. I don't think that would cause any issues, but I'm mentioning it here just in case.

Video

I recorded a video of the error. Hopefully it helps.

annotator.mp4

Let me know if you need anything else from me to help you debug this.

[idea] Read & write as embedded annotations?

Hi there,

  1. It seems those embedded annotations of pdf files are not recognized. This will probably limit the motivation to migrate to obsidian annotator, when one already has a large library of pdf files and the annotations are embedded via his/her familiar tools, like Okular or Adobe Acrobat.

  2. Also, it will be excellent to have the option to save annotations as embedded.

Thanks again for the plugin.

(I'm probably being too greedy with this plugin; please feel free to omit if this idea seems not right in your plan.)

Hypothes.is username in plugin options

This is a feature request: to be able to write Hypothes.is username in this plugin options.

I guess I am not alone at finding that the username I have been using for years in my workstation is not available when creating a Hypothes.is account. If they are not the same, private annotations are not merged after syncing.

Thanks for sharing this very useful plugin.

What does "Status Bar Text" in the bottom footer (Status Bar) do?

This is a question - I am unsure exactly what the "Status Bar Text" item does in the status bar. Currently it appears to do nothing (that I can see) and simply takes up valuable real estate in the status bar. For now I have disabled it with CSS (display: none;) but worry that I am missing out on some key functionality. Wondering if you can advise. Thanks.

Annotate option not showing up in note options

I've tried plugin versions 0.0.5, 6, and now 7 and none of them create the "Annotate" menu option. Am I missing a piece of setup?

macOS 11.5.2 and using Obsidian 0.12.12

Attached is a quick video of a vanilla Obsidian install with v0.0.7 of the plugin.

annotate-missing

[IDEA] Options for PREFIX and POSTFIX

Hi,
Great work here. Just an idea - I'd love the option to be able exclude the postfix and prefix from the highlighted text, if this is possible. It makes the markdown just a bit messy. Not sure if this is feasible, but might make a nice checkbox option.
Cheers!

Can we target files on local computer that are not in our vault?

I'm trying to target a PDF like Obsidian does with linking to local files on your computer that are outside your vault with file://... do you see this as a possibility down the road? Or do you think we will have to have PDFs copied into our vault?

annotation-target: file:///C:%5CUsers%5CShawnMurphy%5COneDrive%5C1_Docs%5CResources%5CISVs%5CMSFT%5CSQL%20Server%5CSQL%20Server%202019%20Licensing%20guide.pdf

image

PDF title with spaces seems to lock up the note?

When I add something like this to a note's front matter

annotation-target: PDF/Some PDF With Spaces In Name.pdf

the "Annotate" option does not appear in the three-dot menu, and the note seems to lock up. I.e., it cannot be edited.

No doubt this is user error?

Why is Obsidian Annotator not published as a community plugin?

Hi there,

I really like what you've done here and I think that this will develop in a great plugin for Obsidian. Maybe even one that will allow me to replace my scientific annotation tools (e.g. integration with JabRef would be AWESOME).

Anyway, I'm here to ask why isn't this plugin published as a community plugin so that it can be installed from within Obsidian itself?

Regards,
6-9

Create new pdf reader by default

Annotator is a hilariously awesome plugin 👍👍👍 omg!

At first I felt disoriented how to launch this plugin, so I went back to read again your instructions.

Anyway, I'd prefer if Annotator would have the killer feature to create the pdf reader window by itself, because there's no going back to the original md file. The front matter tag gets its info from the links clicked beforehand

So my suggestion is following:

  1. we add manually a link [filename](best if remote) in a document.md file
  2. we click on the link in point 1
  3. Annotator creates by itself a pdf reader window and puts that file.md in a predefined "read" folder specified by the user

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.