GithubHelp home page GithubHelp logo

postleaf / postleaf Goto Github PK

View Code? Open in Web Editor NEW
508.0 20.0 205.0 2.45 MB

Simple, beautiful publishing with Node.js.

Home Page: https://www.postleaf.org/

License: MIT License

JavaScript 61.86% CSS 29.52% Shell 0.09% SCSS 8.53%
cms blogging content-management nodejs publishing javascript

postleaf's Introduction

A note from the author

Postleaf — at least in its current form — has been discontinued. In the future, I'd like to bring it back as something different. Maybe an open source project. Maybe a SaaS product. I'm not sure at this point.

The world still needs a simple platform to encourage blogging and the decentralization of publishing. Unfortunately, This version of Postleaf didn't fill that gap because it was too difficult and expensive for the majority of users to install and host. Aside from that, the world of web hosting has changed significantly in recent years.

For now, I'm taking some time to focus on other projects and interests. I hope to revisit Postleaf again when the time is right for me, but I'm not exactly sure when that might be.

That said, I'm archiving the Postleaf repository. Anyone is welcome to fork the project and carry the torch, but I'm hanging onto the "Postleaf" name, U.S. trademark, and website, so new maintainers will need to release it under a different name.

Thanks for the many years of encouragement. While my vision for Postleaf wasn't fully realized, I've learned so much from this project and its community. I'm still excited for Postleaf's future.

— Cory


Postleaf

Simple, beautiful publishing.

Postleaf on a laptop, tablet, and phone

Postleaf is a beautifully designed open source blogging platform built for the modern publisher.

Created by Cory LaViska

This software is dedicated to my daughter, Sophia, and my son, Calvin. Chase your dreams, lil’ ones. 💙💚

Documentation

Detailed instructions for installing, updating, and creating themes can be found at postleaf.org/docs.

Installation for Developers

This guide assumes you're installing Postleaf locally for development purposes. Please make sure the following dependencies are installed on your system before continuing:

  • Node 7 (lower versions have not been tested and are not supported)
  • npm
  • Git
  • SQLite 3
  • GraphicsMagick

You will also need access to an SMTP server for sending emails. Otherwise, you won't be able to create users, perform password resets, etc. If you don't already have a transactional email service, the folks over at Discourse have put together a great list of email providers — many of which offer free plans.

To install Postleaf in a development environment, follow these instructions.

  1. Open a terminal and clone the project and default theme:
git clone https://github.com/Postleaf/postleaf.git
git clone https://github.com/Postleaf/empower-theme.git themes/empower-theme
  1. Make a copy of .env.example and name it .env. Open it and change AUTH_SECRET to a random string to secure your app. Then add your SMTP credentials so email can be sent. You also need to set the APP_URL to http://localhost:3000/.
  2. Install dependencies and run the build script:
npm install
sudo npm install -g gulp-cli
gulp build
  1. Now launch the app:
node app.js

At this point, you should be able to see Postleaf running by pointing your browser to http://localhost:3000/.

Themes

To install a theme, simply add it to the themes directory. There are a few additional themes located in the main repo.

To learn how to create your own theme, refer to the theme documentation.

Support

Please do not use the issue tracker for personal support requests. Instead, visit postleaf.org/support for support.

License

©2017 A Beautiful Site, LLC

This software is copyrighted. You may use it under the terms of the MIT license. See LICENSE.md for details.

All code is copyrighted by A Beautiful Site, LLC except where noted. Third-party libraries are copyrighted and licensed by their respective owners.

Postleaf is maintained under the Semantic Versioning guidelines and we adhere to them as closely as possible.


“The starting point of all achievement is desire.” — Napoleon Hill

postleaf's People

Contributors

ahmadajmi avatar claviska avatar erikxxon avatar flyinglimao avatar harikt avatar juan-manuel-alberro avatar karsasmus avatar m8inc avatar robertsandu avatar stateford avatar venatoria avatar xtrafrancyz avatar yura-chaikovsky 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

postleaf's Issues

RTL support

I want to make sure everyone can use Postleaf, so RTL language support is imperative. Follow this thread for updates.

SequelizeUniqueConstraintError: Validation error

Summary

Running node app.js returns:

SequelizeUniqueConstraintError: Validation error

Steps to Reproduce

  1. Start up a CentOS 7.3 server
  2. Install Postleaf dependencies
  3. Run gulp build
  4. Run node app.js

Additional info

Using CentOS 7.3, Node 7, sqlite 3, GraphicsMagick 1.3.25, after running gulp build

