base on The note taking app that doesn't suck [![CI](https://github.com/koffeinfrei/unnote/actions/workflows/ci.yml/badge.svg)](https://github.com/panter/unnote/actions/workflows/ci.yml)
[![Code Climate](https://codeclimate.com/github/codeclimate/codeclimate/badges/gpa.svg)](https://codeclimate.com/github/panter/mykonote)
[![codebeat badge](https://codebeat.co/badges/6f0e1968-b451-4cb9-84d9-9cc49c68e64f)](https://codebeat.co/projects/github-com-panter-mykonote-main)
# unnote
Formerly known as Mykonote.
**Full / Desktop**
![desktop](screenshot_desktop.png)
**Mobile / PWA**
<p>
<img src="screenshot_mobile_1.png" alt="mobile note" width="49%" />
<img src="screenshot_mobile_2.png" alt="mobile list" width="49%" />
</p>
The note taking app that doesn't suck. Made under the Mykonian sun.
The goal of this project is to provide a solid note taking app with just the
core functionality. There won't be any fancy unnecessary features such as a
chat. It basically meets the one requirement: Taking and managing private
notes.
What unnote offers:
* A [solid richtext editor](http://quilljs.com/) which works properly without
ruining the formatting
* [Task lists](https://github.com/koffeinfrei/quill-task-list) (aka. todo
lists)
* PWA, so it can be installed as an app on any mobile device
* Support for the "share to" functionality of mobile phones. Pretty much any
image or text based content can be shared to unnote.
* Autosave
* Permanent edit mode. There's no switching between read and edit mode. Just
edit, always.
* Pseudo offline support, so you don't lose data when the connection is bad or even
missing. The next time the internet is up again your edits will be synced to
the server.
* A simple and fast user experience
* An always available and easy to use search
* A donkey logo
* [Free and open source software](https://www.gnu.org/philosophy/free-sw.html).
There is no [vendor lock-in](https://en.wikipedia.org/wiki/Vendor_lock-in)
and there will never be any weird business going on with your data.
## Development setup
To get the application started the standard rails setup routine can be
executed.
```bash
$ bin/setup
```
You can now start the application and give it a try at
[localhost:3000](http://localhost:3000).
There's a demo user `
[email protected]` with the password `asdfasdf`.
```bash
$ bin/dev
```
### Testing
For the capybara e2e tests headless firefox / geckodriver is used.
- [Download latest firefox beta](https://www.mozilla.org/en-US/firefox/channel/desktop/)
- [Download latest geckodriver](https://github.com/mozilla/geckodriver/releases/latest)
- Put both binaries in your `$PATH`
Make sure to build the client before running RSpec.
```bash
$ bundle exec rake client:build_and_deploy
$ bundle exec rspec spec
```
### Releases (Versioning / Changelog)
[Semantic Versioning](https://semver.org/) is used, obviously.
There's a script that bumps the version, generates the changelog entry and
creates a corresponding git commit / tag.
```bash
# bump the major version, e.g. from 1.2.0 to 2.0.0
$ bin/version bump:major
# bump the minor version, e.g. from 1.2.0 to 1.3.0
$ bin/version bump:minor
# bump the patch version, e.g. from 1.2.0 to 1.2.1
$ bin/version bump:patch
```
#### Changelog
For generating the changelog
[lerna-changelog](https://github.com/lerna/lerna-changelog) is used.
To set this up locally you'll need to create the file
`.lerna-changelog-github-token` containing a GitHub access token (with just the
`public_repo` scope).
## Links
- [Homepage www.unnote.com](https://www.unnote.com)
- [Web app at app.unnote.com](https://app.unnote.com)
## License
Copyright 2016 Alexis Reigel <
[email protected]>
Copyright 2016 Panter AG <
[email protected]>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
", Assign "at most 3 tags" to the expected json: {"id":"2369","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"