Technical Changelog

2024-03-21
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
2024-03-19
- Moved changelog into hugo/assets/data
- Updated .gitignore
- Updated exclude list for syncing content via rsync
PR 553 Commit be85bc1
2024-03-19
- 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
2024-03-06
- 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
2024-02-26
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
2024-02-25
Rebuild user info from the monolog
PR 537 Commit 63d0d68
2024-02-24
Fixed No time crashes srs activty listener (#533)

Resolves #533
PR 534 Commit f9a16bb
2024-02-24
- 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
2023-12-03
- 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
2023-11-27
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
2023-11-23
- 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
2023-11-22
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
2023-11-22
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
2023-11-20
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
2023-11-09
- Adding robots.txt
- Redirecting learnalist.com, www.learnalist.com and www.learnalist.net to learnalist.net
- 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
2023-11-07
- 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
2023-08-19
When fcm token is expired or not valid, it only removes the mobile device with that token.

Resolves #475
PR 478 Commit ff0d0ac
2023-08-19
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
2023-07-04
- 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

Plank
- 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
2023-07-04
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
2023-07-03
# 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
2023-07-02
- Using tailwind for css
- Simplified css integration into hugo
PR 456 Commit 1557690
2023-05-26
- 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
2023-05-09
- 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
2023-04-03
- 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
2023-03-29
- 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 lal01.learnalist.net
- Assets have their own endpoint to set max body
- Mimetype detection using lib as mp4 was not getting picked up
PR 417 Commit 86d63b8
2023-03-10
- 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
2023-03-10
Updated to 2.21.6.
From 2.14.0.
PR 411 Commit 7df05cf
2023-01-30
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
2023-01-30
Decoupling the sql update from the code #396.
PR 403 Commit 2d9a1c0
2023-01-30
- 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
2023-01-15
Adding spaced repetition entry via dripfeed now sets created to be based on when the event happened.
Resolves #398.
PR 399 Commit 33799d2
2023-01-15
- Linking from "My lists" (https://learnalist.net/my-lists.html) to Spaced repetition (https://learnalist.net/spaced-repetition.html)
- Able to delete an entry on https://learnalist.net/spaced-repetition.html
- Able to reset an entry for learning on https://learnalist.net/spaced-repetition.html
- List kind v2 now has a link to unjumble if interact is enabled
PR 397 Commit d4ea48c
2022-12-12
- 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
2022-11-30
- 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
2022-11-20
- 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
2022-11-17
Supporting images in v1 and v2 lists

v1 with image = v5
v2 with image = v6

More detail

openapi
- 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](https://github.com/OpenAPITools/openapi-generator/)

e2e
- Added e2e client for openapiv6

server
- 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
2022-11-17
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
2022-11-15
Mockery update to v2.14.0
PR 374 Commit 84bce8d
2022-10-24
- 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
2022-10-24
Document what happens when you opt to delete your user.
PR 364 Commit e22552c
2022-10-24
Making unjumble work via query string, by setting from and to.
PR 365 Commit abed7b4
2022-06-28
- 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
2022-06-20
- /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
2022-06-20
- 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
2022-06-17
Via /api/v1/spaced-repetition/viewed it is now possible to change any item.
Resolves #347
PR 349 Commit edb8b14
2022-06-17
- A command "tools massage alist-created" takes a particular input and produces a UPDATE sql command.
PR 348 Commit 6efe9e5
2022-06-17
- When login via idp, if the redirect url is set, return them to that after login
Resolves #282
PR 344 Commit 79749fe
2022-06-16
- 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
2022-06-15
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
2022-06-15
- 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 127.0.0.1:1234 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
2022-06-14
- 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
2022-06-14
- 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
2022-06-10
- 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
2022-06-08
- Adding userinfo get response to openapi
- Making nats read able to follow the logs
PR 332 Commit bc64e20
2022-06-08
- 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
2022-06-07
- 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
2022-06-02
- 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
2022-06-02
- 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
2022-05-31
- 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
2022-05-28
- "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
2022-05-24
- 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
2022-05-24
Including time when an acl record is created, part of #320.
PR 322 Commit fba6440
2022-05-20
Moving to the v2 evolution of Gingko
PR 318 Commit bfdc7d0
2022-05-20
Mockery changed to 2.12.2 (2.9.4_1 -> 2.12.2)
PR 317 Commit 6477fa0
2022-05-18
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
2022-05-16
Updated go.mod to latest versions of everything
PR 305 Commit c8cc5dc
2022-05-16
- Update node modules in hugo
- Update node modules in js
- Fix broken test which came in via #301
PR 304 Commit a66b797
2022-05-16
- 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
2022-05-14
Linting some kubernetes yaml files to make it clearer for future changes.
PR 303 Commit e694014
2022-03-19
Single page application to make it easy to import tabbed data, create a list and add for spaced learning.
PR 283 Commit edcb9e3
2022-03-19
- Using alpine:3:15
- Pin hugo to v0.95.0 and downloading the binary from github
PR 295 Commit d308de1
2022-03-18
- Frontpage has been re-worked to highlight the ios applications using learnalist.net
- 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
2022-01-31
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
2021-12-12
- As a developer, improved an issue around css not being copied over to hugo (https://github.com/thgh/rollup-plugin-css-only/issues/40)
- Fixed an inssue in the manifest-cleanup.sh 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 https://learnalist.net/toolbox/read-write-repeat-v1.html, I wanted to create a version that interacts a little tighter with the spaced repetition section of the website.

Via https://learnalist.net/toolbox/read-write-repeat-v2.html, same experiences a v1.
Via https://learnalist.net/toolbox/read-write-repeat-v2.html#todaysPracticeList, show your current practice list, generated from using our spaced repetition tools.
Via https://learnalist.net/toolbox/read-write-repeat-v2.html#personalSpacedRepetition, show your spaced repetition list and make it easier to pick from there to practice typing
Via a public list (ie https://learnalist.net/toolbox/read-write-repeat-v2.html#uuid/ad573393-4898-5c23-9781-3f0caafd7734), able to pick a row to practice typing.
PR 281 Commit f6534c7
2021-11-21
> 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 system.list.save 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 github.com/freshteapot/learnalist-api/server/api/alist/sqlite

Resolves #276.
PR 277 Commit bbf13a5
2021-11-02
- Updating mocks based on 2.9.4 of mockery
PR 275 Commit 08091cc
2021-10-31
- 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
2021-10-31
- 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
2021-10-27
Adding link to "the humble plank" app in the Apple store.

Resolves #257
PR 270 Commit 05ae0c4
2021-10-25
- 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
2021-06-25
- 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
2021-04-07
- Adding link to Import and Play chrome extension
- Tidying up the top level readme
PR 248 Commit aa0b2fd
2021-04-06
Import and play browser extension is approved, fixes #129.
PR 247 Commit 117fe66
2021-04-05
- Removed unused code (OAuthReadWriter) (Fixes #205)
PR 246 Commit d3bc231
2021-04-03
- Browser extension "Import and Play" tries to make a list out of the vocabulary section of skills on duolingo.com (#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
2021-03-30
- 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
2021-03-29
- Remove the "are you sure prompt" that is triggered before leaving the plank-stats-v1 page to login
PR 237 Commit ab8b666
2021-03-29
- 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
2021-03-27
- 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
2021-03-20
- Spelling mistake on Android
- Using "over time" instead of overtime
PR 232 Commit 293e1e9
2021-03-20
- 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
2021-03-20
- 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
2021-03-14
- 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
2021-03-14
Handling when entry has reached the highest spaced learning level.
Fixes #218
PR 219 Commit e3ba219
2021-03-07
- 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
2021-03-05
- Clicking "Add meaning / definition" toggles checkbox and expose meaning box.

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

Resolves #200
PR 208 Commit e2b118e
2021-03-05
- 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
2021-02-22
- 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
2021-01-15
- 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
2021-01-10
- using mockery 2.5.1 to build our mocks
- improved the server README
PR 195 Commit 97ccb9d
2021-01-08
- 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
2020-12-28
- 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
2020-12-21
- 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
2020-12-18
- Restrict access to the /api/v1/user/register via header simple key
- Small improvements to the documentation

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

Resolves #169.
PR 179 Commit 1476631
2020-12-14
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
2020-12-14
Remove Data heading, resolves #164.
PR 177 Commit 5b60a11
2020-12-14
- 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
2020-12-14
- 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
2020-12-12
- Registering mobile device with a token now supports adding app_identifier.
- Openapi reflects the new app_identifier attribute.

Resolves #162
PR 161 Commit cc44da7
2020-12-11
- using the makefile to fire up nats to improve the developer experience.
PR 167 Commit 8d3215e
2020-12-08
* 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
2020-11-09
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
2020-10-11
- 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
2020-09-29
Small improvements to the docs.
PR 131 Commit 27114fc
2020-09-26
- 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
2020-08-24
Improved spaced repetition
- Overview of entries.
- Stats of when entries were created.
- Able to add entry without going thru an existing list.

Plank
- History reports week better 

Resolves #125
PR 126 Commit a6682c2
2020-08-11
- Add created and update fields to the spaced repetition #113.
PR 116 Commit 69db1c1
2020-07-28
* 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
2020-07-19
* 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
2020-06-22
* 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
2020-06-14
- 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
2020-05-23
- 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
2019-05-29
* Adding status codes, to the api documentation.
PR 54 Commit 1b3e758
2019-05-23
- 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
2019-05-23
* 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
2019-05-22
* 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
2019-05-19
Creating functions to return New lists with preset data.
PR 44 Commit e7050c5
2019-05-19
Support for Concept2 / v3 list type, fixes #38.
PR 43 Commit 1c4be88
2019-05-18
Moving to prefix api with version v1.
PR 42 Commit a67650c
2019-05-18
- Filter a list via labels, list type and labels and list type, fixes #39.
- Documented the new query parameters.
PR 41 Commit 4142f86
2019-05-16
- 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
2019-05-15
Tests are able to run via the command line (Fixes #33).
PR 34 Commit 8d0e5aa
2019-05-14
* 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
2019-05-14
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
2019-05-10
- 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
2019-05-09
- 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