Animated images render incorrectly when viewed dynamically

Summary

The GIF images doesn´t work as expected after publish

Steps to Reproduce

  1. Create a new publication
  2. Add a GIF and insert it into the publication
  3. Save

Additional info

  • Postleaf version: latest version from master
  • Node version: 7.9.0
  • Affected browsers: alls
  • Operating system: macOS Sierra

Demo

Problems updating from alpha.4 to alpha.5

So I decided to try my first update with Postleaf....and things didn't go so well.

I was on version 1.0.0-alpha.4 and after updating to 1.0.0-alpha.5 I simply got this error:

postleaf-error after-update

I tried also updating the Empower theme to the latest but that didn't fix it.

Luckily, I had backed up my entire site beforehand and I was able to get back to where I was. But I'd certainly like to avail of Sitemaps and JSON feed etc.

Steps to Reproduce

  1. Upgrade from 1.0.0-alpha.4 to 1.0.0-alpha.5 using Empower theme

Additional info

  • Postleaf version: 1.0.0-alpha.4/5
  • Node version: 7.9.0
  • Affected browsers: N/A
  • Operating system: Ubuntu 16.04

Add French translation

Summary

Add the french translation

Steps to Reproduce

  1. Produce the translation
  2. Check grammar and encoding

Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org

Embed cards have undefined provider

Inserting an embed card results in the following markup:

<div data-embed="true" data-provider="undefined">
  [embed card markup]
</div>

The data-provider attribute shouldn't be present in this case.

Example CentOS 7 release

Summary

This is an example attempt at building a contained release of Postleaf and all dependencies for CentOS 7.

https://drive.google.com/open?id=0Bw79xAK-G5jhQTNnNmoxcGxxWXc

Installation:

wget https://drive.google.com/open?id=0Bw79xAK-G5jhQTNnNmoxcGxxWXc
tar -zxvf postleaf-centos-7.3.tar.gz
cd postleaf
cp .env-example .env
nano .env // setup your env settings
chmod +x run.sh
./run.sh // sets PATH variables, calls node from bin directory

The only dependency missing from this example is sqlite, which is installed by default on DigitalOcean droplets.

With this technique you can create a build process for each major server OS. You can bake in all dependencies and assets post-gulp build. This greatly simplifies the installation process.

How it works:

First, install Postleaf on the target OS normally, including all dependencies (node, sqlite, gm, etc.)
Move all dependency binaries to a folder inside the postleaf project (I used bin)

Write a startup script to modify the PATH environment variable for the node process (see run.sh) to include the bin directory. Now all calls to binaries like GM will look inside our bin folder first.

Note we also use our local node binary instead of the globally installed Node. This is a big deal since many node-based projects require different versions of node, they really need to bundle their preferred version to avoid conflicts. Really important if you want to run more than one node app on the same box.

We might be able to get rid of run.sh if we can set the PATH environment variable at runtime (top of app.js). Not sure about this.

We should check the licensing on GM to make sure it can be bundled legally, and make sure we include the license alongside the binary if necessary.

Support for Sitemaps

Hello all,

It's a general question instead of a bug, is Posteaf generating the sitemap.xml file or there's an endpoint for that e.x. /sitemap ?

If don't, any plans to add it into the alpha version? I believe this is a very important feature since Postleaf is SEO friendly.

Thanks.

Wrong revisions

Summary

I created a post with slug untitled post. After post was created, I opened it again, changed content and saved again.

I created a new post again. I opened post settings, clicked revisions tab and saw the revisions from the previous untitled post. I was able to open the first post's preview.

I closed Chrome, stopped and restarted Postleaf and deleted all Postleaf cookies, but revisions are shown.

Additional info

  • Postleaf version: master
  • Node version: 6.10.2
  • Affected browsers: Chrome 58
  • Operating system: Ubuntu

Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org

Editing Code Samples

I write a lot of code related articles and I'd like to be able to add some classes to the pre tags in my posts so I can use PrismJS to add language based highlighting.

Is this possible right now, and if not is it planned?

  • Postleaf version: 1.0.0-alpha.3
  • Node version: 7.9.0

Suggestion: Use GitHub Boards for roadmap

Hey @claviska,

Do you have any plans to make a roadmap to keep track of the order features will be implemented? GitHub has that really nice boards feature now that everyone seems to use instead of Trello. Would be nice to see what the short and long term goals are for the project.

Postleaf failed to start! SequelizeUniqueConstraintError: Validation error

