Giter Site home page Giter Site logo

mikescher / alephnote Goto Github PK

View Code? Open in Web Editor NEW
192.0 14.0 20.0 4.44 MB

Lightweight note taking client for Simplenote or Standard Notes (or simply local storage)

Home Page: https://mikescher.github.io/AlephNote/

License: MIT License

C# 99.87% Batchfile 0.07% PowerShell 0.05% Makefile 0.01%
notes note simplenote nextcloud sync wpf desktop portable standalone standardfile

alephnote's People

Contributors

arty2 avatar dependabot[bot] avatar mikescher 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

alephnote's Issues

Disconnection notice error (repeat)

Setup: Win10x64, AlephNote 1.6.11 (Note that I'd retest this with the latest version but I tried it on a variety of networks and retesting would take time.)

Steps:

  1. Setup Simplenote sync
  2. Disconnect or connect to network that doesn't allow access to Simplenote sync.
  3. Run sync

Defect: large error message explaining that the service is unable to connect.

image

Workaround: enable only manual sync operations, but even this doesn't prevent the "syncronization failed" message that pops up in the corner.

Requested behavior:

I'm frequently either offline or on a VPN service that doesn't allow access to a host of tools and software, some sort of disconnection icon at the bottom of the AlephNote program window is all that's necessary. The error message prompts are initially helpful (certainly the first one) but a check box on the window "do no show again" would be ideal.

Thanks!

Tag list

Is it possible to have a list of all tags, and filter the notes for a selected tag?
Optimal would be the opportunity to select more than one tag, and filter the notes containing all of them (AND), or one of them (OR)

Github Wiki

A github wiki would be nice

Topics:

  • Initial set up
  • Setup local git backup
  • Change hotkeys
  • Change (+ download) themes
  • Directory/folder mode
  • Theme editor (--debug)
  • Plugin development (basics)

Main window doesn't show on High-DPI

Hi

I just downloaded AlephNote on my MacBook Pro Retina running Windows 10 1607 (Enterprise LTSB) with 200% DPI-setting. When I start AlephNote, I can see first-time configuration window, but the main window doesn't show up. I see the main window on the taskbar hovering, but clicking and key shortcuts can't make it to open. If I set DPI to 100%, it works instantly.

Thanks

New Note from Clipboard

I would like to suggest a new feature- 'New Note from Clipboard'- it creates a new note from the contents of the clipboard and it is activated in 3 ways- from 'File' menu, via a shortcut key and from tray menu.This feature would be handy when the user has copied a text snippet while AlephNote is minimized to tray and creates a new note from tray menu- this command restores AlephNote and sends the text from clipboard into a new note.

Some errors while importing from SimpleNote

Hello,

I got several errors trying to syncronize the notes from SimpleNote:

  • most errors are "System.Exception: Serialization failed"
  • I got also a "System.InvalidOperationException: Cannot set Owner property to a Window that has been closed." on closing

Please find attached all the log files

AlephNote.zip

Readonly mode

Quickswitch (in menubar or so?) to switc to readonly mode
-> can't edit notes
-> can't create notes
-> change list-notes by clikcing (?)

Dynamic Note Sorting

Suggestion
When a new note is created it will be sorted according to chosen note sorting criteria after program restart. I suggest dynamic note sorting- the newly created note is automatically sorted in the notes panel according to chosen note sorting criteria without the need to restart AlephNote.

Note
If this suggestion requires too much effort and work feel free to close this issue.

URL display problem

Crash on launch

Setup Win7x86

  1. Download, extract, and launch AlephNote.exe

Defect:

image

starting error

System.IO.FileLoadException: Could not load file or assembly 'EvernotePlugin, Version=0.0.0.8, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
File name: 'EvernotePlugin, Version=0.0.0.8, Culture=neutral, PublicKeyToken=null' ---> System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
   at AlephNote.Impl.PluginManager.LoadPluginsFromAssembly(String path)
   at AlephNote.Impl.PluginManager.LoadPlugins(String baseDirectory)

can you help

Thanks

On Top + Drag&Drop

Suggestion
I would like to suggest a couple of features which would work nicely together:

  • 'On Top' option activated via a shortcut key (perhaps 'CTRL+T');
  • 'Drag&Drop' for selected text;

Usage
With 'On Top' activated the user selects a text snippet from a text editor/browser/mail client, etc and drops it onto a note inside AlephNote.

Advantage
'Drag&Drop' is faster than 'Copy/Paste'.

Note
It is possible to activate 'On Top' via a shortcut key ('CTRL+T' is a standard key combination for this option) or via a command 'On Top in 'Edit' menu (because there is no 'View' menu).

For programs which do not support 'On Top' I use an external tool (SmartSystemMenu) but native support would be better.

Feature request: save to local TXT files

Primary request

I like editing files locally in Notepad++ and then using the (badly out of date) Resophnotes to sync the notes with the SimpleNote server. Is there a way to save the notes as simple text files?

Secondary request

Ability to use files saved somewhere on the drive not in the local folder. This is much lower priority than the above item.

Insert Date and Time

I would like to suggest a new command- 'Insert Date&Time' available either from 'Edit' menu or from context menu or via a shortcut key. It would be useful with diary-like notes when the user wants to put down the exact date and time below an idea/remark/thought.

Server Address Error

Hello,
I got an error trying to syncronize the notes from Nextcloud:

AlephNote.PluginInterface.Exceptions.RestStatuscodeException: Server htpc.liubaolin.cn returned status code: 404 : Not Found
   at AlephNote.Common.Network.SimpleJsonRest.GenericDownload[TResult](String path, HttpMethod method, Int32[] allowedStatusCodes, String[] parameter)
   at AlephNote.Common.Network.SimpleJsonRest.Get[TResult](String path, Int32[] allowedStatusCodes, String[] parameter)
   at AlephNote.Common.Network.SimpleJsonRest.Get[TResult](String path, String[] parameter)
   at AlephNote.Plugins.Nextcloud.NextcloudAPI.ListNotes(ISimpleJsonRest web)
   at AlephNote.Plugins.Nextcloud.NextcloudConnection.StartSync(IRemoteStorageSyncPersistance data, List`1 localnotes, List`1 localdeletednotes)
   at AlephNote.Common.Repository.SynchronizationThread.DoSync()

But my server address is https://htpc.liubaolin.cn/nextcloud

Option to show only root notes

Can you add an option to view only notes which don't belong to any folder? It could be useful when sorting notes for the first time, and maybe in some other cases.

Long URLs not detected

AlephNote (as of version 1.6.10) does not detect certain long URLs- usually search ones, see screens below:

AlephNote
snipaste-2018-03-23_012642

ResophNotes
snipaste-2018-03-23_012741

Such URLs are detected by almost any text editor which supports URL detection (including Scintilla-based Notepad3).

Example URLs:
URL1
URL2

Weird focus glitch in folder view

Sometimes when you edit a note that is not on top of the list the first edit will be accepted but after that nothing is selected.

  • Folder mode is on.
  • Only happens sometimes (but still frequently)
  • Only for notes not on top of listview (?)

Use 0.0.2 StandardNote API

"Unpinned" note editing is very slow

Unfortunately, I am currently having some problems in the SimpleNote account with notes that are "unpinned": The input of the letters takes a unreasonably long time. This problem does not occur with pinned notes. If all notes are "unpinned", the problem does not occur.

Documentation: Account management

A quick HOWTO that I put together that might be something you can toss into an intro file or something. I only had real difficulty figuring out the first one.

Create a new account

  1. From the Edit menu, select Settings
  2. Click the"+" symbol at top-right of screen
  3. Choose the connection of your choice (Filesystem, No remote, Nextcloud notes, Simplenote, Standard 4. Notes"
  4. Enter in login and password data
  5. Click OK

Switch account

  1. From the Edit menu, select Settings
  2. Click the"+" symbol at top-right of screen
  3. From the Active Account dropdown menu, select an account you have setup
  4. Click OK

Remove account

  1. Follow the items from "Switch Account" process above
  2. Select the Remove button
  3. Click OK

[Low priority] Feature request: secure note storage

I wonder if it's possible to setup the program to treat the remote note storage as untrusted to have notes appear locally as normal but save to a remote server as encrypted? I realize this may be out of scope for the program's objectives, but it's something that I've been thinking about a lot lately as some of my data saved to SimpleNote is fairly personal.

Possible resolution

  • A standardized text encryption system like GPG seems ideal since it would enable decryption at different end-points. However, I don't get the sense that is easy to implement. I just base that on the way that program is only rarely integrated with other programs in anything other than a secure email tool. It also almost always requires GPG program installation, which isn't nicely self-contained like AlephNote.

  • Something akin to the NppCrypt or SecurePad plugins for Notepad++

AlephNote doesn't start

When I click the executable the application shows an error for every dll file in the plugins directory here is an example: (Only plugin name and version changes other than that all the errors for plugins are the same)

System.IO.FileLoadException: 'SimpleNotePlugin, Version=1.0.2.0, Culture=neutral, PublicKeyToken=null' dosyasını veya derlemesini ya da bağımlılıklarından birini yükleyemedi. İşlem desteklenmiyor. (HRESULT özel durum döndürdü: 0x80131515)
Dosya adı: 'SimpleNotePlugin, Version=1.0.2.0, Culture=neutral, PublicKeyToken=null' ---> System.NotSupportedException: Bir derleme, önceki .NET Framework sürümlerinde korumalı alana alınmasına neden olacak bir ağ konumundan yüklenmeye çalışıldı. Bu .NET Framework sürümü CAS ilkesini varsayılan olarak etkinleştirmez, bu nedenle söz konusu yükleme tehlikeli olabilir. Bu yüklemenin derlemeyi korumalı alana alması amaçlanmıyorsa, lütfen loadFromRemoteSources anahtarını etkinleştirin. Daha fazla bilgi için bkz. http://go.microsoft.com/fwlink/?LinkId=155569.
   konum: System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   konum: System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   konum: System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   konum: System.Reflection.Assembly.Load(AssemblyName assemblyRef)
   konum: AlephNote.Plugins.PluginManager.LoadPluginsFromAssembly(String path)
   konum: AlephNote.Plugins.PluginManager.LoadPlugins()

After this, it shows an error for "noteapp.config" file that couldn't find in the directory of Alephnote:

System.InvalidOperationException: Sıra hiçbir öğe içermiyor
   konum: System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   konum: AlephNote.Plugins.PluginManager.GetDefaultPlugin()
   konum: AlephNote.Settings.AppSettings.CreateEmpty()
   konum: AlephNote.WPF.Windows.MainWindow..ctor()

After I click OK it shows this and it doesn't start.

System.Windows.Markup.XamlParseException: Belirtilen bağlama kısıtlamalarıyla eşleşen 'AlephNote.WPF.Windows.MainWindow' türündeki oluşturucuyu çağırma işlemi özel durum döndürdü.
    ---> System.InvalidOperationException: Sıra hiçbir öğe içermiyor
   konum: System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   konum: AlephNote.Plugins.PluginManager.GetDefaultPlugin()
   konum: AlephNote.Settings.AppSettings.CreateEmpty()
   konum: AlephNote.WPF.Windows.MainWindow..ctor()
   --- İç özel durum yığını izlemesinin sonu ---
   konum: System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   konum: System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   konum: System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   konum: System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
   konum: System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
   konum: System.Windows.Application.DoStartup()
   konum: System.Windows.Application.<.ctor>b__1_0(Object unused)
   konum: System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   konum: System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

AlephNote is not syncing with Simplenote

Hi, I just downloaded your app and setup my Simplenote login information, but AlephNote is not populating with my simplenote notes.

I attached a screenshot of logging window. Any idea how I can fix this?
untitled

Quick Account Switcher

Hi Mike,
thnaks for this nice lightweight programm!!

I would be perfect, to have a quick account switcher, maybe above the note title section? I use SimpleNote with the family and StanardNote for personal notes (SimpleNote sharing is nice for the family).
Best,

PS: will there be support for the SimpleNote sticky function to stick priority notes to the top?

URL Detection

I think that it would be extremely handy and useful not only for me if AlephNote is able to detect URLs and these URLs are clickable (Double Click or CTRL+Click).

If detection and opening of links in default browser is implemented AlephNote may become the spiritual successor of seemingly abandoned ResophNotes.

Off-topic
I am glad that AlephNote is portable by design (data and settings saved in program folder).
Keep the good work, your program seems to be very promising!

[Feature request] Natural Sort Order

When using the current Note Sorting -> Title
You get:
1
10
11
...
2
20
21
...
3
30
31
...

Which is more often than not undesirable for notes or writing projects.
As for example when drafting a book you don't want Chapter 10 to show up before Chapter 2.

While saving to a local .txt, [ and ] are saved as _

OK, i'm what you would call a Noob if it's about Bug reporting.

Windows 10, AlephNote 1.6.16, Active account is "Filesystem", UTF-8

I wrote myself some Notes to do after a new Windows 10, Linux and Android installation and those textfiles contain [ and ] in the title. It's fine if i don't do anything but if i edit a Note and save it via Synchronize, AlephNote changes [ and ] to _

For example:

[Windows 10][Registry] Ordner im Arbeitsplatz

is saved as

_Windows 10__Registry_ Ordner im Arbeitsplatz

Import Note

I would like to suggest a simple enhancement- an option to import notes from text (.txt) files.

Implementation
File - new command - Import Note - browse to a folder and choose a text file to be imported - the name of the text file is used as a name for the imported note.

Advantage
The users would not need to open text files and copy their contents to add them as new notes.

Note
If you think that it would require too much work to implement this feature please feel free to discard my suggestion and close the issue.

Remember Page Scroll

Suggestion
I would like to suggest a new option - 'Remember Page Scroll' (perhaps in 'Settings' - 'View' - 'Remember Page Scroll')- if enabled, notes would open exactly where they were left.

Example
The user creates note 'X', works on it, then creates note 'Y', works on it and on switching back to note 'X' it would automatically scroll to where note was left.

Advantage
'Remember Page Scroll' would save scrolling time.

Note
'Remember Page Scroll' should work after program restart.

Error message after saving settings with new folder structure

System.NullReferenceException: Object reference not set to an instance of an object.
   at AlephNote.WPF.Controls.NotesViewHierachical.OnSelectedFolderPathChanged()
   at AlephNote.WPF.Controls.NotesViewHierachical.<>c.<.cctor>b__84_3(DependencyObject obj, DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue)
   at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.Activate(Object item)
   at System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt)
   at System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)
   at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
   at MS.Internal.Data.DataBindEngine.Run(Object arg)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

