arnevogel / listudy Goto Github PK
View Code? Open in Web Editor NEWListudy - chess training server
Home Page: https://listudy.org
License: GNU Affero General Public License v3.0
Listudy - chess training server
Home Page: https://listudy.org
License: GNU Affero General Public License v3.0
Hi, this is a super awesome tool - thank you! That said, I have a couple suggestions:
Thank you so much!
In this pieceless tactic (board setup), the move Kg6 is not visibly playable but still works if you click on g6 after selecting the king.
Hi,
First of all, thanks for listudy. I was looking for a way to use spaced repetition to study opening studies I made in lichess and listudy solves this problem perfectly.
The one small annoyance I have is that I update these lichess studies quite frequently. It would be awesome if it could auto-update or if that is not possible remember the URL in the edit page, so we can easily update the study.
Another possible solution could be logging in with lichess (the same way openingtree does). That way we can also maybe enable access to private lichess studies, but from a technical standpoint that does sound more complicated.
Steps to reproduce:
1. e4 e5 2. Nf3 Nf6 3. Bc4 Nxe4 4. Nxe5 d5 5. Bb3 (5. Qf3 Be6 (5... f6 6. Qh5+ g6) 6. Bb3 Qg5) 5... Qg5 *
You can get out of the endless cycle by playing f6 but why should you memorize two lines if you are free to choose one?
A workaround is to not include multiple options for the side the study is meant for.
I'm not totally sure if that's the intended location for favorited studies, but I can't seem to find that a study is favorited, unless I go to the study itself.
"Improve you chess game with spaced repetition" should be "Improve your chess game with spaced repetition".
When "you reached the end of this line", the study automatically restarts to the starting position. This doesn't give you much time to look at it. In other words: I'd like to be able to review the final position in the line before resetting the board.
Perhaps a "continue" / "next" button could be added that triggers the board reset? Even just a 3-4 second delay would be helpful, if you don't want to change the interface.
PS: Really enjoying Listudy, have wanted (and mused about making) something similar for a long time. Thanks!
Hello,
I can help by translating into french.
The "Study" dropdown menu disappears when you hover over it and move down to pick one of the options.
The div below the board on studies isn't focusable at all, and the links (edit, the author page, etc.) aren't clickable. I'm on Chrome latest.
The options that are adjustable on each study page don't seem to be persisted throughout the use of the platform. It would be great if those could be saved globally per user
Registered w/ two different accounts successfully but I am unable to sign back in after logging out.
Credentials and passwords are correct. Tried clearing caches and cookies w/o success.
I don't know what your goals for this project are, but it would be awesome if it tried to do what chesstempo does very well, tactics!
It would be nice if one could seriously train tactics on listudy. To do that, one should be able to select a particular tactical motif, between a given rating range, and solve it, with spaced repetition enabled.
Example:
Say I am not good with basic forks and I want to train them. I would log into listudy, create a new "set" with only forks rated between 500 and 1250. I would then solve the puzzles. Hopefully, listudy already supports spaced repetition.
To do this, each puzzle needs to be tagged with both a rating and tactical motifs. Each puzzle can have more than 1 tactical motif, and those motifs should be voted out by the community.
It will be awesome to have statistics (like Anki does it) for when a line is due to review etc.
Hey, first of all: The work you are doing here is really amazing!
It would be great if the blind tactics were not only checkmate tactics, but also e.g. tactics that lead to a material advantage. Knowing that one only has to look for a checkmate makes things much easier.
Thanks for building listudy, the GUI and interface is great! I also think using the Leitner system is a great idea for spaced repetition!
In order to make studying with the Leitner system more effective, it would be useful to get some details about the studies, which have been marked as favorites.
Feature request:
In order to know how many variations have been trained and which variations are in which "box", it would be useful to display this information when opening the study.
I.e.:
Total variations: 100
Variations unseen (box 1): 60
Variations in box 2: 26
Variations in box 3: 14
Variations in box 4: 20
How many boxes does listudy use?
As a further step, one could configure a time, when the respective boxes are due for learning again.
I.e. allow times to be set for the boxes
Box 1: Due for learning now, since they are unseen
Box 2: Due in x hours
Box 3: Due in y days/hours
etc.
In Chrome on Android 8.0, the search page resets the search when I hit enter, and also at other seemingly random points of time while I'm searching. Gets pretty frustrating when trying to find studies.
The The London System is currently broken.
SyntaxError at line: 7, character: 7; Unexpected: "null"
Uploaded a PGN with under promotion to knight with check.
In the PGN : fxg1=N+
PGN attached, mainline 7th move for black (last line in file)
PGN created with Scid vs. MAC
The arrow shows in the study as the desired move but when move is attempted the message indicates that this move is not part of the study.
AlbinCounterGambitPGN.txt
Great App. thank you.
not sure exactly what triggers the reset, it seems to be happening randomly
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0
Hello,
Following the instructions in the README and when I try to run mix phx.server
and then load up localhost:4000
I get this error:
Server: localhost:4000 (http)
Request: GET /en
** (exit) an exception was raised:
** (ArithmeticError) bad argument in arithmetic expression
:erlang.rem(2632897, 0)
(listudy 0.1.0) lib/listudy_web/controllers/tactic_controller.ex:205: ListudyWeb.TacticController.daily_id/0
(listudy 0.1.0) lib/listudy_web/controllers/tactic_controller.ex:198: ListudyWeb.TacticController.daily_tactic/0
(listudy 0.1.0) lib/listudy_web/controllers/page_controller.ex:13: ListudyWeb.PageController.index/2
(listudy 0.1.0) lib/listudy_web/controllers/page_controller.ex:1: ListudyWeb.PageController.action/2
(listudy 0.1.0) lib/listudy_web/controllers/page_controller.ex:1: ListudyWeb.PageController.phoenix_controller_pipeline/2
(phoenix 1.5.7) lib/phoenix/router.ex:352: Phoenix.Router.__call__/2
(listudy 0.1.0) lib/listudy_web/endpoint.ex:1: ListudyWeb.Endpoint.plug_builder_call/2
(listudy 0.1.0) lib/plug/debugger.ex:132: ListudyWeb.Endpoint."call (overridable 3)"/2
(listudy 0.1.0) lib/listudy_web/endpoint.ex:1: ListudyWeb.Endpoint.call/2
(phoenix 1.5.7) lib/phoenix/endpoint/cowboy2_handler.ex:65: Phoenix.Endpoint.Cowboy2Handler.init/4
(cowboy 2.8.0) /home/andrew/Coding/listudy/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2
(cowboy 2.8.0) /home/andrew/Coding/listudy/deps/cowboy/src/cowboy_stream_h.erl:300: :cowboy_stream_h.execute/3
(cowboy 2.8.0) /home/andrew/Coding/listudy/deps/cowboy/src/cowboy_stream_h.erl:291: :cowboy_stream_h.request_process/3
(stdlib 3.14) proc_lib.erl:226: :proc_lib.init_p_do_apply/3```
This is my first time working in Elixir or Phoenix so I have no idea how to debug this. Any help you can give is greatly appreciated, thank you!
Hi Arne, thank you so much for this software.
I'd like to propose a feature to display PGN annotations for moves after they've been played.
Proposed feature
After a move has been played, if there is an annotation, display a box underneath the "✓ 3x Right move!" box displaying the move's PGN annotation.
Rationale
As written on the memorising chess openings article on your website, "not only the moves are important but also the concepts behind the moves. For this reason, the comments from the studies are shown, in which the reason for various moves can be explained."
Comments are useful, but they're not position or move-specific, so move-specific annotations I think are a better solution for understanding the concepts behind the moves. PGN files and editors already support these annotations, so they can be directly imported.
Annotations for moves that the computer plays would naturally serve as hints or prompts, e.g. "Here black plays Nf6 threatening the pawn on e4. How can white respond with a counter attack?" By contrast, annotations for moves that the player makes are concepts that the player wants to remember, e.g., "Correct. Ng6 threatens the fried liver attack."
Of course, users can annotate the games in whatever way they find the most useful.
Considerations
Please let me hear any comments/feedback. If this is an acceptable feature, I can attempt an implementation and submit a pull request for review.
Hi, I found the page for the ponziani tactics https://listudy.org/en/tactics/opening/ponziani-opening and I thought it was really intereesting, however when I tried to get a page like that for the evans gambit it didn't work. It looks like these are automatically generated, so could you consider adding a feature where you only train tactics in a specified opening?
This is an example of a tactic that would require promotion in order to be solved. As far as I can tell this isn't supported yet.
Thanks so much for the great software.
I'm trying to sign-in at https://listudy.org/session/new
It says "The provided login details did not work. Please verify your credentials, and try again."
I'm using a password manager, so if the password is wrong, I can't really verify anything: I just need a new password. Normally on a login page there is a reset/forgot password link, but I can't see that here.
as title says - I'm not aware of listudy doing this already, but apologies if i've missed some button to turn this on or something!
https://listudy.org/en/endgames/king-and-pawn/endings-of-games/15
Hello! I've been using Listudy for a while now, but I've been encountering a problem.
I've been making studies with comments in my native language (French), but the accented characters don't show up (such as à, é, è, or î).
Below is a short PGN example to reproduce the issue
[Event ""]
[Site ""]
[Date "????.??.??"]
[Round ""]
[White ""]
[Black ""]
[Result "*"]
1.e4 e5 2.f4 {A à E é I î O ô U ù Y} *
On Listudy.org, the comment is displayed as "A E I O U Y", ignoring all accented characters. This creates typos in the comments, so reading through the comments becomes harder.
Accented characters display fine on the study title or the study description, so it seems the issue is related to the embedded PGN viewer.
Could it be possible to fix this?
The idea would be to start training at the first point the PGN has variations to avoid having to play the first few basic moves repeatedly.
I made an extremely simple proof of concept version here which appears to work: https://github.com/KerfuffleV2/listudy/tree/key_moves_feature
Since I don't actually know JavaScript and I'm not familiar with the codebase it's likely this isn't a good approach. The meat of it is in the tree_from_pgn.js:annotate_pgn
function which adds a move_index
value to each move and a first_variation
to the head of the game. The toggle is not hooked up to the UI in that branch and currently always set to true
.
It's implemented in study.js
to just skip through the moves like you do when it's not the student's turn by calling play_move(ai_move(...))
when the toggle is set and there actually is a variation in the current chapter.
The annotated tree seems like it would also make implementing a maximum study depth feature relatively easy.
If I broke any etiquette, please forgive me. I don't contribute to projects on Github often.
I see 'SyntaxError at line: 1, character: 1; Unexpected: ""' in a red box when I navigate to this study: https://listudy.org/en/studies/3xdxc5-english-symmetrical-four-knights-master.
The console shows two messages:
{
"message": "Expected \" \", \"*\", \".\", \"0-1\", \"1-0\", \"1/2-1/2\", \";\", \"O-O\", \"O-O-O\", \"[\", \"\\n\", \"\\r\", \"\\t\", \"\\x0C\", \"{\", [1-9], [NKQRB], or [a-h] but \"\" found.",
"expected": [
{
"type": "literal",
"text": " ",
"ignoreCase": false
},
{
"type": "literal",
"text": "\f",
"ignoreCase": false
},
{
"type": "literal",
"text": "\t",
"ignoreCase": false
},
{
"type": "literal",
"text": "\r",
"ignoreCase": false
},
{
"type": "literal",
"text": "\n",
"ignoreCase": false
},
{
"type": "literal",
"text": " ",
"ignoreCase": false
},
{
"type": "literal",
"text": "\f",
"ignoreCase": false
},
{
"type": "literal",
"text": "\t",
"ignoreCase": false
},
{
"type": "literal",
"text": "\r",
"ignoreCase": false
},
{
"type": "literal",
"text": "\n",
"ignoreCase": false
},
{
"type": "literal",
"text": "{",
"ignoreCase": false
},
{
"type": "literal",
"text": "{",
"ignoreCase": false
},
{
"type": "literal",
"text": ";",
"ignoreCase": false
},
{
"type": "literal",
"text": " ",
"ignoreCase": false
},
{
"type": "literal",
"text": "\f",
"ignoreCase": false
},
{
"type": "literal",
"text": "\t",
"ignoreCase": false
},
{
"type": "literal",
"text": "\r",
"ignoreCase": false
},
{
"type": "literal",
"text": "\n",
"ignoreCase": false
},
{
"type": "literal",
"text": "[",
"ignoreCase": false
},
{
"type": "literal",
"text": " ",
"ignoreCase": false
},
{
"type": "literal",
"text": "\f",
"ignoreCase": false
},
{
"type": "literal",
"text": "\t",
"ignoreCase": false
},
{
"type": "literal",
"text": "\r",
"ignoreCase": false
},
{
"type": "literal",
"text": "\n",
"ignoreCase": false
},
{
"type": "literal",
"text": "{",
"ignoreCase": false
},
{
"type": "literal",
"text": "{",
"ignoreCase": false
},
{
"type": "literal",
"text": ";",
"ignoreCase": false
},
{
"type": "literal",
"text": " ",
"ignoreCase": false
},
{
"type": "literal",
"text": "\f",
"ignoreCase": false
},
{
"type": "literal",
"text": "\t",
"ignoreCase": false
},
{
"type": "literal",
"text": "\r",
"ignoreCase": false
},
{
"type": "literal",
"text": "\n",
"ignoreCase": false
},
{
"type": "class",
"parts": [
[
"1",
"9"
]
],
"inverted": false,
"ignoreCase": false
},
{
"type": "literal",
"text": " ",
"ignoreCase": false
},
{
"type": "literal",
"text": "\f",
"ignoreCase": false
},
{
"type": "literal",
"text": "\t",
"ignoreCase": false
},
{
"type": "literal",
"text": "\r",
"ignoreCase": false
},
{
"type": "literal",
"text": "\n",
"ignoreCase": false
},
{
"type": "literal",
"text": ".",
"ignoreCase": false
},
{
"type": "literal",
"text": "O-O-O",
"ignoreCase": false
},
{
"type": "literal",
"text": "O-O",
"ignoreCase": false
},
{
"type": "class",
"parts": [
"N",
"K",
"Q",
"R",
"B"
],
"inverted": false,
"ignoreCase": false
},
{
"type": "class",
"parts": [
"N",
"K",
"Q",
"R",
"B"
],
"inverted": false,
"ignoreCase": false
},
{
"type": "class",
"parts": [
[
"a",
"h"
]
],
"inverted": false,
"ignoreCase": false
},
{
"type": "class",
"parts": [
[
"a",
"h"
]
],
"inverted": false,
"ignoreCase": false
},
{
"type": "literal",
"text": "1-0",
"ignoreCase": false
},
{
"type": "literal",
"text": "0-1",
"ignoreCase": false
},
{
"type": "literal",
"text": "*",
"ignoreCase": false
},
{
"type": "literal",
"text": "1/2-1/2",
"ignoreCase": false
}
],
"found": "",
"location": {
"start": {
"offset": 0,
"line": 1,
"column": 1
},
"end": {
"offset": 1,
"line": 1,
"column": 2
}
},
"name": "SyntaxError"
}
and
Uncaught TypeError: trees.map is not a function
at study-ec97f0a8f37dab4ffcae9af541bcc2f7.js?vsn=d:2
at Module.<anonymous> (study-ec97f0a8f37dab4ffcae9af541bcc2f7.js?vsn=d:2)
at n (study-ec97f0a8f37dab4ffcae9af541bcc2f7.js?vsn=d:2)
at Object.<anonymous> (study-ec97f0a8f37dab4ffcae9af541bcc2f7.js?vsn=d:2)
at n (study-ec97f0a8f37dab4ffcae9af541bcc2f7.js?vsn=d:2)
at study-ec97f0a8f37dab4ffcae9af541bcc2f7.js?vsn=d:2
at study-ec97f0a8f37dab4ffcae9af541bcc2f7.js?vsn=d:2
Hello, I am interested in contributing to this project by making the Spanish translation.
Thank you!
I am absolutely sure that my credentials are right. To double-check I have created one more account and it faced the same issue.
At least on the live site, leaving the description field blank causes "Internal server error". Other fields like visibility, category, whether creating from PGN or Lichess study do not seem to affect this behavior. Interestingly enough, the site does seem to validate the description field when it's populated but doesn't have sufficient characters.
After doing a little digging, it seems that the form textarea
tag has minlength
defined to prevent submissions with length less than 20, however it lacks the required
attribute so will still allow empty submissions. See https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fe-minlength
Currently there is no way to know the correct solutions to the Endgames. Some combination of hints and solution and explanation will be very nice addition.
On step 'mix setup' (ran the other steps, and phoenix server started successfully).
Stack trace follows:
The database for Listudy.Repo has already been created 20:25:34.457 [info] Already up [info] [Pow.Store.Backend.MnesiaCache] Mnesia cluster initiated on :nonode@nohost [debug] QUERY ERROR db=47.0ms idle=735.0ms INSERT INTO "users" ("email","password_hash","role","username","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6) RETURNING "id" ["[email protected]", "$pbkdf2-sha512$100000$j7PasHrv6LMbGdCqpYVrTA==$A3+0bz2XFCmQx7OMssNE1nmp+KRUKusLy3ZDV09yut6QCfZwXewEmyXY9RRJH2Z09LVH84uiRRGk/ioaeBKoSQ==", "admin", "Arne", ~N[2020-09-06 03:25:36], ~N[2020-09-06 03:25:36]] ** (Ecto.ConstraintError) constraint error when attempting to insert struct: * users_email_index (unique_constraint) If you would like to stop this constraint violation from raising an exception and instead add it as an error to your changeset, please call
unique_constraint/3on your changeset with the constraint
:nameas an option. The changeset has not defined any constraint. (ecto 3.4.4) lib/ecto/repo/schema.ex:700: anonymous fn/4 in Ecto.Repo.Schema.constraints_to_errors/3 (elixir 1.10.3) lib/enum.ex:1396: Enum."-map/2-lists^map/1-0-"/2 (ecto 3.4.4) lib/ecto/repo/schema.ex:685: Ecto.Repo.Schema.constraints_to_errors/3 (ecto 3.4.4) lib/ecto/repo/schema.ex:666: Ecto.Repo.Schema.apply/4 (ecto 3.4.4) lib/ecto/repo/schema.ex:263: anonymous fn/15 in Ecto.Repo.Schema.do_insert/4 (ecto 3.4.4) lib/ecto/repo/schema.ex:164: Ecto.Repo.Schema.insert!/4 (listudy 0.1.0) lib/listudy/seeds.ex:68: Listudy.Seeds.call/0 (elixir 1.10.3) lib/code.ex:926: Code.require_file/2 (mix 1.10.3) lib/mix/tasks/run.ex:145: Mix.Tasks.Run.run/5 (mix 1.10.3) lib/mix/tasks/run.ex:85: Mix.Tasks.Run.run/1 (mix 1.10.3) lib/mix/task.ex:330: Mix.Task.run_task/3 (mix 1.10.3) lib/mix/task.ex:364: Mix.Task.run_alias/3 (mix 1.10.3) lib/mix/task.ex:292: Mix.Task.run/2 (mix 1.10.3) lib/mix/task.ex:364: Mix.Task.run_alias/3 (mix 1.10.3) lib/mix/task.ex:292: Mix.Task.run/2 (mix 1.10.3) lib/mix/cli.ex:82: Mix.CLI.run_task/2
Hi Arne, thanks for your hard work.
Feature proposal
Have a user setting to adjust a variable time delay between the user placing his/her move and the computer replying with its move.
For example the following settings could be used:
Rationale
I've been using Listudy the past few days to build and practise my openings repertoire. One aspect I'd love to be able to tweak is how fast the computer plays its response move. Currently the computer makes its reply instantly, which is great if I've already learnt my response by heart, but it's very fast when first learning and practising. By having an adjustable delay, the user could practise at a pace they're comfortable with and increase their training speed over time. A variable delay would make the training feel more similar to playing against a real person. A time delay would also provide a space for the user to naturally think about what reply might be made, reinforcing understanding of the lines being practised.
Please let me know your thoughts!
Page reloads randomly while doing tactics and blind tactics on mobile (safari). This does get annoying when you do the first move to a puzzle then it reloads. Especially if it is blind chess then you don’t know why your move is suddenly wrong/not working because the position reset
It would be great to have toggle options for showing moves, glyphs, and comments (imported from Lichess) for studies so that remembering the rationale behind moves become easier.
Would it be possible to generate "official" openings trainings by iterating through an openings database? You could implement it like this:
Let me know what you think.
When in a study, I feel like the left arrow key should revert back to the previous position instead of changing chapter.
And the right arrow key should move the position forwards, but only if the left arrow key has been used.
More than once have I found myself changing chapter instead of moving the position back. It is very frustrating.
Hello, I've found another bug on the website.
When Dark mode is toggled and I select any Endgame puzzles (such as Checkmating > Bishop + Bishop 5), dark mode is automatically toggled off.
Then, if I toggle it back on and return to the home page by clicking the Listudy logo, dark mode is automatically toggled off a 2nd time.
I tried navigating to multiple other pages : blog posts, Tactics section, Studies section, bottom page links (ToS, Copyright, ...), Achievements, etc... . But this problem seems to only happen with Endgame puzzles.
Could this be fixed please? Thanks in advance.
So my idea is we only show board position in text for example:
White: King on b1, pawns on a2, b2 c2.
Black: Rook on h8, King on a8.
User can make move on an empty board or input moves by text.
Can non-opening studies like endgame positions be supported by listudy? When I import a study that doesn't start with the starting position, it shows me the starting position anyway.
Where's the spaced-repetition aspect of this site?
Can chapters be labeled by their name instead of Chapter 1, Chapter 2, etc?
not sure exactly what triggers the reset, it seems to be happening randomly
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0
Hello, and thank you for your precious efforts for open source chess spaced repetition training!
I wanted to ask if there are any plans to add functionality to import non-opening pgns as well. For example one could import a tactics pgn study. This basically means that there shouldn't be a need to define "sides" when importing the pgn. The starting player for each position would be the one you train.
Hi,
I want to contribute to the translation to Turkish.
This will be really useful feature for many of us for incrementally building a repertoire. As a study changes with new lines, we won't have to reimport it and start from the beginning.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.