Summary

I've followed the article here for Ubuntu:16.04

https://www.postleaf.org/installing-postleaf-on-digitalocean?v=1

But when I run node app.js I get the following error:

Error: Postleaf failed to start!

SequelizeUniqueConstraintError: Validation error

Not sure where to go from here. Any suggestions what this error means?

Steps to Reproduce

  1. Install git nginx sqlite3 nodejs (7) and graphicsmagick
  2. Clone repo into /var/www/postleaf
    3.Clone Empower theme into theme directory
  3. Globally install npm-gyp npm-pre-gyp sqlite3 and sequelize (sudo npm install -g npm-gyp npm-pre-gyp sqlite3 sequelize gulp)
  4. Rebuild the following packages - node-gyp node-sass optipng-bin jpegtran-bin sqlite3 sequelize
  5. Run npm install
  6. Run gulp build
  7. Run node app.js

Additional info

  • Postleaf version: master
  • Node version: 7.9.0
  • Affected browsers: N/A
  • Operating system: Ubuntu:16.04

Tags aren't sorted properly

Summary

If you add a Tag in lower case the order doesn't work as expected

Steps to Reproduce

  1. Go to Tags
  2. Add new tag in lower case
  3. Check the sorting

Additional info

  • Postleaf version: latest from master
  • Node version: 7.8.0
  • Affected browsers: all
  • Operating system: all

Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org

Resolved: lib.css is a 404

Summary

/assets/css/lib.css is a 404

No gulp build errors, lib.css is present with content inside assets/css

Steps to Reproduce

  1. Install Postleaf
  2. Run Postleaf

Additional info

  • Postleaf version: latest (how do I tell?)
  • Node version: 7
  • Affected browsers: All
  • Operating system: Centos 7.3

Check for dependencies on startup

Some folks don't realize they don't have the necessary dependencies installed when they run Postleaf. This can lead to sporadic bugs. A quick check on startup could save a lot of troubleshooting.

Postleaf installer

A global npm package which could be used to install new Postleaf projects.

So running npm install -g postleaf-install to install the package globally

Then you could run postleaf-install new some-project or postleaf-install new /path/to/install/in.

Running this would create a fully functioning Postleaf project without the needs for npm install or gulp build.

Broken URLs on 1.0.0-alpha.3

Summary

I've followed the instructions for Installing Postleaf on Digital Ocean using the tagged version 1.0.0-alpha.2 but when I run node app.js I get the following url http://34.253.2.242/undefined/install

See the screenshot below:

liiw7j

Steps to Reproduce

Follow the tutorial with 1.0.0-alpha.2

Additional info

  • Postleaf version: 1.0.0-alpha.2
  • Node version: 7.9.0
  • Affected browsers: N/A
  • Operating system: Ubuntu 16.04

Template caching breaks things when NODE_ENV=production

Template caching isn't working in production because of a naming conflict with the admin and theme layout file (resolve in Postleaf/empower-theme@04ed6bd).

