Technical Changelog

Improvements to spaced-repetition screens

- Adding Notes header to spaced-repetition screens
- Using textarea that expand (#133)
- Input boxes for Add note span the width of the screen
- Clearer second action buton to return to View all notes (#222)
- On mobile you can tap to flip between note / flashcard on remind screen
PR 555 Commit 4bab553
- Moved changelog into hugo/assets/data
- Updated .gitignore
- Updated exclude list for syncing content via rsync
PR 553 Commit be85bc1
- Updated hugo to v0.124.0
- Moved all data into assets/data and using resources.Get (hugo)
- Static site generation is allowed to request more memory (#551, #455)
- Removing content from static site generation once built.

Resolves #551, #455
PR 552 Commit b4287e5
- Frontend support for pricing.html
- Only allow purchase of tier if not already in the userInfo tiers
- Running production on 1 pod for now
- Openapi updated for userInfo response to include tiers
- Patching tierInfo is now an object user.EventUserPreferencePatchTierInfo

Resolves #437
PR 502 Commit 076a719
Tidying the garden

- Using echo helper for testing endpionts
- Removing uuid.User
- Internally using UserUUID as a string

Resolves #532 and #507
PR 538 Commit 9cfbca4
Rebuild user info from the monolog
PR 537 Commit 63d0d68
Fixed No time crashes srs activty listener (#533)

Resolves #533
PR 534 Commit f9a16bb
- When purchasing a tier, the tier is added to the user info and the system is tier aware, for different functionality within the product
- Resolves Move all writing to userPreferences to event handler #515
- Fixes issues in rebuild handler crashing everytime we go in realtime
- Resolves SetDailySettings is missing service test #416
- Resolves On save display_name trigger an event in user_info PATCH #182
- Resolves Move from Unix to UnixMilli #520
- Resolves Replace funk.Contains( to use slices.Contains where possible #518
- Replacing string grant for ActionGrant
- Sent Correction events for missing display name change events
- Sent correction events for deleting users
- Reducing ingress looks up for shared domains when checking expiring ssl certificates
- Updated to go 1.21 and fixed code changes
- Updated dockerfile to alpine3.19
- Updated sqlite 3.45
PR 516 Commit 6dfd66a
- Usage stats add to userinfo endpoint. Will be used when we bring tiers online, it will help track free tier and when to trigger upgrade paths.
- Moved all tests to use ginkgo/v2.
- Improved testing of raw events with in memory sqlite and nats KeyValue
PR 509 Commit fe813f1
Improvements to user experience

- Add overtime allows the user to interact now
- Via a list, practice typing now works
- Better SEO on Integrated Read Write Repeat
- Changed a few more sentences referencing entry to reference note instead

Resolves #503
PR 504 Commit ad7c8c5
- Changed the frontpage to focus more on Notes and tools #487
- Added Mission statement (#473)
- Content can have custom h1 tag to help explain the page / screen / value.
- Content can customise metadata fields keywords, description and robot.
- Learnalist Notes replaces the "brain + muscle" and we use the logo from the app "Add Remind Repeat". 
- Toolbox overview page #486 
- Adding a list to Notes, has better support for adding per row. 
- Improved UX on tool "Read Write Repeat - integrated" (/toolbox/read-write-repeat-v2.html)
PR 492 Commit 5e8c427
Fixes issue where accessing jetstream.KeyValue store did not fail fatally when an error occurred, affecting main api and spaced repetition activity service.

Resolves #500.
PR 501 Commit 4456814
Improvements to payment + documentation

- Payment includes the same metadata in payment_intent as found in checkout session.  
- Improved developer documentation around working with slideshow creation locally.
- Experimental code to listen to changes to srs or lists and store the latest version in kv
PR 497 Commit 39e38e6
Adding tier concept to payments

- Added database debugging to the monitoring document
- New payment endpoint "/payments/tier/{tier}/stripedata " that given a tier returns prices
- Testing against sqlite now uses sqlite_master to clear up tables
- Upgraded stripe library to 76
- Webhook endpoint for stripe is specific now /payments/webhooks/stripe

Resolves #493
PR 494 Commit 61bfcd3
- Adding robots.txt
- Redirecting, and to
- All http redirected to https
- Moving from 308 to 301 to tame the robots when interacting with unjumble page

Resovles #489
PR 490 Commit d8cead2
- New endpont /spaced-repetition/stats/:uuid to provide stats related to interacting with spaced repetition
- Fixed issue where daily reminder was broken once daylight savings has finished.
- When a FCM token is no longer valid, event.MobileDeviceRemove event is triggered.
- Upgraded Nats to 2.10.1 and using creds on all services
- Upgraded Stan to 0.25.5
- Upgraded to golang 1.21
- Upgraded hugo to 0.119
- Upgraded sqlite to 3.43.1
- Upgraded openapitools/openapi-generator-cli to 7.1.0-SNAPSHOT
- Using golang slices for Contains
- NewEchoHTTPServer encapsulates server setup, making it slightly easier to reuse
- Moved from ioutil.ReadAll to io.ReadAll
PR 477 Commit 14ab9f0
When fcm token is expired or not valid, it only removes the mobile device with that token.

Resolves #475
PR 478 Commit ff0d0ac
Spaced Repetition Remind screen
- On flip, show the meaning
- "Practice Typing": Adding a button to give the user the ability to practice typing as a form of active learning, via practice and repetition 

Resolves #471
PR 472 Commit 4eaf1eb
- Removing login_redirect from the query string

Toolbox Plank Stats V2
- If logged in and plank stats shared, will show the link to share with people (#452)
- Stats Summary stands out more with a sublte background

- Fixed bug: If the user is logged in, the plank share settings will be used (#451)

Fixes #451, #452.
Removes the need for #464.
PR 470 Commit ccd5a59
Toolbox Read Write Repeat
Touching the screen when in typing mode will trigger the keyboard to appear on a mobile browser
PR 469 Commit 8ee150a
# What
- Metrics-server is now under kustomize (restarting k3s seems to bring back an older version)
- textarea + input now have a border again

Static Site
- compling refers to css not the framework

On spaced repetition overview
- you are now able to play unjumble from any item
- when deleting an entry, you will be asked to confirm
- viewing the json is now reachable by clicking a button
- you are able to practice typing from any item via Read Write Repeat

Toolbox Read Write Repeat
- The typing experince is better
- Typing works on mobile for both v1 and v2
- Accepts a query parameter practice to start typing

Toolbox Unjumble
- Pretty urls now redirect to /intro if not valid on the server side. Should fix issues with bots endlessly crawling the page
PR 468 Commit adf2bee
- Using tailwind for css
- Simplified css integration into hugo
PR 456 Commit 1557690
- Moving to openapi lib generated via javascript
- Using esbuild to build js + css for everything except the browser import and play
- tools.json comes from make-toolbox
- make-toolbox is source of truth for all spa and shared javascript.
- Moved from getApiServer -> getServer
- Using tailwind on the link component, to show it is possible
PR 445 Commit ea5cf5a
- On /toolbox/read-write-repeat-v2.html, link to the list being practiced
- Removed web component for the interact-menu, it is now part of the list type / kind entry file
- Removed interact menu from hugo
PR 438 Commit 2f9c9f8
- Export slideshow as a pdf, list kind v7
- Export slideshow as a video, list kind v8
- Fix getting user by token, if not found return not found
- Remove unused eventlogPubSubListener from event
- End to End tests support tls insecure
- Fix end to end log per, crashed if Do error'd
- Generating openapi yaml flie now uses docker
- System created list will silently fail if list fails to validate
- Moved a few things from the old k8s folder over into the kustomize base or production
- Updated go.mod

Resolves #406
PR 407 Commit 3339b4a
- e2e tests run much better against a cluster now
- GetUserUUIDByToken returns not found if record missing
- TriggeredBy is using const
- Replace ioutil -> io or os
- Static-site is its own deployment
- Static-site is using a queuedSubscriber now
- Static-site will trigger a hugo rebuild ever x milliseconds, disconnecting the writing of new records and building the site
- Removing ingress for
- Assets have their own endpoint to set max body
- Mimetype detection using lib as mp4 was not getting picked up
PR 417 Commit 86d63b8
- Updated golang to 1.20
- Updated go packages
- Updated alpine to 3.17
- Updated nats-streaming to 0.25.3
- Improved docs on end-to-end testing
PR 414 Commit f9bb17d
Updated to 2.21.6.
From 2.14.0.
PR 411 Commit 7df05cf
Better handling of when to dripfeed the next item in the list. The system is now aware of what item needs to be interacted with before triggering a new item to be added. This will result in not being fed too many new entries at once.
PR 396 Commit c305d64
Decoupling the sql update from the code #396.
PR 403 Commit 2d9a1c0
- Frontend is using openapi with v4, for now
- Added kind when we create a list
- Added feedback on delete or reset spaced repetition item
PR 402 Commit 37836f0
Adding spaced repetition entry via dripfeed now sets created to be based on when the event happened.
Resolves #398.
PR 399 Commit 33799d2
- Linking from "My lists" ( to Spaced repetition (
- Able to delete an entry on
- Able to reset an entry for learning on
- List kind v2 now has a link to unjumble if interact is enabled
PR 397 Commit d4ea48c
- Updated openapi to match server changes to the delete space repetition entry which landed in #371.
- Updated openapi to match server for patching user info (landed via #170 and #140).
- Smoke tests for user use openapiv6 :).
PR 392 Commit 38e27ed
- Fixed bug in openapi clients, nesting the data structure
- Added optional hash field to the image item

Follow on from #368
PR 390 Commit 3e6645e
- Fixed signalling entry of V5 or V6 has been viewed (Resolves #387)
- Fixed an issue in practice list creation / update where v2 or v6 would not show the correct data if show = to
PR 388 Commit 1db9ee7
Supporting images in v1 and v2 lists

v1 with image = v5
v2 with image = v6

More detail

- Added v5 list type (Simple but with image data)
- Added v6 list type (FromTo but with image data)
- Added AlistItemMeta to openapi
- Added AlistItemEarthPosition to openapi
- Added kind to top level of alist, it will be set based on info.type
- Fixed openapi to support different list types based on the kind
- Fixed openapi to support different list item types in spaced repetition
- Creation of go code via v6 of [openapi generator](

- Added e2e client for openapiv6

- Delete plank returns 200 and a message
- Delete challenge returns 200 and a message
- Delete daily settings returns 200 and a message
- Fixed race condition in jqquery

Resolves #368
PR 371 Commit 1f52636
Upgrading go + docker + hugo 

- Upgrading to go 1.19
- Updating hugo to 0.105
- Updating alpine to 3.16 
- Using golang 1.19
PR 384 Commit 72ab70e
Mockery update to v2.14.0
PR 374 Commit 84bce8d
- Titles are wrapped in single quote to play nice with yaml
- Description is wrapped in single quote to play nice with yaml

Fixes #363
PR 366 Commit 24eb544
Document what happens when you opt to delete your user.
PR 364 Commit e22552c
Making unjumble work via query string, by setting from and to.
PR 365 Commit abed7b4
- my-lists.html will redirect to the users specific lists
- Via my-lists page it is now possible to filter the lists
- Via my-lists page you are now able to click to edit lists you have write or owner access to (#291)
- If no lists, present a nice call to action (#92)
- Adjusted the header of all templates to align the left and the right side

Resolves #92, #291.
PR 352 Commit 5be35c3
- /alists/* return no-cache
- /unjumble/* return no-cache
- Responding better to HEAD requests

Resolves #343 (Clicking on documents cause them to be cached and not re-evaluated)
PR 351 Commit 41f7ec9
- Fixed some warnings around not handling cancel in smoke tests
- Fixed warning in firefox to explicitly set the SameSite policy on the cookie

Resolves #319
PR 350 Commit 24e4c79
Via /api/v1/spaced-repetition/viewed it is now possible to change any item.
Resolves #347
PR 349 Commit edb8b14
- A command "tools massage alist-created" takes a particular input and produces a UPDATE sql command.
PR 348 Commit 6efe9e5
- When login via idp, if the redirect url is set, return them to that after login
Resolves #282
PR 344 Commit 79749fe
- Adding ingress, to pipe from production to local dev, mostly for working with login via google | login via apple
- Change golang config file via SERVER_CONFIG
- New make commands to run api-servier, hugo and javascript separately
- Document how to tunnel traffic from external cluster locally for development
PR 346 Commit c14993e
In the browser, we run javascript on an interval to make sure if the cookie expires we delete user info from local storage.

Resolves #271
PR 342 Commit dbaf618
- Endpoints are now using repeatable middleware instead of specific skip logic
- If cookie set and token is valid, we set-cookie with new expire time
- All set-cookie are using UTC
- Added smoke test for cookie setting
- Fixed smoke test for login to delete user
- Smoke Tests, all work when the host is not via LEARNALIST_SERVER.
- Making e2e tests work with local cluster and cookies
- /assets/ can be reached via the /api/v1/assets/ or via /assets/

Fixes #336
PR 340 Commit b8cf3a8
- When deleting a challenge, a new event is fired to the monolog.
- Added e2e test for deleting the challenge and confirming the event is written to the monolog and static site topic

Resolves #175
PR 339 Commit 6eac59c
- Fixed css and missing doctype on in frontpage layout
- Fixed css and missing doctype on in user list layout
- Fixed css and missing doctype on in public list layout
- Added link to setup k8s in the readme
- Support page now exists where a logged in user can give money to learnalist or buy access to create public lists (stripe integration, is online) (Resolves #236)
PR 249 Commit 5cd7ed8
- Adding resources (limit + cpu)
- Moving learnalist deployment into learnalist.yaml and using clusterip (turns out we had nodeport set)

By product of working on #236.
PR 333 Commit ba4df44
- Adding userinfo get response to openapi
- Making nats read able to follow the logs
PR 332 Commit bc64e20
- Fixed cmd/tools/integration-tests.go:75:2: fmt.Println arg list ends with redundant newline
- As a user I want the ability to restart the spaced learning for an item. Resolves #299.
  - Via spaced repetition viewed endpoint, we now support restart, signalling to restart the entry (uuid) spaced repetition journey from the beginning (level 0).
  - Via the web, clicking "sooner" now restarts the item for spaced learning.
PR 302 Commit 40c1d75
- Fix css purging to include :global
- Fix jq filtering to actually filter if the filter fails to match
- A custom router, to be sort of SPA but using pretty urls, something around # based, didn't sit well
- Interactive play, unjumble items in a list. Starting with list type v2.
PR 324 Commit 66a2a79
- Using the durable name in nats subscribe helper function, meaning stan is now keeping track of the durable instead of defaulting to latest events.
- Removing event reader from the cluster.
PR 330 Commit f70cfab
- Fix acl to include write access for creators (owners) of a list based on alist_kv.
- New event InputAclAlistAccess, to capture the concept it is an input, might be the start of more. But we shall see.

Resolves #326
PR 328 Commit ea97b99
- Mixing jq + sqlite to enhance searching of json objects, we register a custom_func allowing us to "jq_match" in sql to filter the object based on filters generated in the code or passed in via POST body.
- Added include_system_lists paramter to alist/by/me
- Added better handling of labels with spaces
- Added post endpoint to handle raw jq filters
- Better testing (unit + End to end) for /alist/by/me endpoint
PR 325 Commit 5d9a213
- "Just One thing", a very opinionated todo list, allowing for one current item and the ability to have a "current view", look in #308 for more.
- Fixed a url redirect in spaced repetition spa
- When lookinng up current user, if it fails for network reasons it does not clear the user session
PR 310 Commit 9c0ed86
- Possible to collaborate on a list, by giving someone write access
- Openapi documented share endpoints for request access
- Openapi documented share endpoints to grant / revoke access
- Able to grant or revoke write access to a list for a user
- Access view, is aware of read and write requests
- Improved test coverage around challenge endpoints
- When acl entries are written, we now include a created timestamp
- Via PUT, if the list is not found the model for saving will reject
- run-static-site is now linked to dev_external.config
- Fixed plank history not showing up in the browser

Resolves #320.
PR 321 Commit 7048d6c
Including time when an acl record is created, part of #320.
PR 322 Commit fba6440
Moving to the v2 evolution of Gingko
PR 318 Commit bfdc7d0
Mockery changed to 2.12.2 (2.9.4_1 -> 2.12.2)
PR 317 Commit 6477fa0
Creating / updating the toolbox list, if the source file doesn't exist, it will create the directories and write an empty file (Fixes #296)
PR 309 Commit a262b18
Updated go.mod to latest versions of everything
PR 305 Commit c8cc5dc
- Update node modules in hugo
- Update node modules in js
- Fix broken test which came in via #301
PR 304 Commit a66b797
- updating nats image to nats:2.8.2-alpine3.15
- updating stan image to nats-streaming:0.24.6-alpine3.15
- learning I am using on the fly pvc, wanting to pin it in dev cluster so it is easy to find
- updating golang libraries for nats + stan
- When setting up ingress, we wait for it to be ready before finishing
- Upgrading hugo to 0.98
- e2e tests run in parallel
PR 301 Commit 6a564ca
Linting some kubernetes yaml files to make it clearer for future changes.
PR 303 Commit e694014
Single page application to make it easy to import tabbed data, create a list and add for spaced learning.
PR 283 Commit edcb9e3
- Using alpine:3:15
- Pin hugo to v0.95.0 and downloading the binary from github
PR 295 Commit d308de1
- Frontpage has been re-worked to highlight the ios applications using
- Links to the ios applications are in the correct feature pages
- Update to use more recent version of sqlite, FOR IIF
- Fix bug, "rebuild-static-site" includes all users, not just users with a list.
- Restriction, creating a list only supports private if "public write access" has not been granted.
- On my lists page, include lists the user has read access to
- When list is shared with friends, the "no-access" has a call to action to request access if logged in
- my lists are now updated when user has been granted or revoked access to a list
- New, access overview page, currently scoped to lists and requests, to allow or deny access to list
- When requesting read access, it is possible to send the owner a special link for your single read request
- When deleting a list, if shared with friends, triggers an update to those users "my lists"
PR 288 Commit dd68d9b
Added created column to the alist_kv table, to make the system aware of when the list was first made.

Resovles #286
PR 290 Commit bf4a0ff
- As a developer, improved an issue around css not being copied over to hugo (
- Fixed an inssue in the where it was catching manifest keys when it was a substring of others.
- Via shared.js we now reuse the same getCurrentUser.
- Read Write Repeat Version 2 (lets build some muscle memory!)
Building from, I wanted to create a version that interacts a little tighter with the spaced repetition section of the website.

Via, same experiences a v1.
Via, show your current practice list, generated from using our spaced repetition tools.
Via, show your spaced repetition list and make it easier to pick from there to practice typing
Via a public list (ie, able to pick a row to practice typing.
PR 281 Commit f6534c7
> Build practice lists, based on clicking sooner in the remind app ("viewed + decr")

- remind service, now listens for spaced repetition viewed events to build practice lists based on when the user signals they want to be reminded later (action=decr).
- make build-mocks, no longer builds mocks for NatsSubscriber, I reference #265.
- "api service" / server, listens for events and saves the list for the user and sets a flag to signify to the system it is created by the system and not the user
- list modification endpoints now reject if the system created the list.
- small test coverage improvment to

Resolves #276.
PR 277 Commit bbf13a5
- Updating mocks based on 2.9.4 of mockery
PR 275 Commit 08091cc
- DailyReminder events now know about plank_v1 and send titles and messages reflective of the app, to inspire or encourage.
- GetReminders returns daily reminder settings based on user_id and app_identifier.
- If you change your daily settings, then the activity for the day, is lost (this could be fixed in another issue)
- Added logging around empty userUUID in the daily settings manager.

Fixes #239, at least on the server side.
PR 240 Commit aef4968
- Fixing links in the reference sectiton on the-humbe-plank landing page.
- Making it clear you need to be logged in, to see the plank stats via the website
PR 272 Commit c85fe29
Adding link to "the humble plank" app in the Apple store.

Resolves #257
PR 270 Commit 05ae0c4
- using go.1.17
- k3d v5 setting up k3s in docker
- kustomise for staging (k3d locally)
- Starting to kustomise for production
- A little db building, to use kustomize to bring the sql files to the cluster in configmap
- Nats with queuesubscribe (#266)
-- Support running multiple versions of the api-server, from a nats point of view. I word it like this, as the sqlite file and html files will only work if both servers have access to the same folder. (READ will still be a problem on a k8s with more than 1 node that doesnt support Read Write Many RWX)
-- Confirmed it worked, by running two api-servers and then the e2e-tests.
-- The e2e tests confirmed I had problems moving to QueueSubscriber, it feels pretty damn good to see this and then see it work.

Resolves #156 via #264
PR 262 Commit 2148b1b
- Support page for mobile humble plank app
- Support page for mobile remind app
- Better linking from welcome.html to the respective links above.
- Able to run make develop with LAL_INTERFACE, to make it easier to work on a mac when not on wifi, ie via mobile internet

Helps resolve #256
PR 261 Commit 9879cf8
- Adding link to Import and Play chrome extension
- Tidying up the top level readme
PR 248 Commit aa0b2fd
Import and play browser extension is approved, fixes #129.
PR 247 Commit 117fe66
- Removed unused code (OAuthReadWriter) (Fixes #205)
PR 246 Commit d3bc231
- Browser extension "Import and Play" tries to make a list out of the vocabulary section of skills on (#241)
- Server support for lists created with from.kind duolingo (#241)
- Added first version copy for the browser extension "Select and Save" / "Add to 🧠 + 💪"
- Add first version copy for the browser extension "Import and Play"
- Creating a first version of a privacy policy based on Legalmattic from Automattic
- share.js is only included if the template has js files to include
PR 242 Commit 57af0df
- Fix Granting or revoking users ability to create public lists via the command line (#230)
- Using event.TopicMonolog everywhere
- Improving the documentation around running e2e tests
PR 238 Commit caf3930
- Remove the "are you sure prompt" that is triggered before leaving the plank-stats-v1 page to login
PR 237 Commit ab8b666
- Streamlining the process of creating single page apps, under "toolbox".
- Adding language-pad to toolbox
- Adding read-write-repeat to toolbox
- Adding plank-stats to toolbox
- Adding css to plank
- Cleanup script to remove files that are not in the manifest_css.json or manifest_js.json on the server
- When leaving plank stats page, ensure we remove any notifications
- On visibility change we now use the same logic to filter checking for next spaced repetitions
PR 235 Commit 6511c76
- Fixed a bug that was sending daily reminders to the wrong users devices (#233).
- e2e test for the above issue, has shown me one way to hook into the log for more fine grained e2e testing.
- Static site file rebuild, now batches the requests to protect a little from event herding.
PR 234 Commit d6cb926
- Spelling mistake on Android
- Using "over time" instead of overtime
PR 232 Commit 293e1e9
- Landing page for remind app.
- Landing page for humble plank app.
- Page for technical-changelog and documented how to update it.
- Samples are used in the hugo css build step to make sure we touch paths in different layouts.
- Added sync-content option to makefile.
- sync-site-assets will now rebuild js libraries from openapi before running.
PR 231 Commit 44c4ab6
- Update js dependencies in js and hugo
- manifest_js and manifest_css have a base that is now copied to hugo
- How we move js and css from js to hugo has changed a little

Fixes #224
PR 225 Commit 42e63a4
- Only able to publish public lists if you have write access (#214).
- Registering a new user allows for setting if they have write access for public lists (#214).
- Notifying hugo of changes via events (#207).
- Able to grant and revoke access to write public lists via the command line.
- Challenges now trigger events to hugo for updating (#198 #199)
- e2e openapi client records the requests, making it easier to see scope of coverage linked to the openapi document.

Resolves #214 #207 #199 #198
PR 215 Commit c3bf2fa
Handling when entry has reached the highest spaced learning level.
Fixes #218
PR 219 Commit e3ba219
- When saving a list from external source, we now check the suffix of the hostname for match.
- Import and play has its own Spaced Repetition UI, decoupled from the website.
- New extension to provide support for adding via context menu (works in both firefox and google out the box)

Resolves #139
PR 211 Commit 29e3a38
- Clicking "Add meaning / definition" toggles checkbox and expose meaning box.

Resolves #134
PR 209 Commit 1c81a6d
- Document how to use daily reminders api.
- Better searching on auto generated api index.

Resolves #200
PR 208 Commit e2b118e
- Login with appleID via web.
- Login with appleID via idp rest endpoint.
- Improved test coverage.
- Document how to update idps to the "learnalist user uuid".

Resolves #203
PR 204 Commit 05f0fec
- Add lists overtime for spaced repetition learning, via api and UI.
- Improve developer experience around restarting nats
- Fix issue where Rollback of transaction would have crashed due to tx being nil
- Only show spaced repetition if the list has entries.

Resolves #193
PR 194 Commit 6bd5346
- Fixes a crash in remind-manager. It was not running EVENTS = nats
- GetReinders now returns array of tokens not just the first token to send message to.
PR 196 Commit b719ec6
- using mockery 2.5.1 to build our mocks
- improved the server README
PR 195 Commit 97ccb9d
- Send a reminder to users with the mobile app. It is delayed by last_active, currently set to 5 minutes. Only sends once until further interaction from the user.
- Api endpoint for app-settings, allowing to opt in or opt out for spaced repetition notifications via push.
- A fix to remove a users spaced repetition entries when the user is deleted.
- Cruedly checking to see if hugo, npm, go, and yq are installed.
- Clicking on server information, returns the correct information.
- Bump version of Hugo to 0.80.0 (#188)

Resolves #188 #183
PR 184 Commit d062e8a
- Let two users add the same entry for spaced repetition learning.
- Improve test coverage of spaced_repetition pkg.
- e2e test to verify two users adding the same entry

Resolves #185.
PR 186 Commit 15e8b43
- Brings reminder engine to learnalist, the engine is location aware and hopefully delivers the reminders in the local time of the user.
- Decoupled the reminder engine, so it can be stand alone from the rest of the system.
- When registering mobile device, if "app + token" already exists, we remove the previous entry as it is now assumed to be a new user.

Helps bring #168 to life.
PR 170 Commit 414cdc3
- Restrict access to the /api/v1/user/register via header simple key
- Small improvements to the documentation

Resolves #153
PR 181 Commit e280411
- Via idp login, lookup google profile when registering new user.
- Bug in tools command, not using events.
PR 180 Commit 3bbb521
- Able to query challenges api and filter by kind.
- Added index on user_uuid to table acl_simple.

Resolves #169.
PR 179 Commit 1476631
Metadata work
- When list is public show description
- When list is public and has labels, add tags
- When list is not public tell the robots to ignore
PR 178 Commit 3021e62
Remove Data heading, resolves #164.
PR 177 Commit 5b60a11
- Challenge records only include users in the challenge.
- Challenge user list is based on acl, not if they have added a record.
- Hugo now also listens via events to write content (lal.staticSite).
- Hugo supports writing challenge pages when altered via the api.
- Able to add "content specific metadata" in hugo.
- Small start to cleaning up out of date documentation.

Resolves #172
PR 173 Commit 0049e8d
- Adding nats + stan k8s files for ops.
- Creating a short lived store for use with sending events for static site generation.
- ssl renewal works now, we will find out in March.
PR 174 Commit ff36aa7
- Registering mobile device with a token now supports adding app_identifier.
- Openapi reflects the new app_identifier attribute.

Resolves #162
PR 161 Commit cc44da7
- using the makefile to fire up nats to improve the developer experience.
PR 167 Commit 8d3215e
* New api endpoint to allow login via idp_token.
* Push notifications service consuming nats stream.
* New api to register mobile device, linking token to user.
* Notifications for when a user joins, leaves or adds to a challenge.
* Updated slack-reader to handle the new events.
* Able to toggle spaced repetition with the spacebar.
* Building the api.overview file based on parsing the openapi document.
PR 155 Commit dd04e37
Short version:
- New api for plank recording and viewing history.
- New api for challenges.
- Able to create a "plank challenge".
- Able to give your user a display name via the api.

Longer version:
- Plank app has its own api now
- History via desc
- Adding logs to user delete
- Making it clear the test coverage dropped
- Copy data from lists to plank table
- Move planks to plank table and remove lists
- Fix lists with no shared settings and set to private
- Challenge system, allowing a user to create a challenge group for planking.
- Able to add display_name via register api.
- Able to add display_name via user/info api.

Solves #136.
PR 140 Commit f7c0535
- Closing nats connections.
- Simplified event system for nats and memory.
- Fixed an issue with "func init" and bindEnv in Viper.
- Added "logout" events.
PR 146 Commit dbde227
Small improvements to the docs.
PR 131 Commit 27114fc
- Able to add an asset (very poormans cdn)
- Introducing an event bus to decouple when a user is deleted and removing assets.
- Requires manual update to the db (acl_simple).
- Small refactor on parsing in variables into InitApi.
- Adding iptables to k3s setup to block public access to kubectl.
PR 109 Commit 31ecb94
Improved spaced repetition
- Overview of entries.
- Stats of when entries were created.
- Able to add entry without going thru an existing list.

- History reports week better 

Resolves #125
PR 126 Commit a6682c2
- Add created and update fields to the spaced repetition #113.
PR 116 Commit 69db1c1
* Moved openapi into own folder
* Able to generate full openapi from parts.
* Able to generate clients for, golang, typescript-fetch and dart.
* Cobbled some code together to extract the css class names used in svelte so hugo adds the missing ones from tachyons in base css.
* Spaced repetition gives the user chance to give feedback on sooner or later to remind of entry.
PR 115 Commit 0cfa9b0
* A plank recorder is born, record planks and view history.
* Plank recorder works for logged in and non logged in user, with call to action.
* Cleaned up editor code to use more of the website code base
* Using api generated by the openapi document
* Fixed missing css setup in many of the files
* Moved the header section of hugo into its own partial
* Moved hugo to a side car in kubernetes, speeding up rendering for the indvidual file as the files scale
* Sharing code logic for rollups.
PR 110 Commit d6503bb
* Add slideshow to list type V2
* Update docs on how to clean up ssh tunnels
* Sharing css via all.css in js world.
PR 104 Commit f4d2b6b
- Able to delete a user via the api.
- Cli tool to delete the user (via the server).
- fixed and documented https certificate, not using fullchain.
- Making it clearer where all the api httpXXX structs are.
- Improved more of the logging to log as json, including field "context.
- Upgraded to golang 1.14.3
- Upgraded to alpine 3.12
- Upgraded to hugo 0.72
- Via make it is now possible to run end to end tests locally
PR 94 Commit 6980615
- Fixes #91, a bug when first time login via google would result in the user not having a data json file of its lists, which would then cause "my lists" to show a 500 as there is no file on disk to render. 
- Added test coverage for the google oauth callback endpoint.
- Improved test coverage a little more.
PR 93 Commit fa65123
* Adding status codes, to the api documentation.
PR 54 Commit 1b3e758
- List type v4 data is an array of objects with attributes content and url.
- Cleaned up code in package "alist", to follow naming conventions better.
- Return messages, refer generically to the documentation (which doesn't exist.. yet!).
- Added list type specific documentation.
- Added countries and months (under dataset) with a crude covert script (integrations/convert).
PR 51 Commit f5924fe
* Fixes #47, make sure the user is lowercase.
* User endpoint returns the uuid and the username.
* Better validation on both username and password.
PR 49 Commit d20eaa4
* Acl in use on list creation, editing and viewing.
* Acl support via casbin, saved to the database.
* /share/alist endpoint to grant or revoke access to a list.
* /alist/:uuid checks to see if you are allowed to read the list.
* Does require database update before launch.
* Fixes #45.
PR 46 Commit e546136
Creating functions to return New lists with preset data.
PR 44 Commit e7050c5
Support for Concept2 / v3 list type, fixes #38.
PR 43 Commit 1c4be88
Moving to prefix api with version v1.
PR 42 Commit a67650c
- Filter a list via labels, list type and labels and list type, fixes #39.
- Documented the new query parameters.
PR 41 Commit 4142f86
- When using PUT or DELETE, it now checks the request User is the same as the list user.
- Added api test for version.
- Reduced duplication in the tests.
- MustExec, will cause a panic, removed some and documented the non-test example.
PR 36 Commit 0a98b55
Tests are able to run via the command line (Fixes #33).
PR 34 Commit 8d0e5aa
* Removing a label will remove it from the list as well.
* Added the integration script to cleanup current data related to removing of labels.
PR 31 Commit cb0fc65
When a user is created it returns a 201.
When a user is created with the same username and password it returns a 200.
When a user is created with a username in the system it returns a 400.
PR 32 Commit 4a7d1e2
- Removing a list will make sure the user who created is the only one who can delete it (Fixed #25).
- Posting a list will return a 201, updating = 200 (Fixed #23).
PR 26 Commit 8d0ba06
- Updated the api readmer to reflect the current state of the api endpoints.
- The system is aware of labels now (#19).
- When querying for the users lists, it is now possible to filter the results based on labels (#19).
- PUT now creates lists that do not exist (#20)
- Slowly improving the tests.
PR 24 Commit d4cd119