Option [autofocus edit]

Option to do not auto-focus edit control
(annoying with not selecting by char)

( see issue #11 by smaragdus )

Adding Linux client

In this HN thread the possibilities of a linux client were discussed. Probably with Gtk#.

This issue shall be a progress list for this:

Preperation

  • Remove CSharpUtils class, copy used methods/classes directly to project
  • Seperate logic and presentation in two seperate projects
  • Plugins and other common projects should target .Net Standard

Implementation

  • Addd GTK# project
    • It would be nice to reuse all the OnPropertyChanged logic in it, because currently the plugins communicate through it with the UI.
  • Probably fix Auto Updater

Thoughts / Contributions welcome :D

ALT key functionality (low priority)

Current behavior: Pressing ALT has no effect

Requested behavior: Standard Windows UI program dictates that pressing ALT enables the Menu system. So for example you could press ALT, then F, then E to Export a note.

I list this as low priority as it's far from critical. I just like this capability, the program is more than effective and useful without it.

You cannot drag text in scintilla control

You cannot drag text around in scintilla control to move it

You cannot drag text from another application into the control

(it works in Notepad++, so scintilla should support it)

Notes Navigation

I would like to suggest a tiny enhancement which would be useful especially when there is a huge number of notes. Selecting a note in the note panel takes the focus from the note itself and when the user types a letter, for example 'N', AlephNote switches to the next note which begins with 'N', when the user types 'T' AlephNote switches to the next note beginning with 'T' and so on. This feature would facilitate the navigation inside note panel.

Save as text files

Feel free to decline this, but it's a feature I was fond of using with so I could easily open my notes in Notepad++ and other programs to occasionally do more advanced text operations without a manual copy-paste function.


Current behavior: AlephNote appears to save things to encoded XML files rather than a database.

Requested behavior: as with similar but a similar program ResophNotes (no longer updated, kinda buggy) had an optional feature to save notes as local TXT files rather than as a database.

image

[Feature request] Conflict resolution: ask each time

(Since my "crash on launch" post was an easy fix, decided to suggest something useful instead.)

This is not high priority.

Current behavior: When I have a note that's different from the server, the options are:

image

Requested behavior: upon conflict discovery, prompt user for action. Possible question structure:

"There has been a conflict between a note in AlephNote and the synchronizing server enabled in settings." Options:

A. Take no action, display this prompt again on program restart
B. Use client version (upload and overwrite remotely)
C. Use server version (download and overwrite locally)
D. Use server version and generate backup file (note title - date-and-time.txt

Always adds blank line in 2nd line in SimpleNote

Hi,

Wow, your support is awesome (Quick Service Switcher and the Sync Hotkey)!! :-)

I recognized a minor bug (?):

AlephNote always adds a blank line in the 2nd line of all simplenote notes. This is not shown in Alephnote but in Simplenote itself. Deleting the blank line in SimpleNote doesn't help since AlephNote adds it again after editing a note.

Best

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.