Turns out, there are more issues related to this:

  • A race condition exists when using useThemeViews() and useSystemViews(). A proper renderer needs to be used for admin and theme views to avoid this.
  • Adaro doesn't support multiple view folders (patch submitted).
  • Even with multiple view folders, Dust caching is based on the template's name instead of its location, meaning you can't switch themes without restarting the app. (Dust cache can't be cleared because dust is internal to Adaro.)
  • Using chunk.partial() to render the theme toolbar in theme_helpers.js is causing theme views to hang.
  • Need to ensure custom error pages still work once a solution is in place.

Smart quotes and typographic improvements

Not sure if this should be a TinyMCE plugin or something built into editor.js, but I'd love to add this sooner than later.

My preferred approach is to do this on the fly like Medium as opposed to when content is rendered. This is inline editing, after all. 💪

  • -- ==> en-dash
  • --- ==> em-dash
  • ... ==> …
  • (tm) ==> ™
  • (c) ==> ©
  • 12x12 ==> 12×12
  • Smart quotes (not as easy as it sounds)
    • opening single quote
    • closing single quote
    • opening double quote
    • closing double quote
    • prime (e.g. 1234′)
    • double prime (e.g. 1234″)
    • years (e.g. ’99)
    • apostrophe (e.g. Bob’s)

Option for "Opens in New Tab" on Navigation items

I think it could be useful to allow for navigation links to have the target="_blank" attribute set on them.

I sometimes link out to external sites such as my Github account in the main menu or subdomains for labs, projects etc and I like to open them in a new tab if possible.

Fallback to a card block for pasted URLs that don't return oEmbed data

Currently, Postleaf looks for an oEmbed service when a URL gets pasted into the editor or the embed tool. If the site doesn't support oEmbed, the URLs just gets inserted as-is.

There probably aren't a lot of cases where a user pastes a URL into the editor and actually wants the URL to as-is. Using Discourse today, I noticed they produce a card block (onebox) for non-oEmbed URLs:

screen shot 2017-04-21 at 9 54 20 pm

This would be a great enhancement for Postleaf. As with oEmbed providers, the theme should be able to customize their appearance to match the surrounding content.

Possible candidates to replace the existing oEmbed lib:

Ability to create tags while writing/editing posts

Currently the only way to create new tags is to go to the tags section and create them there.

It would be a big time saver to simply be able to type them into the tags section of the Settings > Metadata panel when writing or editing a post and have them saved that way. Similar to as WordPress...but better...because it's not WordPress :)

gulp build throws some errors

$ gulp build

events.js:154
      throw er; // Unhandled 'error' event
      ^
TypeError: this is not a typed array.
    at Function.from (native)
    at /home/hari/experiments/node/postleaf/node_modules/imagemin-svgo/index.js:25:19
    at optimizeOnceCallback (/home/hari/experiments/node/postleaf/node_modules/svgo/lib/svgo.js:44:17)
    at /home/hari/experiments/node/postleaf/node_modules/svgo/lib/svgo.js:65:9
    at Object.sax.onend (/home/hari/experiments/node/postleaf/node_modules/svgo/lib/svgo/svg2js.js:156:13)
    at emit (/home/hari/experiments/node/postleaf/node_modules/sax/lib/sax.js:640:35)
    at end (/home/hari/experiments/node/postleaf/node_modules/sax/lib/sax.js:683:5)
    at Object.write (/home/hari/experiments/node/postleaf/node_modules/sax/lib/sax.js:991:14)
    at Object.SAXParser.close (/home/hari/experiments/node/postleaf/node_modules/sax/lib/sax.js:157:38)
    at module.exports (/home/hari/experiments/node/postleaf/node_modules/svgo/lib/svgo/svg2js.js:169:28)

Additional info

  • Postleaf version: master
  • Node version: v5.7.1
  • Affected browsers:
  • Operating system: Linux / Ubuntu 16.04

Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org

Locater results not showing up in Safari

This seems more like a Safari bug than a Postleaf bug, but perhaps we can work around it.

When searching on iOS, the locater results don't appear. They're injected into the DOM and toggling random styles in the inspector makes them magically appear, so I suspect this is a display glitch due to the locater's fixed positioning.

I noticed that this seems to happen on desktop Safari as well, but it's more sporadic. Try searching a few times and it will eventually occur.

Improve the editor for iOS

Fixed

  • Page scrolls to the top when hitting enter or using formatting shortcuts, e.g. CMD+B.
  • Selection disappears when interacting with the toolbar
    • This appears to be a standard iOS behavior and is replicable in TinyMCE and CKEditor as well
  • Toolbar sometimes goes offscreen when the virtual keyboard appears
  • Links outside of content regions aren't getting intercepted as expected

Needs Third Party Fix

Make all URLs absolute

At the moment many of the URLs are relative in Postleaf .i.e /themes/empower-theme/css/styles.css

There are some performance improvements by having absolute URLs instead. http://website.com/themes/empower-theme/css/styles.css

Essentially the browser has less work to do to locate files with absolute URLs vs relative URLs.

Use bluebird promises to improve performance

Built in node.js Promises are 4x slower than blue bird, It's better to bring in the package bluebird and add the line js const Promise = require('bluebird');

I can do a PR if you think it's warranted, but it's probably a good idea overall to do it.

Dropdown menu not visible in webkit (Safari)

Summary

Menu on the dropdown menu with the Postleaf cut off in Safari

Steps to Reproduce

  1. Open Safari
  2. Click the Postleaf icon in the admin panel

Additional info

  • Postleaf version: 6a0bee9
  • Node version:
  • Affected browsers: Safari
  • Operating system: macOS
    screen shot 2017-04-20 at 4 58 57 pm

Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org

Errors during install (npm fails)

Summary

NPM faills.
Attached npm errors log
npm-debug.log.zip

Additional info

  • Postleaf version:
  • Node version:
  • Affected browsers:
  • Operating system: Ubuntu 16.04

Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org

PHP was better than NodeJS

Can't even get this to install on a fresh Debian 8 installation.

root@postleaf:/var/www/postleaf# node app.js
Error: Postleaf failed to start! ð
SequelizeUniqueConstraintError: Validation error

Maybe work on better installation guides? The PHP version of PostLeaf was easy to install ... so far pretty disappointed in how the NodeJS version is thus far.

CLI for importing from other platforms

This will probably become its own project, but I'm posting here so people can find it easily. I don't feel like the importer belongs in core for a few reasons:

  • Most people will only import from another platform once.
  • Requests for new platforms are inevitable, and the core shouldn't get bloated by import code for every possible platform.
  • When a new platform is added, we shouldn't have to wait for a core release to be able to use it.

Maybe this can be a plugin down the road. Until then, I'm thinking a CLI will be the most appropriate option.

Here are the platforms users have asked for the most.

  • WordPress
  • Ghost

This MIT-licensed lib might help convert WP exports to a Postleaf-friendly format.

Another option for supportive platforms is a plugin that exports data into a Postleaf-friendly backup file, which would be really easy to create (ZIP with JSON files and uploads).

Documentation

Docs

  • Getting started
  • Installing
  • Updating
  • FAQ

Themes

  • Overview
  • Templates
  • Helpers
  • Filters
  • Globals

API

  • Overview
  • Auth
  • Endpoints

Is there anything else you'd like to see in the docs?

[proposal] Add postinstall to package.json

Summary

Add

"scripts": {
    "postinstall": "gulp build"
},

to package.json to run gulp build after install


Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org

admin-theme does not work

Summary

After installing according to readme, admin-theme does not work, since it can't load the assets/css/lib.css because, it is referenced without the port (3000).

generated markup from http://localhost:3000/admin/posts

  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="icon" href="/assets/images/favicon.png">
  <link rel="apple-touch-icon" href="/assets/images/app_icon.png">
  <link rel="stylesheet" href="http://localhost/assets/css/lib.css">

i exactly followed the readme:

git clone https://github.com/Postleaf/postleaf.git && cd postleaf
git clone https://github.com/Postleaf/empower-theme.git themes/empower-theme
cp .env.example .env
vim .env
npm install
sudo npm install -g gulp-cli
gulp build
node app.js

I just updated the upper part of .env to:

# App
NODE_ENV=production
APP_URL=http://localhost/
APP_PORT=3000

[...]

opened browser, to http://localhost:3000/

It guided me through creating the user (already unstyled). Frontend works fine.

Additional info

  • Postleaf version: latest master (876c264)
  • Node version: v6.10.1
  • Affected browsers: Safari
  • Operating system: macOS Sierra 10.12.5 (not really relevant)

Thank you for your help and good work.

Plugin Support

Hello again,

There's any plan in the roadmap to create a plugin (or app) system so we can extend the functionality of the CMS?

Maybe you can use the project tab to define next ideas 😄

Cheers.

Custom Content Regions

Add support for custom content regions in templates. Super useful for managing content such as sidebars, headers, footers, etc.

Example:

{@region id="sidebar"}
  <p>Default content can go here</p>
{/region}

Wishlist

  • Global regions (shared across many posts)
  • Post regions (unique for each post)
  • Region types: block, heading

Challenges

  • Drag and drop needs to determine target editor
  • Zen Mode will need to be aware of additional editors
  • Toolbar will need to be aware of additional editors
  • Certain toolbar options will be unavailable based on region type
  • Undo/redo logic may be confusing since it's linked to a specific editor, not all of them

Postleaf API

What about publishing a simple api for postleaf for major postleaf functionality?
Perhaps it would fit in as part of #27.

eg.

const postleaf = require("postleaf-api");
const api = postleaf.login("user","pass");
const post = api.post({ title:"Title", content:"This is a post", publish:true});

Postleaf CLI

It would be nice to have a feature similar to Laravel, Symfony, Doctrine, Grav CMS etc. where a user can run commands from the console to perform the following tasks:

Init

postleaf init
Run gulp build and setup db and files/folders required before startup and perhaps walk a user through prompts to set the .env variables. Like Yeoman.

This would also be a good way to auto generate the random hash, similar to how Laravel does it on install.

Package manager

postleaf theme <theme-name>
Install themes e.g. postleaf theme empower

Backup

postleaf backup
Backup/zip the following directories cache, data, themes, uploads

Navigation items could lose order

Just noticed that it may be possible for navigation items to lose order when updating. Those updates need to be performed in series instead of using Promise.all().

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.