A simple command line notebook for programmers

Overview

Dnote

Build Status

Dnote is a simple command line notebook for programmers.

It keeps you focused by providing a way of effortlessly capturing and retrieving information without leaving your terminal. It also offers a seamless multi-device sync and a web interface.

A demo of Dnote command line interface

Installation

On macOS, you can install using Homebrew:

brew tap dnote/dnote
brew install dnote

On Linux or macOS, you can use the installation script:

curl -s https://www.getdnote.com/install | sh

Otherwise, you can download the binary for your platform manually from the releases page.

Server

The quickest way to experience the Dnote server is to use Dnote Cloud.

Or you can install it on your server by using Docker, or using a binary.

Documentation

Please see Dnote wiki for the documentation.

See Also

Issues
  • self-hosted version

    self-hosted version

    Just an idea:

    • allow users to download Dnote server and self-host
    • allow users to download Dnote web app and self-host
    • allow users to configure backup url to point to the self-hosted server
    • continue to provide a hosted option as a paid offering

    question:

    • should the Dnote server and web version be:
      • fully open source
      • an open source community edition with limited features
      • a one time purchase
    • if flat fee, how would the server binary and web app be distributed with proper access control for users who purchased the software?
    • any other ideas?

    IDEA:

    • open source the server for syncing notes
    opened by sungwoncho 14
  • Move configuration to XDG config directory

    Move configuration to XDG config directory

    • Please describe the feature you would like to have. Move Dnote configuration files to the XDG config directory according to the XDG specification.

    • What alternatives have you considered? Add a flag the the dnote command that takes a specified config file. This would allow users to make a dnote alias that passes a config file stored in the XDG base directory.

    • Any additional context Most linux programs these days have moved their configuration to the XDG config directory. Doing this makes managing one's dotfiles easier while maintaining a clean home directory.

    cli feature-request 
    opened by distefam 13
  • Make it possible to use browser extension with selfhosted server

    Make it possible to use browser extension with selfhosted server

    • Please describe the feature you would like to have. Currently there is not way (at least that I have found) to change the server used by the browser extension. It would be nice if it was possible so it can be used with self-hosted servers.
    in-progress 
    opened by kimusan 8
  • Broken colors

    Broken colors

    CLI colors are broken in windows, instead i see this...

      ?[37m•?[0m git ?[33m(1)?[0m
      ?[37m•?[0m linux ?[33m(1)?[0m
      ?[37m•?[0m test ?[33m(1)?[0m
    
    opened by nblackburn 8
  • dnote.io website bug

    dnote.io website bug

    Love the app and the idea. Really considering subscribing or self hosting.

    • project/version (e.g. CLI v0.8.0): n/a
    • operating system: n/a

    Description

    First, the pro subscription signup has a different style than the free source code button. I'm sure this was intentional to put emphasis on the pro signup over the free, but I don't think this you want it to look like this. this

    Second, likely related, when going to inspect it, I noticed the order of pro and free boxes swap places. That maybe be intentional. However, the button no longer shows up in responsive/mobile views to sign up for the pro subscription in the pro box. button no longer shows up button no longer shows up

    I think it's due to the type=button tag on the pro button. Once toggling off, the button shows up again. button shows up again

    <a id="T-unlock-pro-btn" type="button" class="button button-normal button-third button-stretch" href="/app/subscriptions/checkout">Unlock</a>
    

    Steps to reproduce

    1. Sign up for dnote.io
    2. Click "Get Started"
    bug 
    opened by estysdesu 8
  • Proposal for end-to-end encryption

    Proposal for end-to-end encryption

    This is a proposal for end-to-end encryption of notes and books.

    Goal

    • Use AES256 in GCM mode as a symmetric cipher.
    • Server should not have access to the users' secret key for AES256.
    • Despite not having access to the secret key, the server needs to be able to authenticate user.

    Proposal

    1. User enters email and password.
    2. Use PBKDF2 with SHA256 to derive 256 bit secret key, k0. (PBKDF is chosen because it is readily available in Web Crypto API which we need for the web client)
    k0 = pbkdf2(password: password, salt: email, iteration: 10000)
    
    1. Derive another key k1 which is of the same length as k0.
    • how many rounds do we need? Is 1 round sufficient because k0 is pseudo-random anyway?
    k1 = pbkdf2(password: k0, salt: password, iteration: 1)
    
    1. k1 is sent to the server to authenticate the user. k0 is never sent to the server.
    • server hashes k1 using PBKDF2 using 15000 rounds before storing it.
    1. Use AES256 in GCM mode using secret key k0 to encrypt all data before sending to the server.

    Threat model

    • Exhaustive search takes ~ 2^256 steps (Can this number be lower in practice?) Two kinds of attacks:
      • dictionary attack to get k0 from k1
      • brute-force attack to decrypt a given ciphertext with a random key

    Alternative version

    1. User enters email and password
    2. Derive a key using PBKDF2 with SHA512 to derive a 512 bit key from email/password combination..
    k = pbkdf2(password: password, salt: email, iteration: 10000)
    
    1. Split the derived key into two: (k0, k1) = (k[0:255], k[256:511]).
    • k0 is sent to the server to validate the login. The server hashes the payload again using pbkdf2 with 15000 rounds before storing it.
    • k1 is never sent to the server
    1. Use AES256 in GCM mode using the secret key k1 to encrypt all data in the client side before sending it to the server (Benefit over CBC or CTR mode: GCM mode offers ciphertext integrity.)
    • do we need ciphertext integrity or just confidentiality? (probably we need ciphertext integrity?)

    Alternative version 2

    • User enters email and password
    • Derive k <- pbkdf2(password: password, salt: email, alg: 'sha256', iteration: 10000)
    • Derive k0 <- hkdf(alg: 'sha256', secret: k, salt: email, info: 'enc') (used as encryption key)
    • Derive k1 <- hkdf(alg: 'sha256', secret: k, salt: email, info: 'auth') (sent to server for authentication)
    • POST to '/register': (email, k1, kdf_iteration). k0 is not sent to the server.
      • server hashes k1 using PBKDF2 using 15000 rounds before storing it.
    • Use AES256 in GCM mode using the secret key k1 to encrypt all data in the client side before sending it to the server (Benefit over CBC or CTR mode: GCM mode offers ciphertext integrity.)

    Threat model

    • Exhaustive search takes ~ 2^256 steps (Can this number be lower in practice?):
      • brute-forcing to decrypt a given ciphertext

    In both options, the server never learns the secret key used by the client for the symmetric cipher.

    Main question

    • Does hashing the key with pbkdf2 with 1 round before sending it to the server provide any additional security? Doing so, we avoid transmitting plain key to the server. But the communication is already happening between two trusted parties--client and server-- in a secure channel--https-- anyway.
    roadmap 
    opened by sungwoncho 8
  • search

    search

    Should be able to search notes by content (full text search)

    $ dnote search "some content"
    $ dnote search -b js "some content"
    

    IDEA: Use sqlite full text search #84

    opened by sungwoncho 7
  • using the EDITOR environment variable

    using the EDITOR environment variable

    Looking through the source, trying to figure out how to set my editor to nano, I discovered the following method. Is there a reason why it only uses the value in EDITOR if it recognizes it? I can understand special casing certain editors, however I don't see the reasoning behind ignoring EDITOR if it doesn't know it. Most likely the person has either explicitly set EDITOR (as in my case) and has it specially configured, or is used to using whatever the OS has set as the default EDITOR. I think a more useful way of going about this is something similar to:

    func getEditorCommand() string {
    	editor := os.Getenv("EDITOR")
    
    	if editor == "" {
    		return "vim"
    	} else if editor == "atom" {
    		return "atom -w"
    	} else if editor == "subl" {
    		return "subl -n -w"
    	} else if editor == "mate" {
    		return "mate -w"
    	}
    
    	return editor
    }
    

    A minor sidenote: vi is POSIX, whereas vim is not, so vi is more likely to be installed.

    opened by uplime 7
  • License

    License

    I would like to propose a change of license for this project. When Dnote started out as a simple 300-line program about 2 years back, an academic license such as MIT license worked fine. However, now that we have grown to more than 10 contributors, it is essential to move to another permissive or a reciprocal license.

    • I believe that the IP assignment of contribution is important for the long term success of this project. By not creating a complicated chain of ownership, Dnote can stay as a free/libre software while moving fast as a business. For this we could use permissive licenses such as Apache 2.0.
    • I would be more comfortable with the trademark protection and patent clause for Dnote provided by Apache 2.0 to continue evolving Dnote in the years to come with more contributors.
    • We might need a CLA as the number of contributors grows to avoid creating a complicated chain of ownership.
    • As in #139, I plan to open source the server side code and make the whole Dnote system a free/libre software. The server side is going to be licensed under AGPL. And as author of Dnote I truly care about sharing. Therefore I also think that a reciprocal license such as GPLv3 is a good option for CLI.

    Next action

    We have 14 contributors at the moment.

    • What are your thought about this proposal?
    • Would you sign a contributor license agreement (CLA)?

    I have been enjoying maintaining this project for the past two years and and would like it to be a success in the years to come. Your feedback and help will be appreciated.

    @michielboekhoff @klebervirgilio @martaccmoreno @maml @nakabonne @rkuska @apostov @FearNotDaniel @im-kulikov @newyork-anthonyng @liamjack @girish3 @Erwyn

    • Sung
    roadmap 
    opened by sungwoncho 7
  • Sync fails: Note with the same uid already exists

    Sync fails: Note with the same uid already exists

    Syncing worked for a while, now I get the following error message.

    Server error: reducing actions: reducing action add_note: reducing an action: Note with the same uid already exists
    

    How can I recover from that error? What information should I provide to debug the problem?

    opened by havogt 6
  • Bump tmpl from 1.0.4 to 1.0.5 in /jslib

    Bump tmpl from 1.0.4 to 1.0.5 in /jslib

    Bumps tmpl from 1.0.4 to 1.0.5.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • The add command works incorrectly when run for a first time

    The add command works incorrectly when run for a first time

    Environment

    • project (cli, server, browser-extension): cli
    • version: 0.12.0, master
    • operating system: Windows 10

    Description

    A book is not created when run for the first time, although it looks like the note was added.

    Steps to reproduce

    1. ensure that the .dnote folder doesn't exist
    2. issue command dnote add first -c "my first note"
    3. issue command dnote view, nothing is output
    bug 
    opened by lpintes 3
  • Add 2021

    Add 2021

    Update license to include the latest year

    opened by sungwoncho 0
  • Interactive fuzzy searching

    Interactive fuzzy searching

    • Please describe the feature you would like to have. With dnote, editing notes is a two step process for me. I first have to perform a search to get it's ID and then do dnote e <ID>. I think the workflow can be improved if there's an interactive fuzzy search option like the one from fzf. This way I can find and edit stuff in one go.

    Here's a video clip of fzf in action: video

    • What alternatives have you considered? I really can't think of anything else. IDs are neat so any other means of indexing stuff will only complicate things necessarily.

    Thanks for the great work!

    opened by realaravinth 1
  • bug fix

    bug fix

    opened by lingqtan 2
  • Customisable frontend

    Customisable frontend

    • Please describe the feature you would like to have. I'd like to change the logo and colours for the frontend in my self hosted environment. The problem so far is, that everything is combined in one single binary. Maybe separate frontend and backend.

    • What alternatives have you considered? Let us disable the frontend in the binary file with some kind of a flag. So we can fork the code of the frontend and make our adjustments. Provide the backend URL as an environment variable or with a reverse proxy in the docker-compose file.

    • Any additional context Great tool, I love to use it.

    opened by mszkb 3
  • Explore different database change management

    Explore different database change management

    • Please describe the feature you would like to have.

    This is a strange request. As someone unfamiliar with Go, but familiar with databases, I am partial to the idea of using "database tools" to manage "database change management." Rather than bootstrapping that in Go or bash, etc.

    https://sqitch.org/ is such a tool that I wanted to share as an option. It allows moving forwards / backwards in migration history (presuming that you set up "reverse" migration scripts and idempotent changes).

    On the downside, it is a separate tool to learn. On the upside, it is a tool dedicated to database change management and enables some nice features for deploying / reverting database changes in testing.

    • What alternatives have you considered?

    • Any additional context

    My (selfish) main thought process here is to make the database change model a bit more accessible to non-go users, and less "risky" if someone wants to contribute to database changes by enabling testing / etc. of forward / reversions of database change history.

    feature-request 
    opened by colearendt 0
  • add emoji support to dnote

    add emoji support to dnote

    • Please describe the feature you would like to have.

    It would be nice to present emojis :smile:, :sad:, :sob:, etc. in dnote server (or - extra credit - in the CLI with iterm2) much like github does.

    • What alternatives have you considered?

    N/A

    • Any additional context
    feature-request 
    opened by colearendt 1
  • Social / enterprise login

    Social / enterprise login

    • Please describe the feature you would like to have.

    Allow social login (Google, GitHub, etc.) or plugin options (i.e. OAuth2, SAML?) to dnote server so easier to share / integrate with others and onboard them into dnote. Related to #427

    • What alternatives have you considered?

    N/A

    • Any additional context

    I love the idea of a shared knowledge base, and shared spaced repetition.

    feature-request 
    opened by colearendt 2
  • Configurable / templatized search output

    Configurable / templatized search output

    • Please describe the feature you would like to have.

    Related to #415 and #491

    I think certain search output would be nice if it were more customizable / configurable.

    For instance, if I have a convention to make the first line of my note the "title" for a given book, it would be nice to always include the title in my search output.

    Other times, I trust my search and would love to be thrown into a PAGER where all note content is appended together (perhaps with some clear markdown delimiters / etc.) so I can continue searching / read full context / etc.

    In other cases, I might want to sort by "note create date," "last updated," or other fields that are generally not available in the CLI / UX.

    • What alternatives have you considered?

    None really.

    • Any additional context

    Current workflow:

    • dnote find sometopic
    • Try to guess based on context clues which note is the one I want
    • dnote view number

    Proposed:

    • dnote find sometopic
    • done (depends a bit on user customization)
    feature-request 
    opened by colearendt 2
Releases(cli-v0.12.0)
Owner
Dnote
A simple command line notebook for programmers
Dnote
🎓 Introduction to GraphQL + React + Java + Astra DB

?? Introduction to GraphQL + React + Java + Astra DB

DataStax Developers 68 Oct 7, 2021
Clone project of a famous Q/A website for developers which is stackoverflow built using MySQL-Express-React-Node :globe_with_meridians:

StackOverflowClone As the name suggests, this project is a clone of a famous Q/A website for professional and enthusiast programmers built solely by m

Mayank Aggarwal 303 Oct 12, 2021
A Pokémon Themed Note Taking App Made with ReactJs.

Poket Book Who doesn't need a good note taking app, especially if it is Pokémon Themed! This cute little Poket Book allows you to add/delete/edit/view

Christine Coomans 9 Sep 23, 2021
kbar is a simple plug-n-play React component to add a fast, portable, and extensible command+k interface to your site.

kbar is a simple plug-n-play React component to add a fast, portable, and extensible command+k interface to your site.

Tim 1.1k Oct 13, 2021
A Math Magicians Calculator built with React.

Math Magicians Calculator This is a Calculator I built with React employing hooks and best practices, such as lift state, destructuring, and passing p

Arturo Alvarez 3 Aug 23, 2021
Vercel 37k Oct 14, 2021
Kutt is a modern URL shortener with support for custom domains. Shorten URLs, manage your links and view the click rate statistics.

Kutt is a modern URL shortener with support for custom domains. Shorten URLs, manage your links and view the click rate statistics.

The Devs 5.3k Oct 13, 2021
This simple CRUD project (Demo) is developed with React (TypeScript) and SpringBoot REST API (REST Controller).

This simple CRUD project (Demo) is developed with React (TypeScript) and SpringBoot REST API (REST Controller).

Mohammed Firass 15 Oct 13, 2021
Node.js and mongoDB Google Drive Clone

MyDrive MyDrive is an Open Source cloud file storage server (Similar To Google Drive). Host myDrive on your own server or trusted platform and then ac

null 2.5k Oct 14, 2021
👻 A SnapChat clone built with React, Redux and Typescript. Styled with SASS. Tested with Cypress, Jest and Enzyme. Linted with Eslint and formatted with Prettier!

?? SnapChat Clone [LIVE APP] [Live App] • [Video Demo] ⚡️ Breakdown Built with React Only functional components using hooks Folder structure: Flat - n

null 835 Oct 1, 2021
This is a basic file explorer built with NodeJS and React featuring an efficient real-time file watcher.

Simple File Explorer This is a basic file explorer built with NodeJS and React featuring an efficient real-time file watcher. Running Local Demo git c

Slava Knyazev 1 Oct 16, 2021
Build a Full Stack Marketplace on Ethereum with React, Solidity, Hardhat, and Ethers.js

Building a Digital Marketplace on Ethereum The technologies used in this workshop are React, Next.js, Tailwind CSS, HardHat, Solidity, and Ethers. Get

Nader Dabit 50 Oct 19, 2021
FullStack app workshop with distributed monitoring

FullStack app workshop with distributed monitoring

Dalibor Kundrat 74 Oct 11, 2021
React & Redux project - Space Travelers' Hub.

React & Redux project - Space Travelers' Hub.

Nelsino Francisco 5 Oct 8, 2021
This is my React capstone project to handle the Stock API using Redux store.

React Capstone Project: Stock API ?? For this repository, I've been working on the React Capstone Project to create a React app using Redux, the main

Dante Alonso 3 Oct 18, 2021
A simple calculator built with ReactJs. The purpose is to use React Class Component without hooks in order to get familiar with legacy code.

Simple Calculator This is a simple calculator built with ReactJs. The purpose is to use React Class Component without hooks in order to get familiar w

Emanuel Okello 7 Aug 8, 2021
React's cross-platform UI for Web and Native (Android, iOs)

React Universal UI Cross-platform (React Native and Web Browser) React, React Native's UI components to re-use everywhere. Platforms Native platforms:

cloudle 106 Jun 23, 2021
A Netflix Clone built using React GraphQL and DataStax, exploring Pagination and Slicing

?? Netflix Clone using DataStax and GraphQL This project was bootstrapped with Create React App. Table of content Prerequisites Create Astra Instance

Ania Kubow 40 Oct 13, 2021
React, Next.js, MaterialUI, Styled-Components, TypeGraphQL, URQL, ApolloServer (express), TypeORM, PostgreSQL, Node.js, TypeScript

This repo is inspired by https://github.com/benawad/lireddit Features Include: Server-side rendered data from postgres Create user graphql mutation wi

Brayden Werner 165 Oct 10, 2021