KRAKKEMAT
Waar vriendschap en schaakplezier samenkomen
Word lid
iTip: Doorheen de site brengt het Krakkemat-logo je terug naar de startpagina.

KRAKKEMAT

SCHAAKCLUB VELDEGEM

Waar vriendschap en schaakplezier samenkomen

Bij onze club draait alles om het plezier en het leren van schaken, ongeacht je leeftijd of ervaringsniveau. Of je nu net begint of al wat ervaring hebt, je bent bij ons thuis.

Iedereen welkom

Iedereen welkom

Voor ervaren schakers én voor wie het spel wil ontdekken.

Gezellige clubavonden

Gezellige clubavonden

Samen schaken, praten en lachen in een warme open sfeer.

Toernooien en competitie

Toernooien & competitie

Voor wie uitdaging zoekt, organiseren we interne competities en toernooien.

Jeugd en ontwikkeling

Jeugd & ontwikkeling

We stimuleren jongeren om te groeien in schaakspel én vriendschap.

Ontdek onze club

Clubavonden

Clubavonden

2-wekelijks
op donderdag

Locatie

Locatie

LDC Veltershof
Koning Albertstraat 11
8210 Veldegem

Initiatie stap 1

Initiatie stap 1

Start om
17:30u

Initiatie stap 2

Initiatie stap
2 & 3

Start om
18:30u

Competitie

Competitie

Start om
19:30u

Online

Online

1x per maand
van september tot en met juni

Trainer Initiatielessen worden verzorgd door gediplomeerde schaaktrainers waarvan er binnen de club momenteel drie actief zijn.

Meer dan een schaakclub

Schaakclub Krakkemat Veldegem is een plek waar mensen samenkomen, leren van elkaar en vriendschappen opbouwen rond het schaakbord.

Of je nu komt om beter te worden, voor de gezelligheid of gewoon uit nieuwsgierigheid... Welkom!

Kom eens langs
Volgend Krakkemat event
Aanvanguur
Volgend event

Nog geen event gepland

Bekijk volledige kalender

KRAKKEMAT

Resultaten & stand generator

Laatste ronde

Preview

Rangschikking

Preview

HTML

KRAKKEMAT

Seizoensoverzicht



2025 -2026

← Terug

Competitieanalyse wordt geladen...

Competitieanalyse na ronde 15

Pos
Naam
Punten
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13
R14
R15
Buc1
1
Vanbelleghem Rudy
25.0
+W12
+W15
+B27
+W16
+B6
-B19
=W9
=W2
+B4
-B3
+W11
-B5
+B7
+W13
-B14
99.5
2
Standaert Marnique
24.5
+W14
-W19
+B20
+W27
+B7
+B4
+W6
=B1
-B3
-W9
+W5
-B16
+W15
-B11
+B10
97.5
3
Pax Walter
23.5
-B19
+W30
BYE
BYE
+B17
+W10
+B13
+B6
+W2
+W1
+B4
-W11
+B5
=B9
+W16
86.5
4
Denolf Tom
23.0
-B6
-W9
+B7
+W13
+B5
-W2
-W16
+B15
-W1
+B12
-W3
+B17
-B8
+W10
+B20
95.0
5
Vanbelleghem Danny
23.0
-B15
+W21
BYE
+B12
-W4
BYE
+B17
+W7
-B9
+W6
-B2
+W1
-W3
+B8
+W23
83.0
6
Vandekerckhove Marc
22.0
+W4
+W7
-B19
+B9
-W1
+B15
-B2
-W3
-W11
-B5
+W12
+B13
+W20
BYE
+B21
94.0
7
Delhaye Brent
20.0
+W10
-B6
-W4
+B25
-W2
+B13
-W19
-B5
+W8
-B11
+B20
BYE
-W1
+B15
-W9
89.0
8
Beuselinck Luc
20.0
BYE
-W27
-B13
BYE
+B20
+W25
+W21
-B11
-B7
-W17
-B14
+B24
+W4
-W5
BYE
58.0
9
Loobuyck Linnert
19.0
BYE
+B4
+W10
-W6
+B11
+W18
=B1
-B19
+W5
+B2
BYE
BYE
BYE
=W3
+B7
79.0
10
Vandaele Ivan
18.0
-B7
+W31
-B9
+W28
-W15
-B3
-W11
+B18
-B12
-W13
-B17
+W21
BYE
-B4
-W2
77.5
11
Lanckriet Kyenzo
18.0
BYE
+B17
+W18
BYE
-W9
BYE
+B10
+W8
+B6
+W7
-B1
+B3
BYE
+W2
BYE
66.0
12
Degraeve Francky
17.5
-B1
+W13
-B16
-W5
-B18
BYE
+W28
+B14
+W10
-W4
-B6
=B15
+W23
BYE
BYE
65.5
13
Vandecasteele Wim
17.0
BYE
-B12
+W8
-B4
+B28
-W7
-W3
+B22
-W15
+B10
+W21
-W6
BYE
-B1
BYE
66.0
14
De Pauw Filip
16.5
-B2
-W20
BYE
+B34
BYE
-W17
+B31
-W12
-B21
BYE
+W8
=B18
+B22
BYE
+W1
47.0
15
De Wael Bart
15.5
+W5
-B1
BYE
+W20
+B10
-W6
BYE
-W4
+B13
BYE
-B16
=W12
-B2
-W7
BYE
70.0
16
Geldof Willem
15.0
+W17
+B18
+W12
-B1
-W19
BYE
+B4
BYE
BYE
BYE
+W15
+W2
BYE
BYE
-B3
60.0
17
Bourgeois Hendrik
15.0
-B16
-W11
+B26
BYE
-W3
+B14
-W5
BYE
BYE
+B8
+W10
-W4
BYE
+B21
BYE
58.0
18
Vandendriessche Tjorben
14.5
+B25
-W16
-B11
BYE
+W12
-B9
BYE
-W10
-B20
-W24
+B26
=W14
BYE
-B23
BYE
49.5
19
De Baenst Bruno
14.0
+W3
+B2
+W6
BYE
+B16
+W1
+B7
+W9
BYE
BYE
BYE
BYE
BYE
BYE
BYE
52.0
20
Wittevrongel Geert
14.0
BYE
+B14
-W2
-B15
-W8
BYE
+B22
BYE
+W18
+B21
-W7
BYE
-B6
BYE
-W4
53.0
21
Callens Donald
14.0
BYE
-B5
BYE
-W22
BYE
+W26
-B8
+B25
+W14
-W20
-B13
-B10
BYE
-W17
-W6
48.5
22
Ananina Bariyat Nadia
12.5
BYE
-B28
-W25
+B21
BYE
BYE
-W20
-W13
-B23
-B30
=W24
-B32
-W14
-B29
BYE
29.0
23
Devos Simon
9.0
BYE
BYE
BYE
BYE
BYE
BYE
+W24
BYE
+W22
BYE
BYE
-B25
-B12
+W18
-B5
22.5
24
Vandekerckhove Jan
9.0
BYE
BYE
BYE
BYE
BYE
BYE
-B23
+W26
BYE
+B18
=B22
-W8
BYE
BYE
=W25
15.5
25
Denys Paul
8.5
-W18
BYE
+B22
-W7
BYE
-B8
BYE
-W21
BYE
BYE
BYE
+W23
BYE
BYE
=B24
23.5
26
Vermeulen Tina
8.0
BYE
BYE
-W17
BYE
BYE
-B21
BYE
-B24
BYE
BYE
-W18
BYE
BYE
BYE
BYE
11.5
27
Verhaeghe Gerard
6.0
+W28
+B8
-W1
-B2
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
24.5
28
Desendere Paul
6.0
-B27
+W22
BYE
-B10
-W13
BYE
-B12
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
16.5
29
Kinds Koen
3.0
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
+W22
-B33
1.5
30
Bostoen Yentl
2.0
BYE
-B3
BYE
BYE
BYE
BYE
BYE
BYE
BYE
+W22
BYE
BYE
BYE
BYE
BYE
10.5
31
David Eddy
2.0
BYE
-B10
BYE
BYE
BYE
BYE
-W14
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
5.5
32
Maes Geert
2.0
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
+W22
BYE
BYE
BYE
0.0
33
Corneillie David
2.0
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
+W29
0.0
34
Hubert Monbailliu
1.0
BYE
BYE
BYE
-W14
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
0.0
35
Eneman Jochen
1.0
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
BYE
0.0

KRAKKEMAT

Seizoensoverzicht

2026 - 2027

← Terug

De competitie is nog jong

Er zijn momenteel nog onvoldoende speelrondes afgewerkt om zinvolle analyses te tonen.

Vanaf ronde 5 verschijnen hier automatisch statistieken, trends en opmerkelijke prestaties uit de competitie.

KRAKKEMAT

Competities

Resultaten & rangschikking

Competitie

Kies de competitie waarvan je de resultaten en rangschikking wilt bekijken.

Seizoen
Type
Rondes

Ronde

Kies een ronde om de uitslagen en de stand na die ronde te bekijken.

Kies een competitie en ronde om de resultaten te bekijken.
Kies een competitie en ronde om de rangschikking te bekijken.

KRAKKEMAT

Resultaten & rangschikking

Huidig seizoen

Resultaten ronde 1

1
De Wael Bart0.0 pt
0-1
Delhaye Brent0.0 pt
2
Devos Simon0.0 pt
0-1
Geldof Willem0.0 pt
3
Loobuyck Linnert0.0 pt
1/2-1/2
Pax Walter0.0 pt
4
Vanbelleghem Danny0.0 pt
1-0
Vanbelleghem Rudy0.0 pt
5
Vandendriessche Tjörben0.0 pt
1-0
De Pauw Filip0.0 pt
6
Degraeve Francky0.0 pt
0-1
Standaert Marnique0.0 pt
7
Vandaele Ivan0.0 pt
0-1
Wittevrongel Geert0.0 pt
8
Ananina Bariyat Nadia0.0 pt
0-1
Kinds Koen0.0 pt

Rangschikking na ronde 1

1
Delhaye Brent
2.0 pt
2
Geldof Willem
2.0 pt
3
Kinds Koen
2.0 pt
4
Standaert Marnique
2.0 pt
5
Vanbelleghem Danny
2.0 pt
6
Vandendriessche Tjörben
2.0 pt
7
Wittevrongel Geert
2.0 pt
8
Beuselinck Luc
2.0 pt
9
Loobuyck Linnert
1.5 pt
10
Pax Walter
1.5 pt
11
Ananina Bariyat Nadia
1.0 pt
12
De Pauw Filip
1.0 pt
13
De Wael Bart
1.0 pt
14
Degraeve Francky
1.0 pt
15
Devos Simon
1.0 pt
16
Vanbelleghem Rudy
1.0 pt
17
Vandaele Ivan
1.0 pt

Resultaten ronde 2

1
Delhaye Brent2.0 pt
0-1
Vanbelleghem Danny2.0 pt
2
Geldof Willem2.0 pt
1-0
Standaert Marnique2.0 pt
3
Vandekerckhove Marc0.0 pt
0-1
Loobuyck Linnert1.5 pt
4
Beuselinck Luc2.0 pt
1/2-1/2
De Wael Bart1.0 pt
5
Denolf Tom0.0 pt
1-0
Degraeve Francky1.0 pt
6
Lanckriet Kyenzo0.0 pt
1-0
Vandekerckhove Jan0.0 pt
7
De Pauw Filip1.0 pt
1-0
Desendere Paul0.0 pt
8
Eneman Jochen0.0 pt
1-0
1 Gast0.0 pt

Rangschikking na ronde 2

1
Geldof Willem
4.0 pt
2
Vanbelleghem Danny
4.0 pt
3
Loobuyck Linnert
3.5 pt
4
Pax Walter
3.5 pt
5
Beuselinck Luc
3.5 pt
6
Delhaye Brent
3.0 pt
7
Standaert Marnique
3.0 pt
8
De Pauw Filip
3.0 pt
9
De Wael Bart
2.5 pt
10
Degraeve Francky
2.0 pt
11
Vandendriessche Tjörben
2.0 pt
12
Denolf Tom
2.0 pt
13
Eneman Jochen
2.0 pt
14
Kinds Koen
2.0 pt
15
Lanckriet Kyenzo
2.0 pt
16
Wittevrongel Geert
2.0 pt
17
Devos Simon
1.0 pt
18
Vanbelleghem Rudy
1.0 pt
19
Vandekerckhove Marc
1.0 pt
20
Desendere Paul
1.0 pt
21
1 Gast
1.0 pt
22
Ananina Bariyat Nadia
1.0 pt
23
Vandaele Ivan
1.0 pt
24
Vandekerckhove Jan
1.0 pt

Resultaten ronde 3

1
Vanbelleghem Danny4.0 pt
1/2-1/2
Geldof Willem4.0 pt
2
Loobuyck Linnert3.5 pt
1-0
Eneman Jochen2.0 pt
3
De Pauw Filip3.0 pt
0-1
Denolf Tom2.0 pt
4
Standaert Marnique3.0 pt
1-0
Lanckriet Kyenzo2.0 pt
5
Wittevrongel Geert2.0 pt
1-0
Vandendriessche Tjörben2.0 pt
6
Kinds Koen2.0 pt
1/2-1/2
Delhaye Brent3.0 pt
7
Pax Walter3.5 pt
1-0
De Wael Bart2.5 pt
8
Vandekerckhove Jan1.0 pt
1-0
Beuselinck Luc3.5 pt
9
Vanbelleghem Rudy1.0 pt
1-0
Ananina Bariyat Nadia1.0 pt
10
Vermeulen Tina0.0 pt
1-0
Callens Donald0.0 pt
11
Degraeve Francky2.0 pt
1-0
Devos Simon1.0 pt
12
Denys Paul0.0 pt
0-1
Vandaele Ivan1.0 pt
13
Vandecasteele Wim0.0 pt
0-1
Maes Geert0.0 pt

Rangschikking na ronde 3

1
Geldof Willem
5.5 pt
2
Vanbelleghem Danny
5.5 pt
3
Loobuyck Linnert
5.5 pt
4
Pax Walter
5.5 pt
5
Standaert Marnique
5.0 pt
6
Delhaye Brent
4.5 pt
7
Beuselinck Luc
4.5 pt
8
Degraeve Francky
4.0 pt
9
De Pauw Filip
4.0 pt
10
Denolf Tom
4.0 pt
11
Wittevrongel Geert
4.0 pt
12
De Wael Bart
3.5 pt
13
Kinds Koen
3.5 pt
14
Vanbelleghem Rudy
3.0 pt
15
Eneman Jochen
3.0 pt
16
Lanckriet Kyenzo
3.0 pt
17
Vandekerckhove Jan
3.0 pt
18
Vandendriessche Tjörben
3.0 pt
19
Vandaele Ivan
3.0 pt
20
Vandekerckhove Marc
3.0 pt
21
Devos Simon
2.0 pt
22
Ananina Bariyat Nadia
2.0 pt
23
Maes Geert
2.0 pt
24
Vermeulen Tina
2.0 pt
25
Desendere Paul
1.0 pt
26
1 Gast
1.0 pt
27
Denys Paul
1.0 pt
28
Callens Donald
1.0 pt
29
Vandecasteele Wim
1.0 pt

KRAKKEMAT

PGN Tool

Van notitieblad naar database

OF IMPORTEER EEN BESTAANDE PGN
Plak hieronder de PGN en klik daarna onder het bord op PGN importeren.
Speler Wit-Speler Zwart
i
PGN importeren
Plaatst de PGN die je hierboven plakte in de zettenlijst.

Gebruiken voor analyse
Kopieert de PGN naar het klembord voor gebruik op Chess.com; Lichess of andere analysetools.

Databaseblok naar klembord - BEHEERDERSTOOL
Kopieert de code die rechtstreeks in de Krakkemat partijendatabase kan worden bewaard. Enkel voor beheerdoeleinden.

Versturen via formulier
Voor leden die hun partij willen doorsturen. Opent het contactformulier en vult automatisch de partijcode in zodat deze kan worden verzonden naar de beheerder.
Nog geen output gegenereerd.
Filters: geen filters actief - alle partijen zichtbaar
Partijen laden...

Partij

KRAKKEMAT PARTIJVIEWER

Speler Wit-Speler Zwart
⌂ Home

KRAKKEMAT

Ledenpaswoord

KRAKKEMAT

Onlinegenerator

Maak online activiteiten voor de kalender.

Eventgegevens

Preview

ONLINE EVENT
Nog geen event
Vul de gegevens in om een preview te zien.
✓ HTML-code werd naar het klembord geschreven

Online club

Krakkemat @ Chess.com

Krakkemat Online

Waar vriendschap en schaakplezier samenkomen.

Vriendschap

We spelen om samen plezier te maken.

Schaakplezier

Resultaten zijn belangrijk, maar plezier komt op de eerste plaats.

Iedereen welkom

Van beginner tot ervaren speler, iedereen mag meedoen.

Respect

We behandelen elkaar met respect, online én aan het bord.

Sportiviteit

Winnen is mooi, maar fair play nog belangrijker.

Volgend online toernooi
Online kalender

Geplande online toernooien

Online archief

Online spelen

Toernooivormen & info

KRAKKEMAT

Wie is wie

Een handig overzicht van de online handles van de leden.

Handle Handle
Naam lid Naam lid

KRAKKEMAT

Stappenmethode

Oplossingen

← Terug

KRAKKEMAT

Bloggenerator

Maak blogartikels en publicatiecode.

Artikelgegevens

Foto-links

Artikeltekst

Partij uit database — optioneel

Preview artikelvoorstel

Previewtegel voor blogoverzicht

Code volledige blogpost — embed voor artikelpagina

Data previewtegel — plakken in blogpagina

}

Blog

Schaakbord
20 mei 2026NieuwsKrakkemat

Nieuwe blogpagina voor Krakkemat

We bouwen aan een stijlvolle blog waar nieuws, tornooien en clubverhalen een vaste plek krijgen.

06/06/2026 · Krakkemat bestuur · Algemene post

Het bord staat klaar!

Krakkemat in een nieuw jasje

Onze vorige eenvoudige website werd opgebouwd met Google Sites en was vooral gericht op onze eigen leden. Dat heeft jarenlang goed gewerkt, maar de club is ondertussen verder gegroeid. Daarom vonden we het tijd voor een modernere website die niet alleen nuttig is voor leden, maar ook als uithangbord dient voor iedereen die Krakkemat wil leren kennen.


Een belangrijke doelstelling was bovendien een optimale ervaring op mobiele toestellen, zodat de website even comfortabel werkt op een smartphone als op een computer.

Op de vernieuwde website vind je nog steeds alle vertrouwde informatie zoals de kalender, clubnieuws, uitslagen, rangschikkingen en de ledenhoek. Daarnaast hebben we ook gewerkt aan een overzichtelijkere structuur, een partijendatabase, een blog, een fotogalerij en extra hulpmiddelen voor onze leden.

Voor bezoekers die onze club nog niet kennen, moet deze website vooral een eerste kennismaking zijn met waar Krakkemat voor staat: een gezellige schaakclub waar vriendschap, respect en schaakplezier centraal staan.

De komende maanden zullen we de website verder aanvullen met nieuwe artikels, foto's, partijen en andere inhoud. Neem dus regelmatig een kijkje.

Veel leesplezier!

Het bestuur van Krakkemat
27/06/2026 · Bestuur Krakkemat · Eventverslag

Einde seizoen & uitreiking trofeeën

Einde seizoen 2025-2026 - uitreiking trofeeën


De weergoden hadden blijkbaar besloten dat het einde van ons 3e schaakseizoen
onder tropische omstandigheden diende plaats te vinden...
Als bestuur stelden we echter met genoegen vast dat een 40-tal van onze leden toch de weg richting het Veltershof genomen hadden om hiervoor aanwezig te zijn.

Na de laatste initiatieles aan de mensen van stap 1 werd er vanaf 18.30u verzameld in de cafétaria.
De club had voor iedere aanwezige 2 drankbonnetjes voorzien en dat werd zeker gretig gesmaakt...
Schaakborden en stukken werden snel in stelling gebracht voor enkele vrijblijvende partijtjes; gedreven zoals echte schakers zijn!

Ondertussen was Internationaal Meester (IM) Tom Piceu ook aangekomen want Tom
had zich voor een 2de keer bereid gevonden om een aanvullende schaakles te komen geven aan de al wat gevorderde spelers.
Ook het uitreiken van de trofeeën aan de 3 spelers die in onze competitie goud, zilver en brons hebben behaald, wou Tom met graagte voor zijn rekening nemen.


Onze voorzitter Luc hield voor elk van hen een passende toespraak (jawel, ze komen van ver en dichtbij) en met een natje en droogje trokken we nadien naar het leslokaal, waar Tom zijn 2e les gaf: profylaxis kregen we mee als wijze boodschap.
We moeten zeggen: het enthousiasme droop letterlijk van iedereen af 😉...

Nadien konden we een mooi seizoen afsluiten in de cafétaria om daarna met grote tevredenheid de warme nacht in te gaan. 

We zien uiteraard al uit naar het volgend schaakseizoen en hopen iedereen terug te zien. Om deze periode te overbruggen, bieden we al binnenkort onze zomerschaak aan.
Bedankt aan al onze enthousiaste schakers, van beginneling tot gevorderde, zowel de tieners als de jong gepensioneerden en vooral ook zijn we zeer blij met onze enthousiaste schaakdames!

Fijne verlofdagen gewenst aan iedereen!
Bestuur Krakkemat

KRAKKEMAT

Galerijgenerator

?

Preview

Nog geen preview.
Nog geen code gegenereerd.

Online shop

Om elke betaling aan de juiste persoon te kunnen koppelen, gelieve eerst uw naam en e-mailadres in te voeren.

Shop

Online betaalgemak

KRAKKEMAT

Shopgenerator

Maak eenvoudig een artikeltegel voor de shop.

Artikel gekopieerd naar klembord.

Preview

Contact

We helpen je graag verder en verwelkomen je met plezier in onze club.

Veltershof Veldegem

LDC Veltershof
Koning Albertstraat 11
8210 Veldegem

Open in Google Maps

Telefonisch contact

Voorzitter Luc Beuselinck0472 25 34 61
Secretaris Danny Vanbelleghem0478 24 18 65

Stuur ons een bericht

Heb je een vraag, wil je graag kennismaken of wens je meer informatie?
Laat gerust een bericht achter — we helpen je met plezier verder.

← Terug naar contact

Stuur ons een bericht

Heb je een vraag, wil je graag kennismaken of wens je meer informatie?
Laat gerust een bericht achter — we helpen je met plezier verder.

← Terug naar contact

Kalender

Een overzicht van onze komende clubactiviteiten.

KRAKKEMAT

Kalendergenerator

Voeg nieuwe activiteiten toe aan de kalender.

Preview

Nog geen preview.
Nog geen code gegenereerd.
KRAKKEMAT

Health

Gezondheidsrapport van de Krakkemat-data.

Databronnen laden

Open ontbrekende databronnen eerst via de knoppen. Keer daarna terug naar Health en klik op vernieuwen.

Privacyverklaring

Hoe KRAKKEMAT Schaakclub Veldegem omgaat met persoonsgegevens, foto’s, contactgegevens en privacy.

1. Wie zijn wij?

KRAKKEMAT Schaakclub Veldegem hecht veel belang aan de bescherming van uw persoonsgegevens en respecteert uw privacy.

Deze privacyverklaring legt uit welke gegevens wij verzamelen, waarom wij dit doen en hoe wij hiermee omgaan.

Verantwoordelijke voor de verwerking:
KRAKKEMAT Schaakclub Veldegem
E-mail: [email protected]

2. Welke persoonsgegevens verzamelen wij?

Afhankelijk van uw contact met onze club kunnen wij volgende gegevens verzamelen:

▸ naam en voornaam
▸ e-mailadres
▸ telefoonnummer
▸ adresgegevens
▸ geboortedatum
▸ gegevens ingevuld via contactformulieren
▸ lidmaatschapsgegevens
▸ foto’s genomen tijdens clubactiviteiten

3. Waarom verwerken wij deze gegevens?

Uw gegevens worden uitsluitend gebruikt voor:

▸ beheer van lidmaatschappen
▸ communicatie met leden en bezoekers
▸ organisatie van clubactiviteiten en tornooien
▸ beantwoorden van vragen via het contactformulier
▸ verzenden van praktische informatie
▸ publiceren van sfeerbeelden van clubactiviteiten
▸ verbeteren van de werking van onze website

4. Op basis waarvan verwerken wij uw gegevens?

Wij verwerken persoonsgegevens op basis van:

▸ uw toestemming
▸ de uitvoering van een overeenkomst, zoals een lidmaatschap
▸ het gerechtvaardigd belang van de vereniging
▸ wettelijke verplichtingen

5. Hoe lang bewaren wij uw gegevens?

Persoonsgegevens worden niet langer bewaard dan noodzakelijk voor de doeleinden waarvoor ze verzameld werden.

6. Delen wij gegevens met derden?

Wij delen persoonsgegevens enkel indien noodzakelijk, bijvoorbeeld met:

▸ hostingproviders van de website
▸ e-maildiensten
▸ schaakfederaties indien vereist voor tornooien of aansluiting

7. Gebruik van foto’s

Deze foto’s kunnen gebruikt worden:

▸ op onze website
▸ op sociale media

Wij proberen steeds respectvol om te gaan met beeldmateriaal. Indien u niet wenst dat foto’s waarop u herkenbaar bent gepubliceerd worden, kan u ons steeds contacteren via [email protected].

8. Cookies

Onze website maakt geen gebruik van analytische of externe cookies.

9. Uw rechten

U heeft steeds het recht om:

▸ uw gegevens in te kijken
▸ foutieve gegevens te laten aanpassen
▸ gegevens te laten verwijderen
▸ bezwaar te maken tegen verwerking
▸ uw toestemming in te trekken

U kan hiervoor contact opnemen via [email protected].

10. Beveiliging van gegevens

Wij nemen passende technische en organisatorische maatregelen om persoonsgegevens te beschermen tegen verlies, misbruik of ongeoorloofde toegang.

11. Externe links

Onze website kan links bevatten naar externe websites. Wij zijn niet verantwoordelijk voor het privacybeleid van andere websites.

12. Wijzigingen aan deze privacyverklaring

KRAKKEMAT Schaakclub Veldegem behoudt zich het recht voor deze privacyverklaring aan te passen indien nodig.

Contact

Voor vragen over deze privacyverklaring of over de verwerking van persoonsgegevens kan u steeds contact opnemen via onze contactpagina.

KRAKKEMAT

Desktop omgeving

Deze beheeromgeving is enkel beschikbaar op desktopapparaten.

Gebruik een computer of laptop

Om fouten te vermijden zijn de beheertools, generators en databankfuncties niet beschikbaar op gsm of tablet.

Terug naar home

Wijzigingsoverzicht

Een overzicht van de ontwikkeling van de Krakkemat-website.

Huidige versie2.7
Start project18/05/26
Ontwikkeling±150 uur
Modules26
Versie 2.7

Competitiebeheer, livenotatie en technische uitbreidingen

Juni 2026

  • Mobiele optimalisaties
  • Diverse verbeteringen aan de weergave op smartphones en tablets.
  • Verbeterde leesbaarheid van kaarten, tabellen, formulieren en navigatie-elementen.
  • Verschillende responsieve weergaveproblemen binnen Carrd opgelost.
  • Verdere harmonisatie van de Krakkemat-huisstijl over de website.
  • Google Analytics
  • Basisintegratie van Google Analytics 4 toegevoegd.
  • Registratie van paginaweergaven en belangrijke gebruikersacties voorbereid.
  • Fundament gelegd voor verdere uitbreiding van bezoekersstatistieken.
  • Formulieren en gegevensdoorstroming
  • Afzonderlijke formulieren ingevoerd voor algemene berichten, PGN Tool en livenotatie.
  • Automatische voorinvulling van naam, e-mailadres en partijgegevens toegevoegd.
  • Betrouwbaarheid van formulierverzending op desktop en mobiele toestellen verbeterd.
  • Doorstroming van gegevens vanuit PGN Tool en livenotatie sterk vereenvoudigd.
  • Livenotatie
  • Nieuwe mobiele tool toegevoegd voor het registreren van partijen tijdens clubactiviteiten.
  • Spelerselectie geïntegreerd via de centrale spelersdatabase (Livenotatie + PGN tool).
  • Ondersteuning toegevoegd voor niet-Krakkemat spelers (PGN tool).
  • Zetregistratie, opslag van conceptpartijen en automatische verzending toegevoegd.
  • PGN delen met jezelf toegevoegd.
  • Centrale spelersdatabase
  • Nieuwe centrale spelerslijst toegevoegd.
  • Beheer van actieve spelers, bestuursleden en speelsterktecategorieën.
  • Integratie met competitiebeheer, livenotatie en PGN Tool.
  • Competitiebeheer
  • Volledig nieuw competitiebeheersysteem ontwikkeld.
  • Beheer van competitie-instellingen en puntentellingen toegevoegd.
  • Nieuwe rondevoorbereider voor aanwezigheidsregistratie gebouwd.
  • Ondersteuning voor bye-spelers toegevoegd.
  • Automatische Swiss pairings zonder dubbele ontmoetingen.
  • Automatische berekening van rangschikkingen met Buchholz 1.
  • Exportmogelijkheden toegevoegd voor publicatie op de website.
  • Projectiemodus
  • Speciale projectieweergave toegevoegd voor gebruik tijdens clubavonden.
  • Geoptimaliseerd voor tv-schermen en projectoren.
  • Vergrote weergave van pairings en ronde-informatie.
  • Technische verbeteringen
  • Diverse optimalisaties aan interne datastructuren.
  • Verbeterde koppelingen tussen tools en databronnen.
  • Uitbreiding van lokale opslag voor tijdelijke gegevens en concepten.
  • Verschillende stabiliteits- en prestatieverbeteringen achter de schermen.
Versie 2.6

Migratie naar live omgeving

7 juni 2026

  • Belangrijkste mijlpaal
  • De volledige Krakkemat-website werd succesvol gemigreerd van de proefomgeving naar de definitieve productieomgeving op krakkemat.be.
  • Na weken van ontwikkeling, testen en optimaliseren draait het volledige platform voortaan op zijn officiële live-omgeving.
  • Deze migratie vormt een belangrijke stap in de verdere uitbouw van de website en haar beheertools.
  • Nieuw
  • Uitgebreid seizoensoverzicht toegevoegd aan de competitiepagina.
  • Nieuwe seizoensanalyse toegevoegd met aanvullende statistieken, prestaties en inzichten.
  • Speeldatum wordt voortaan automatisch weergegeven bij iedere speelronde.
  • Verbeterd
  • PGN Tool verder verfijnd met verschillende gebruiksvriendelijkheidsverbeteringen.
  • Bediening en plaatsing van functies geoptimaliseerd voor sneller gebruik tijdens partij-invoer en analyse.
  • Datumselector van de generator voor uitslagen en rangschikkingen aangepast aan de Krakkemat-huisstijl.
  • Tabbladtitels worden voortaan automatisch aangepast aan de geopende pagina voor betere herkenbaarheid tijdens het navigeren.
  • Probleem met de galerij-preview opgelost waardoor afbeeldingen opnieuw correct worden weergegeven tijdens het beheer.
  • Handleiding van de Bloggenerator uitgebreid met extra uitleg over captions en het gebruik van de knop Blogfoto's.
  • Aanbevolen werkwijzen voor het beheren van blogafbeeldingen toegevoegd aan de documentatie.
  • Status ontwikkeling
  • De focus verschuift geleidelijk van het bouwen van basisfunctionaliteiten naar verfijning, optimalisatie, gebruiksgemak en verdere automatisering van het beheer.
Versie 2.5

Health Tool

Juni 2026

  • Nieuw
  • Nieuwe Health Tool toegevoegd voor controle en diagnose van de website.
  • Controle toegevoegd op aanwezigheid en laadstatus van alle databronnen.
  • Detectie toegevoegd voor dubbele Game ID's in de partijdatabase.
  • Detectie toegevoegd voor dubbele Match ID's in de partijdatabase.
  • Controle toegevoegd op blogartikels die verwijzen naar niet-bestaande partijen.
  • Capaciteitsbewaking toegevoegd voor partijdatabaseblokken (DB-01, DB-02, ...).
  • Capaciteitsbewaking toegevoegd voor centrale datablocks van Blog, Galerij, Kalender en Online.
  • Diagnosepagina geïntegreerd in Webadmin.
  • Nieuwe Webadmin-tegel Diagnose toegevoegd.
  • Verbeterd
  • Gezondheidsrapport toont bezettingsgraad, vrije ruimte en waarschuwingen voor datablocks.
  • Diagnoseoverzicht gegroepeerd per onderdeel voor sneller beheer en foutopsporing.
  • Voorbereiding getroffen voor toekomstige uitbreiding van controles en databronvalidatie.
Versie 2.4

Blog - integratie partijviewer

Juni 2026

  • Nieuw
  • Blogartikels ondersteunen nu interactieve schaakpartijen via Game ID.
  • Nieuwe blogviewer toegevoegd met schaakbord, zettenlijst, navigatieknoppen en bordrotatie.
  • Bloggenerator uitgebreid met invoerveld Game ID en knop "Partij invoegen".
  • Optionele titel boven de partijviewer toegevoegd voor partijverslagen en analyses.
  • Game ID kan automatisch gebruikt worden om partijen uit de partijendatabase op te halen.
  • Handleiding aangepast.
  • Verbeterd
  • Blogviewer volledig geïntegreerd in artikels zonder PGN-opslag in het artikel zelf.
  • Voorbereiding getroffen voor toekomstige SQL-database: blogartikels bewaren enkel een verwijzing naar de partij.
  • Weergave van spelersinformatie in de blogviewer afgestemd op de stijl van de partijendatabase.
  • Zettenlijst herwerkt naar een overzichtelijke kolomweergave.
  • Automatisch meescrollen van de zettenlijst naar de actieve zet toegevoegd.
  • Foto's in blogartikels worden voortaan zonder extra kader weergegeven.
  • Betere compatibiliteit met Carrd door automatische herinitialisatie van de blogviewer na het openen van een artikel.
Versie 2.3

Websitebeheer en ondersteuning

Juni 2026

  • Partijendatabase – Layout van de partijkaarten geoptimaliseerd. Een verborgen breedtebeperking in het grid werd verwijderd waardoor partijkaarten nu correct meeschalen met de breedte van het scrollvenster en de filterbalk. Hierdoor blijven alle onderdelen van de database visueel uitgelijnd en reageren breedteaanpassingen voortaan voorspelbaar.
  • Wijzigingsoverzicht toegevoegd met historiek van de ontwikkeling van de Krakkemat-website.
  • Nieuwe Webadmin-tegel toegevoegd voor het wijzigingsoverzicht.
  • Meldpunt voor websiteproblemen toegevoegd.
  • Apart formulier voorzien voor gebroken links, foutieve informatie, ontbrekende foto's, verkeerde resultaten en technische problemen.
  • Contactpagina uitgebreid met een extra tegel voor probleemmeldingen.
  • Footer uitgebreid met links naar probleemmelding en wijzigingsoverzicht.
Versie 2.2

Optimalisaties en afwerking

Juni 2026

  • Filtersamenvatting toegevoegd aan de partijendatabase.
  • Responsive gedrag verder verbeterd.
  • Scrollvensters en kaartweergave verfijnd.
  • Datumnotatie en formulierdetails verbeterd.
Versie 2.1

Webadmin en handleiding

  • Centrale Webadmin toegevoegd.
  • Overzicht van generators gemaakt.
  • Beheerhandleiding voor bestuursleden opgebouwd.
  • Navigatie tussen beheertools verbeterd.
Versie 2.0

Competitie en partijendatabase gekoppeld

  • MatchId-systeem toegevoegd.
  • Resultaten gekoppeld aan gespeelde partijen.
  • Partijknoppen toegevoegd vanuit de resultatenpagina.
  • Automatische herkenning van spelers voorbereid.
Versie 1.9

Partijendatabase

  • Partijendatabase toegevoegd.
  • Zoekfunctie, filters en sortering toegevoegd.
  • Statistieken voor wit, zwart en remise toegevoegd.
  • Kaartweergave voor partijen ontworpen.
Versie 1.8

PGN Viewer

  • Viewer voor schaakpartijen toegevoegd.
  • Metadata, zettenlijst en bordnavigatie toegevoegd.
  • Bordstijl afgestemd op de PGN Tool.
Versie 1.7

PGN Tool

  • PGN-import en PGN-export toegevoegd.
  • Schaakbord, zettenlijst en navigatie toegevoegd.
  • HTML-export voor de partijendatabase toegevoegd.
Versie 1.6

Shopmodule

  • Shopoverzicht toegevoegd.
  • Shopgenerator gebouwd.
  • Artikelkaarten en betaalknoppen voorzien.
Versie 1.5

Fotogalerij

  • Galerijpagina toegevoegd.
  • Galerijgenerator gebouwd.
  • Lightbox en categoriefilters toegevoegd.
Versie 1.4

Blogsysteem

  • Blogoverzicht toegevoegd.
  • Blogartikelenpagina gebouwd.
  • Bloggenerator, categorieën, zoeken en sorteren toegevoegd.
Versie 1.3

Krakkemat Online

  • Online toernooipagina toegevoegd.
  • Online generator gebouwd.
  • Archief voor online evenementen toegevoegd.
Versie 1.2

Ledenhoek en competitie

  • Ledenhoek toegevoegd.
  • Resultaten en rangschikking toegevoegd.
  • Standengenerator gebouwd.
Versie 1.1

Clubwebsite basis

  • Contactpagina, locatie en clubinformatie toegevoegd.
  • Initiatie- en lidmaatschapsinformatie uitgewerkt.
  • Basisopmaak verder verfijnd.
Versie 1.0

Start project

18 mei 2026

  • Huisstijl vastgelegd.
  • Kleurenschema en Jura-lettertype gekozen.
  • Basisstructuur van de website opgezet.
  • Homepage eerste versie opgebouwd.
Deze website werd ontwikkeld en wordt verder uitgebouwd door vrijwilligers van schaakclub Krakkemat.

1. Algemene basis

Welkom in de cockpit

Deze handleiding is bedoeld voor bestuursleden die:

  • de website mee beheren
  • generators gebruiken
  • data moeten plakken in Carrd
  • liever schaken dan programmeren
Zie je rood? Blijf ervan af.
Zie je groen? Daar mag geplakt worden.

Wat is Carrd?

De Krakkemat-site is gebouwd in Carrd. Wat op de site pagina’s lijken, zijn in Carrd meestal secties binnen dezelfde website.

Een sectie voelt voor bezoekers als een pagina, maar zit in Carrd meestal binnen dezelfde site.

Header, footer en logo

De header is de bovenkant van de site met logo, menu en navigatie. De footer is de onderkant van de site met extra info en links.

Overal op de site geldt: klik op het KRAKKEMAT-logo = terug naar Home.

Verdwaald op de site? Klik op het logo en je bent weer thuis.

Wat is een embedblok?

Carrd laat normaal toe om zonder programmeerkennis een website te bouwen. Dat is ideaal voor eenvoudige websites, basispagina’s, tekst, foto’s en standaardknoppen.

Krakkemat gaat ondertussen veel verder dan een gewone basiswebsite. De site bevat generators, automatische filters, een partijdatabase, een PGN Viewer, een PGN Tool, automatische koppelingen en dynamische competitiepagina’s.

Daarom werd voor grote delen van de website gewerkt met eigen code: maatwerk dat speciaal voor Krakkemat geschreven werd.

De maximale lengte voor een aangepast code-element (Embed) in Carrd is 16.384 tekens.

Carrd bouwt de basis van de auto. De embedblokken bevatten de speciale Krakkemat-motor.

HTML, CSS, JS en DATA

HTML bepaalt wat er op de pagina staat.

<html>
  <body>
    ...
  </body>
</html>

CSS bepaalt hoe het eruit ziet.

<style>
  ...
</style>

JavaScript bepaalt wat de pagina doet.

<script>
  ...
</script>

DATA bepaalt welke inhoud getoond wordt, bijvoorbeeld kmEvents, kmBlogData, kmGalleryItems of kmShopItems.

Commentaar in code

In verschillende generators en databestanden worden commentaarregels gebruikt om aan te geven waar gegevens geplaatst mogen worden. Commentaar wordt door de browser genegeerd en heeft geen invloed op de werking van de website.

Gebruik altijd een geldige commentaarvorm:

// commentaar op één regel
/* commentaarblok */
Een niet-afgesloten commentaarblok kan ervoor zorgen dat gegevens niet meer worden ingelezen. Controleer daarom altijd of een commentaarblok eindigt met */.

Twijfel je? Gebruik dan liever // voor een korte opmerking op één regel.

Waarom zijn er generators gebouwd?

Generators bestaan zodat bestuursleden geen code moeten schrijven, maar gewoon gegevens invullen, een preview bekijken, HTML genereren en op een uniforme manier nieuwe inhoud toevoegen.

De website is de auto. De eigen code is de motor. Bestuursleden vullen vooral de koffer met nieuwe inhoud. De generators zorgen ervoor dat dit eenvoudig, veilig en steeds op dezelfde manier kan.

Wijzigingen bewaren in Carrd

ABSOLUUT NIET VERGETEN

Na elke wijziging in Carrd:
1. klik op het diskette-icoon
2. klik op Publish Changes

Pas daarna worden wijzigingen echt zichtbaar op de website.

Werk je ondertussen al op een openstaande pagina van de website? Refresh of herlaad die pagina dan ook. Anders zie je soms nog de oude versie.

Geplakt of aangepast? Eerst opslaan, dan publiceren. Anders ziet niemand je werk.

2. Paswoorden

Twee soorten paswoorden

Krakkemat gebruikt twee soorten paswoordbeveiliging: de ledenhoek en Webadmin. Die hebben bewust niet dezelfde functie.

Ledenhoek

De ledenhoek gebruikt een eenvoudig zichtbaar paswoord in de code op Carrd. Voor een gewone gebruiker is dit ruim voldoende als basisbeveiliging.

Voor mensen met veel IT-kennis is het paswoord in theorie terug te vinden in de code. Het is dus geen zware professionele beveiliging, maar dat is aanvaardbaar omdat er geen gevoelige informatie staat.

Voor de leek ruim voldoende, voor IT-nerds theoretisch zichtbaar.

Paswoord wijzigen

Ga naar: Carrd → #ledenpaswoord → selecteer embedblok.

Ga helemaal naar het einde van de code en zoek de regel met het paswoord.

else if(password === "simultaan"){
  window.location.href = kmSiteUrl + "#leden8210";
}

Wijzig alleen het woord tussen de aanhalingstekens.

"simultaan"
Niets anders in deze code wijzigen. Alleen het paswoord zelf.

Webadmin

Webadmin is een afgeschermde sectie met knoppen of links naar generators en beheerfuncties. Deze sectie is eveneens niet bedoeld voor gewone leden.

Bij Webadmin zal het paswoord niet zomaar zichtbaar in gewone tekst in de code staan. Dat maakt het beter geschikt voor admin-tools.

LedenhoekWebadmin
Eenvoudig paswoordStrenger paswoord
Makkelijk wijzigbaarMinder zichtbaar
Voor ledenAlleen voor admins
Leden mogen gerust een eenvoudig paswoord hebben. De stuurcabine zelf niet.

3. Homepage

Wat doet de homepage?

De homepage is de centrale landingspagina van de website. Hier krijgen bezoekers meteen een eerste indruk van Krakkemat, belangrijke navigatie, snelle toegang tot de belangrijkste onderdelen en het eerstvolgende clubevent.

Belangrijkste dynamische onderdeel

Op de homepage is vooral Volgend event dynamisch. Dat blok toont automatisch het eerstvolgende geplande event.

Hoe werkt dat?

De homepage krijgt deze informatie niet rechtstreeks. Ze leest deze info uit het datablock op Carrd dat de gegevens van de kalender bevat.

Er wordt geen data geplakt in de homepage zelf.

Wanneer een event voorbij is, wordt automatisch het volgende event gekozen. Daardoor hoeft de homepage normaal niet manueel aangepast te worden.

Pas de kalender aan en de homepage weet vanzelf wat het volgende event is.

4. Kalender

Wat doet de kalender?

De kalender toont komende clubevents, eventdetails en planning van clubactiviteiten in Krakkemat-stijl.

Hoe wordt de kalender beheerd?

De kalender werkt met een Kalendergenerator . Bestuursleden hoeven dus geen code te schrijven.

Herkenbaarheid van events

De kalender werkt met kleuren en subtiele schaduwiconen. Die worden automatisch gekozen in functie van het gekozen eventtype.

Voorbeelden: competitie, les, online, tornooi, initiatie. Deze eventtypes zijn wijzigbaar en kunnen later verder uitgebreid worden.

De kleur en het schaduwicoon vertellen meteen over welk soort event het gaat.

Werkwijze

  1. Vul in de generator de gegevens van het event in.
  2. Bekijk de preview.
  3. Klik op HTML genereren.
  4. Ga naar Carrd → #homehtml → selecteer embedblok kalender DATA.
Waarom staat kalender DATA in #home?

De homepagina toont automatisch de eerstvolgende activiteit uit de kalender.

Daarom staat de kalenderdata in #home zodat deze onmiddellijk beschikbaar is wanneer de website geladen wordt en niet pas wanneer #kalender geopend wordt.

Data plakken

<script>
window.kmEvents = [
//** KALENDERDATA HIERONDER!!! **//
{
  "date": "2026-06-17",
  "type": "competitie",
  "label": "Initiatie & competitie",
  "title": "BE THERE",
  "timeLabel": "om",
  "timeValue": "19:30 uur",
  "location": "LDC Veltershof",
  "note": "Bevestig uw aan- of afwezigheid via de Whatsapp poll",
  "link": "https://voorbeeld-link.be"
},
];
</script>

De link is volledig vrij te kiezen: een Krakkemat-pagina, een externe website, een inschrijvingspagina of eender welke geldige URL.

Event verwijderen

Een event verwijderen gebeurt door het volledige eventblok uit de data te verwijderen.

De kalender is de bron. De homepagina kijkt gewoon mee.

5. Contact

Wat doet deze pagina?

De contactpagina geeft bezoekers contactinformatie, e-mailcontact en telefooncontact.

E-mailknop

De e-mailknop werkt via het ingebouwde Carrd-formulier. Dat formulier stuurt berichten naar het e-mailadres dat in Carrd aan het formulier gekoppeld is.

Screenshot – Recipient Email(s)

E-mailadres wijzigen

Ga naar Carrd → #Contactpagina → klik op het formulier.

In het linkerpaneel zie je Recipient Email(s). Vervang daar het bestaande e-mailadres door het nieuwe gewenste bestemmingsadres.

Wijzig alleen het e-mailadres. De overige formulierinstellingen laat je best ongemoeid.

Telefoonnummers

De getoonde telefoonnummers zijn rechtstreeks klikbaar op mobiele toestellen.

Op smartphone of tablet betekent klikken meteen bellen.

Klik op mail om te schrijven. Klik op een nummer om te bellen.

6. Blog

Wat doet de blogpagina?

De blogpagina toont nieuwsartikels, clubverslagen, aankondigingen, analyses en andere publicaties in uniforme Krakkemat-stijl met overzichtelijke artikeltegels.

Wat ziet de bezoeker?

  • artikeltegels
  • titel
  • datum
  • auteur
  • categorie
  • korte samenvatting
  • tegelafbeelding

Automatische volgorde

Artikels worden automatisch op datum gesorteerd. Het nieuwste artikel verschijnt dus automatisch eerst.

Filteren op soort artikel

Bezoekers kunnen filteren op categorie van artikel.

BELANGRIJK – Zoekfunctie van de blog

De zoekfunctie zoekt alleen in de titel van het artikel.

❌ Niet in de volledige artikeltekst
❌ Niet in de inhoud van het artikel
❌ Niet in verborgen tekst

Belangrijke zoekwoorden zet je dus best ook in de titel.

Hoe worden artikels gemaakt?

De blog werkt met een Bloggenerator .

Mogelijkheden van de generator

  • artikelgegevens invullen
  • tekst schrijven
  • maximaal 3 foto’s toevoegen
  • één foto kiezen als tegelafbeelding
  • een korte beschrijving toevoegen, de ideale plaats voor eventuele bronvermelding van de foto!
  • interactieve schaakpartij toevoegen via Game ID
  • optionele titel boven de partijviewer toevoegen
  • preview bekijken
  • HTML genereren

Foto's toevoegen aan een artikel

Foto's kunnen op twee manieren gebruikt worden in een blogartikel.

  • via een externe afbeelding op internet
  • via een afbeelding die op de Krakkemat-site staat

Een internetlink kan eenvoudig in de generator worden geplakt. De afbeelding blijft zichtbaar zolang ze online beschikbaar blijft.

Aanbevolen werkwijze
Voor maximale betrouwbaarheid plaats je foto's eerst in de sectie #blogfotos van de website.

Zo ben je niet afhankelijk van externe websites en blijven de afbeeldingen beschikbaar.

Let in verband met copyrightrechten op met internetfoto's, vermeld indien nodig de bron (gebruik daarvoor het caption veld). Foto's van Pixabay zijn rechtenvrij.

Een foto in #blogfotos plaatsen

Ga naar:

Carrd → #blogfotos → galerijcontainer

De galerijcontainer is het grote groene blok rond de afbeeldingen.

  • klik links op Add
  • voeg de afbeelding toe
  • sla op
  • publiceer
  1. Open vanuit de Bloggenerator de pagina Blogafbeeldingen via de knop met dezelfde naam.
  • Klik met de rechtermuisknop op de gewenste afbeelding.
  • Kies Afbeeldingslink kopiëren.
  • Plak de link in één van de afbeeldingsvelden van de Bloggenerator.

Foto invoegen in het artikel

  • Plaats de cursor op een nieuwe regel waar de afbeelding moet verschijnen.
  • Ga naar de gewenste afbeeldingen.
  • Klik op Invoegen.

De afbeelding wordt automatisch op de positie van de cursor in het artikel geplaatst.

Plaats foto's bij voorkeur eerst in #blogfotos voordat je het artikel maakt. Zo heb je de juiste afbeeldingslinks onmiddellijk beschikbaar tijdens het schrijven.

Interactieve schaakpartijen

Blogartikels kunnen een interactieve schaakpartij bevatten. De generator gebruikt hiervoor een Game ID.

Hoe krijg je de juiste Game ID?

De Game ID wordt opgehaald via de partijendatabase. Dit is bewust op deze manier ontworpen zodat je je niet kunt vergissen.

  • Ga naar de partijdatabase.
  • Zoek de partij die je in het blogartikel wil gebruiken.
  • Klik op de viewknop van die partij.
  • De partij opent in de viewer en kan desgewenst worden nagespeeld.
  • Tegelijk wordt de juiste Game ID automatisch naar het klembord gekopieerd.
  • Ga naar de Bloggenerator.
  • Plak de Game ID in het veld Game ID met Ctrl + V of via Plakken.

Wanneer een bezoeker het artikel opent:

  • wordt de partij automatisch opgehaald uit de partijdatabase
  • verschijnt een schaakbord
  • verschijnt een zettenlijst
  • kan de bezoeker door de partij navigeren
  • kan het bord gedraaid worden
BELANGRIJK

De partij zelf wordt niet opgeslagen in het blogartikel.

Het artikel bewaart enkel de Game ID.

Daardoor blijven blogartikels compact en is de werking voorbereid op een toekomstige SQL-database.

De partij moet aanwezig zijn in de partijdatabase. Bestaat de opgegeven Game ID niet, dan kan de partij niet worden weergegeven.

Publiceren

Na HTML genereren ga je naar:

Carrd → #blog → blog DATA

Datablock in Carrd

<script>
window.kmBlogData = [

//* PLAK ARTIKELHTML HIERONDER!! *//
{
  title: "test",
  date: "2026-05-21",
  category: "Eventverslag",
  author: "Auteur",
  image: "https://voorbeeld-link.be/foto.jpg",
  excerpt: "Korte samenvatting",
  url: "/blog/test",
  gameId: "20260603-demo-partij"
},
];
</script>

Artikel verwijderen

Een artikel verwijderen doe je door het volledige artikelblok uit de blogdata te verwijderen.

Schrijf je artikel, controleer de preview, voeg eventueel een Game ID toe, plak de code in blogDATA en de blog doet de rest.

7. Galerij

Wat doet de galerij?

De galerij toont foto’s van clubevents, toernooien, lessen, activiteiten en andere momenten binnen Krakkemat.

Filterfunctie

De galerij bevat geen zoekfunctie, maar wel een filterfunctie.

  • categorieën
  • soorten activiteiten
  • fotoblokken

Hoe worden foto’s toegevoegd?

De galerij werkt met een Galerijgenerator .

Mogelijkheden van de generator

  • foto’s toevoegen
  • titel invullen
  • datum kiezen
  • categorie kiezen
  • korte beschrijving toevoegen, maximum 300 tekens
  • HTML genereren

Foto toevoegen

Bij een foto wordt gewerkt met een URL / link naar een afbeelding.

  • afbeelding op de Krakkemat-site, absolute voorkeur
  • externe afbeelding op internet
  • andere geldige afbeeldingslink

Foto op de Krakkemat-website plaatsen

Om foto's op de Krakkemat website te gebruiken, plaats je ze eerst op de niet-publieke fotopagina.

  1. Open Carrd en ga naar #galerijfotos.
  2. Voeg één of meerdere foto's toe zoals je dat normaal doet.
  3. Publiceer de website.
  4. Open vervolgens krakkemat.be/#galerijfotos.
  5. Klik met de rechtermuisknop op de gewenste foto en kopieer de afbeeldingslink zoals je dat op elke andere website zou doen.
  6. Plak deze link in de Galerijgenerator en vul titel, beschrijving, datum en categorie aan.
De pagina #galerijfotos dient uitsluitend als opslagplaats voor foto's die later in de galerij worden gebruikt. Ze is niet opgenomen in de navigatie van de website.

Publiceren

Na HTML genereren plak je de inhoud van het klembord:

Carrd → #galerij → selecteer embedblok galerij DATA

Datablock in Carrd

<script>
const kmGalleryItems = [
// !!! FOTO'S VANAF HIER !!!
{
  "src": "https://voorbeeld-link.be/foto.jpg",
  "title": "Hersensport",
  "text": "Korte beschrijving",
  "date": "2026-08-01",
  "category": "club"
},
];
</script>

Foto verwijderen

Een foto verwijderen doe je door het volledige fotoblok uit de data te verwijderen.

Foto toevoegen, preview bekijken, code plakken en klaar.

8. Shop

Wat doet de shop?

De shop toont clubartikelen, lidgeld en andere producten van Krakkemat in uniforme Krakkemat-stijl.

Hoe worden artikelen toegevoegd?

De shop werkt met een Shopgenerator .

Mogelijkheden van de generator

  • titel invullen
  • prijs bepalen
  • beschrijving toevoegen
  • afbeelding toevoegen
  • betaallink invullen, creatie in Mollie
  • preview bekijken
  • HTML genereren

Preview

De preview toont exact hoe het artikel uiteindelijk in de shop zal verschijnen.

Belangrijk

De generator maakt alleen het shopartikel zelf. Niet de betaling, niet de betaalpagina en niet de betaallink.

Mollie

Zie later hoofdstuk Mollie

In de shopgenerator wordt de Mollie-link alleen ingeplakt. Het is de bestemming van de betaalknop.

Publiceren

Na HTML genereren ga je naar:

Carrd → #shop → shop DATA

Datablock in Carrd

<script>
const kmShopItems = [
// !!! ARTIKELS HIERONDER !!!
{
  title:"bordset",
  image:"https://voorbeeld-link.be/foto.png",
  price:"€ 25",
  text:"Beschrijving van het artikel",
  button:"Bestellen",
  link:"https://voorbeeld-betaallink.be"
},
];
</script>

Opmerking over artikelafbeelding

  • gebruik afbeeldingen met transparante achtergrond
  • gebruik bij voorkeur een interne link op de website
  • een externe link kan ook, zolang de afbeelding online blijft

Artikel verwijderen

Een artikel verwijderen doe je door het volledige artikelblok uit de data te verwijderen.

Maak het artikel, voeg de betaallink in, plak de gegenereerde code in Carrd en het artikel kan betaald worden via de webshop.

9. Ledenhoek

Wat is de ledenhoek?

De ledenhoek is het centrale toegangspunt voor ledeninformatie.

Hoofdmenu

  • Competitie 2026 - ’27
  • Krakkemat online
  • Stappenmethode
  • Initiatie 1ste jaar
  • Krakkemat reglement

Competitie 2026 - ’27

Dit is het belangrijkste beheerde onderdeel binnen de ledenhoek. Hieronder vallen uitslagen, rangschikking en competitierondes.

Krakkemat online

Deze knop leidt naar de pagina Krakkemat online, waar online activiteiten en het online archief beheerd worden.

Stappenmethode

Deze knop leidt naar een pagina met links naar de oplossingen van Stappenmethode 1, 2 en 3.

Initiatie 1ste jaar

Deze knop leidt naar een pagina met externe links naar bronnen die de basisprincipes van schaken uitleggen, inclusief Mora → PDF.

Krakkemat reglement

Deze knop toont het clubreglement en de algemene afspraken.

Bewuste eenvoud

De ledenhoek werd bewust eenvoudig gehouden: snelle toegang, duidelijke navigatie en geen technische complexiteit voor gewone leden.

De ledenhoek is vooral een startmenu. Het echte technische werk zit vooral in Competitie.

10. Krakkemat Online

Wat is Krakkemat Online?

Krakkemat Online verzamelt alle online activiteiten van de club op één centrale plaats.

Hoe wordt de pagina beheerd?

De onlinepagina wordt beheerd via de Online Generator .

Inhoud van de generator

  • categorie kiezen
  • titel invullen
  • beschrijving toevoegen
  • externe link invullen
  • preview bekijken
  • HTML genereren

Links

De link in de generator moet verwijzen naar de toernooilink op chess.com, die is gekoppeld aan de knop 'speel mee'.

Publiceren

Na HTML genereren ga je naar:

Carrd → #online → online DATA

Datablock in Carrd

<script>
const kmOnlineItems = [
// !!! ITEMS HIERONDER !!!
{
  title:"Chess.com",
  text:"Online schaken",
  image:"https://voorbeeld-link.be/logo.png",
  link:"https://www.chess.com"
},
];
</script>

Item verwijderen

Een item verwijderen doe je door het volledige itemblok uit de data te verwijderen.

Na iedere wijziging:

1. klik op het diskette-icoon
2. klik op Publish Changes
Voeg een item toe, controleer de preview, plak de code in Carrd en publiceer de website.

11. Competitiebeheer

Met Competitiebeheer beheer je een competitie van begin tot einde: spelers, competitie-instellingen, rondeplanning, pairing, uitslagen en rangschikking.

Het beheer bestaat uit vier onderdelen. Deze komen overeen met de vier tegels die je ziet op de pagina Competitiebeheer.

Belangrijk
Je hoeft niet bij iedere ronde alle vier de onderdelen te gebruiken. Spelersbeheer en Competitie-instellingen worden vooral gebruikt vóór de start van een competitie. Een gewone speelronde begint meestal bij Rondeplanning.

11.1 De vier onderdelen

Spelersbeheer

Hier wordt de centrale spelerslijst beheerd.

Nieuwe spelers worden hier toegevoegd. Bestaande spelers kunnen worden gewijzigd of actief/inactief worden gezet.

De andere onderdelen van Competitiebeheer gebruiken deze spelerslijst automatisch.

Gebruik Spelersbeheer alleen wanneer er iets aan de spelerslijst moet veranderen. Je hoeft dit dus niet vóór iedere ronde te openen.

Competitie-instellingen

Hier wordt een competitie aangemaakt en worden de vaste spelregels ingesteld.

Daaronder vallen onder andere:

  • de naam van de competitie;
  • het seizoen;
  • het aantal rondes;
  • de puntentelling;
  • de bye-instellingen;
  • het competitietype;
  • de instelling voor de eerste ronde.

Een competitie wordt normaal één keer correct ingesteld vóór de start. Daarna hoeven deze instellingen tijdens het seizoen meestal niet meer gewijzigd te worden.

Rondeplanning

Hier begint een nieuwe speelronde.

In Rondeplanning:

  • kies je de juiste competitie;
  • controleer je het rondenummer en de datum;
  • duid je de aanwezige spelers aan;
  • duid je de afwezige spelers aan;
  • kies je indien nodig een bye-speler.

De status bovenaan helpt je controleren of alles klaar is om te pairen.

Bij een even aantal te pairen spelers wordt de pairingstatus groen. Bij een oneven aantal moet eerst een bye-speler worden aangeduid.

Pairing Generator

Vanuit Rondeplanning ga je naar de Pairing Generator.

Daar wordt de pairing gemaakt. Na afloop van de partijen voer je hier alle uitslagen in en controleer je de nieuwe rangschikking.

De laatste stap is bijzonder belangrijk: Exporteer rondehistoriek.

De export is het eindproduct van de ronde.
Daarmee wordt het werk dat je tijdens de ronde hebt uitgevoerd permanent bewaard. Een ronde is pas volledig afgewerkt wanneer de rondehistoriek in het juiste blok op de website is geplaatst en de website opnieuw is gepubliceerd.

11.2 Een ronde verwerken — vaste werkwijze

Voor een gewone speelronde volg je steeds dezelfde volgorde. Deze werkwijze geldt zowel voor een lange competitie als voor een blitztoernooi.

Stap 1 — Open Rondeplanning

Open Rondeplanning.

Kies de juiste competitie en controleer het voorgestelde rondenummer en de datum.

Stap 2 — Stel de aanwezigheid in

Controleer wie aanwezig en afwezig is.

Verplaats spelers indien nodig tussen Aanwezig en Afwezig.

Controleer daarna de status bovenaan.

Stap 3 — Kies indien nodig een bye

Wanneer een oneven aantal spelers aanwezig is, moet één speler bye krijgen.

Kies de juiste bye-speler en controleer opnieuw de status.

Wanneer alles correct staat, kan je verdergaan naar de pairing.

Stap 4 — Open de Pairing Generator

Klik op Naar pairing.

Controleer de voorgestelde pairing voordat de partijen beginnen.

De pairinggenerator houdt rekening met de beschikbare competitiehistoriek, eerdere tegenstanders, relevante schaakpunten, kleuren en eerdere byes.

Stap 5 — Speel de partijen

De partijen kunnen nu worden gespeeld.

Indien gewenst kan de pairing via de projectieknop op een groter scherm worden weergegeven.

Stap 6 — Vul alle uitslagen in

Na afloop van de partijen voer je voor iedere partij het correcte resultaat in:

  • 1 - 0;
  • 1/2 - 1/2;
  • 0 - 1.

Controleer of alle resultaten ingevuld zijn.

Stap 7 — Controleer de rangschikking

Zodra alle uitslagen ingevuld zijn, wordt de nieuwe rangschikking berekend.

Controleer deze rangschikking voordat je de ronde bewaart.

Stap 8 — Exporteer de rondehistoriek

Klik op Exporteer rondehistoriek.

De volledige afgewerkte ronde wordt nu naar het klembord gekopieerd.

Deze rondehistoriek bevat onder andere:

  • de competitie en het rondenummer;
  • de datum;
  • aanwezige en afwezige spelers;
  • de bye;
  • de pairings;
  • de uitslagen;
  • de rangschikking na de ronde.
Vergeet deze stap niet.
Zonder de rondehistoriek permanent op de website te bewaren, is de afgewerkte ronde nog niet definitief opgeslagen.

Stap 9 — Open het juiste blok in Carrd

Open Carrd en ga op de homepage naar de sectie #homehtml.

Voor iedere voorziene competitie en ronde is daar reeds vooraf een geschikt embedblok aangemaakt.

Maak zelf geen nieuw embedblok aan.
De nodige embedblokken zijn vooraf aangemaakt en technisch correct ingesteld. Je hoeft dus geen instellingen zoals Defer Script Tags te wijzigen.

Zoek het blok dat overeenkomt met de juiste competitie én de juiste ronde.

Bij een lange competitie kan de naamgeving er bijvoorbeeld zo uitzien:

historiek-26-27-1
historiek-26-27-2
historiek-26-27-3
historiek-26-27-4

Bij een blitztoernooi kunnen vooraf bijvoorbeeld blokken voorzien zijn zoals:

historiek-blitz-december-1
historiek-blitz-december-2
historiek-blitz-december-3
historiek-blitz-december-4
historiek-blitz-december-5

De exacte naam kan per competitie verschillen. Controleer daarom altijd goed dat je het blok van de juiste competitie en de juiste ronde opent.

Stap 10 — Plak de rondehistoriek

Open het vooraf aangemaakte embedblok voor deze ronde.

Selecteer en wis de begeleidende tekst die in het blok staat, die is louter informatief. Plak de rondehistoriek die je zonet vanuit de Pairing Generator naar het klembord hebt gekopieerd in het nu LEGE blok.

Plak de export alleen in het blok van de juiste ronde.
Verander de inhoud van eerdere rondes niet.

Stap 11 — Publiceer de website

Publiceer daarna de website.

Pas na het publiceren is de afgewerkte ronde permanent beschikbaar voor het competitiebeheer én voor de weergave van resultaten en rangschikking.

De ronde is nu klaar.

Rondeplanning
→ pairing
→ uitslagen
→ rangschikking
→ rondehistoriek exporteren
→ juiste blok in #homehtml
→ website publiceren.

11.3 Lange competitie

Bij een lange competitie wordt meestal één ronde per speelavond gespeeld.

Je volgt volledig de vaste werkwijze uit hoofdstuk 11.2.

Na het publiceren van de ronde is het werk voor die speelavond klaar. Bij de volgende speelavond open je opnieuw Rondeplanning.

De website gebruikt de reeds gepubliceerde rondehistoriek om de competitie correct verder te zetten en de volgende ronde te bepalen.

Voorbeeld

Na ronde 1 plaats je de export in: historiek-26-27-1
Na ronde 2 in: historiek-26-27-2
Na ronde 3 in: historiek-26-27-3

Iedere ronde blijft dus afzonderlijk bewaard.

11.4 Blitz / ééndagscompetitie

Ook bij een blitztoernooi volg je voor iedere ronde dezelfde vaste werkwijze: pairing, uitslagen, rangschikking, exporteren, plakken en publiceren.

Het verschil is dat meerdere rondes tijdens dezelfde speeldag kort na elkaar worden gespeeld.

Na iedere blitzronde

Na iedere blitzronde:

  1. vul je alle uitslagen in;
  2. controleer je de rangschikking;
  3. klik je op Exporteer rondehistoriek;
  4. plak je de export in het juiste vooraf aangemaakte blok in #homehtml;
  5. publiceer je de website.

Daarna kan je terugkeren en doorgaan naar de volgende ronde.

Volgende ronde

Gebruik Volgende ronde om onmiddellijk verder te gaan met de volgende blitzronde.

Tijdens een blitztoernooi houdt de browser de afgewerkte rondes ook tijdelijk lokaal bij. Daardoor kan de volgende ronde onmiddellijk worden opgebouwd.

Gebruik tijdens het volledige blitztoernooi dezelfde computer en dezelfde browser.
Wis tijdens het toernooi geen browsergegevens of lokale websitegegevens.

De lokale opslag is bedoeld om tijdens het toernooi snel van ronde naar ronde te kunnen gaan.

De permanente bewaring gebeurt echter op dezelfde manier als bij een lange competitie: na iedere ronde de rondehistoriek exporteren, in het juiste blok plaatsen en de website publiceren.

Hierdoor is de praktische werkwijze voor lange competitie en blitz bijna identiek. Het enige echte verschil is dat je bij blitz na het bewaren meteen verdergaat met Volgende ronde.

11.5 Resultaten en rangschikking

De website leest de opgeslagen rondehistoriek automatisch en gebruikt die gegevens om de juiste uitslagen en rangschikking weer te geven.

Er is dus maar één export die je moet onthouden:

Exporteer rondehistoriek

Dezelfde rondehistoriek wordt gebruikt om:

  • de competitie bij een volgende ronde verder te zetten;
  • de uitslagen van gespeelde rondes weer te geven;
  • de rangschikking na iedere ronde weer te geven.

11.6 Snelle checklist

Voor iedere ronde

  1. Open Rondeplanning.
  2. Kies de juiste competitie.
  3. Controleer ronde en datum.
  4. Stel aanwezigen en afwezigen in.
  5. Kies indien nodig een bye.
  6. Ga naar de Pairing Generator.
  7. Controleer de pairing.
  8. Speel de partijen.
  9. Vul alle uitslagen in.
  10. Controleer de rangschikking.
  11. Klik op Exporteer rondehistoriek.
  12. Open Carrd → homepage → #homehtml.
  13. Open het vooraf aangemaakte blok van de juiste competitie en ronde.
  14. Plak de export.
  15. Publiceer de website.
Onthoud vooral dit:
Een ronde is pas volledig afgewerkt wanneer de rondehistoriek in het juiste blok van #homehtml staat én de website opnieuw is gepubliceerd.

Alleen bij blitz

Na het bewaren en publiceren van de ronde ga je terug naar de competitie en gebruik je Volgende ronde.

Daarna herhaal je exact dezelfde procedure voor de volgende blitzronde.

12. PGN Tool

Wat is de PGN Tool?

De PGN Tool is een custom gebouwde Krakkemat-tool voor het invoeren van schaakpartijen.

De tool maakt deel uit van een tri-tool systeem:

  • PGN Tool
  • partijdatabase
  • PGN Viewer

Waarom werd deze tool gebouwd?

De bedoeling is enerzijds de sectie “genoteerde partijen” gedeeltelijk te automatiseren. Anderzijds is het de tool om de Krakkemat database te voeden.

Vroeger werd een partij doorgestuurd via mail, ingegeven op Chess.com, omgezet naar een iframe en manueel in Google Sites geplakt.

Dat gaf regelmatig problemen: verkeerd PGN-formaat, syntaxfouten, analysezetten in de partij, extra verbeterwerk en veel manueel werk.

Waarom de nieuwe PGN Tool beter is

  • het lid voert de partij onmiddellijk correct in
  • fouten kunnen direct verbeterd worden
  • de partij komt semi-automatisch in de partijdatabase
  • de partij kan gekoppeld worden aan uitslagen en rangschikking
  • oudere partijen blijven beschikbaar
  • het iframe-tussenwerk verdwijnt

Hoe werkt de PGN Tool?

Een lid kan zetten invoeren, fouten verbeteren, zetten terugnemen, door de partij navigeren en spelersnamen, datum, ronde en resultaat invullen.

Vergevingsgezind systeem

De tool werd bewust gebruiksvriendelijk en vergevingsgezind gebouwd. Fouten zijn makkelijk te corrigeren, zetten kunnen teruggenomen worden en de partij kan gecontroleerd worden voor verzending.

Twee mogelijkheden na invoer

Optie 1 – PGN kopiëren

De PGN kan naar het klembord gekopieerd worden en daarna in Chess.com, Lichess of een analysetool gebruikt worden.

Optie 2 – Verzenden naar Krakkemat

De PGN Tool zet de partij om naar HTML, vult automatisch een formulier in en stuurt de gegevens door. Het lid vult enkel nog naam en e-mailadres in.

E-mailbestemming

Publiceren in de database

De ontvangen HTML wordt daarna in de partijdatabase geplakt.

Carrd → #kmpartijen → embedblok DATA PARTIJEN
//* PARTIJEN VANAF HIER *//
{
id: "test-001",
pgn: `[Event "Live Chess"]
[Site "Chess.com"]
[Date "2026.05.21"]
[Round "?"]
[White "Pixeleen69"]
[Black "marcvdk1959"]
[Result "1/2-1/2"]

1. d4 d5 2. Nc3 Nf6 3. Bf4 c6 4. e3 e6`
}
//* HIERONDER NIET SCHRIJVEN *//
De volgorde van de embedblokken NOOIT wijzigen. Die structuur wordt gebruikt door filters, zoekfunctie, viewer en koppelingen.

Resultaat

Na publicatie zit de partij in de database, en kan ze door andere toepassingen worden gevonden. Zo zal er (na referesh) een view-icon verschijnen bij de bewuste partij in 'Competitie - rondeuitslagen en rangschikking' en kan de viewer de partij openen.

Voer de partij in, controleer ze, verzend ze en de Krakkemat-tools doen de rest.

13. PGN Viewer

Wat is de PGN Viewer?

De PGN Viewer is een custom gebouwde inline Krakkemat-tool om partijen te bekijken.

Wat betekent inline?

Inline betekent dat de partij rechtstreeks op de website verschijnt.

  • geen externe pagina
  • geen nieuw tabblad
  • geen iframe van een andere website

Alles is volledig geïntegreerd binnen Krakkemat zelf.

Waarom is dat belangrijk?

Dit zorgt voor uniforme Krakkemat-stijl, professionelere uitstraling, minder externe afhankelijkheden, betere gebruikservaring en snellere toegang tot partijen.

Oude werkwijze

Vroeger werden partijen vaak op Chess.com ingegeven, omgezet naar een iframe en manueel op Google Sites geplaatst.

Nieuwe werkwijze

Met de nieuwe PGN Viewer blijft alles binnen het Krakkemat-ecosysteem (eigen beheer, geen afhankelijkheid van externe diensten of toepassingen of tools).

Hoe werkt de viewer?

Wanneer een partij geopend wordt, leest de viewer automatisch de PGN uit de database.

  • schaakbord
  • zetlijst
  • spelersinformatie
  • resultaat
  • eventinformatie
  • navigatieknoppen

Automatische koppeling

De viewer werkt samen met het view-icon op de competitiepagina (ronde-uitslagen & rangschikking). Wanneer een bezoeker op het view-icon klikt, opent automatisch de juiste partij in de viewer.

Databasegestuurd systeem

De viewer werkt volledig op basis van databasegegevens. Daardoor moeten geen volledige pagina’s manueel worden aangepast.

Groot voordeel

De website groeit hierdoor stilaan naar een volledig eigen schaakecosysteem met eigen database, viewer, tools en publicatiesysteem.

Koppeling met blog (nodig? nuttig? te bespreken)

Ook blogartikels kunnen later automatisch partijen openen in de viewer wanneer de partij correct in de database staat en de koppeling aanwezig is.

Een handige afspraak is om in de PGN bij event in te vullen:

Blog
Klik op een partij en Krakkemat opent ze rechtstreeks op de website zelf.

14. Partijdatabase

Wat is de partijdatabase?

De partijdatabase is de centrale opslagplaats van alle schaakpartijen binnen Krakkemat.

Hier worden competitiewedstrijden, blogpartijen, analyses, historische partijen en andere PGN-partijen bewaard.

Belangrijk

De database werkt rechtstreeks samen met de PGN Tool, de PGN Viewer, de competitiepagina en de blog.

Daardoor ontstaat één groot gekoppeld schaakecosysteem.

Huidige werking

Momenteel staat de database rechtstreeks in de websitecode zelf. De partijen zitten dus letterlijk in de Carrd-website verwerkt.

Waarom werd hiervoor gekozen?

Omdat dit snel opstartbaar was, eenvoudig te beheren is, geen aparte serverontwikkeling vraagt en perfect bruikbaar is in de opstartfase.

Belangrijk voor bestuursleden

De huidige database is perfect geschikt voor de groeifase van Krakkemat. Tot ongeveer enkele honderden partijen vormt dit normaal geen groot probleem.

Groot verschil met een echte database

Momenteel gebeurt bij het openen van de website vaak het laden van een groot deel van de volledige websitecode, ook wanneer slechts één partij gezocht wordt.

Waarom is dat later minder ideaal?

  • alles wordt zwaarder
  • zoeken wordt trager
  • te veel data moet geladen worden
  • de websitecode groeit sterk aan

Wat gebeurt later waarschijnlijk?

Op langere termijn zal Krakkemat waarschijnlijk overschakelen naar een echte aparte database. Dat is volledig normaal en hoort bij de groei van het systeem.

Wat is SQL?

SQL is een echte aparte databankstructuur. Daarin worden partijen apart opgeslagen, apart opgevraagd en apart gefilterd.

Groot voordeel van SQL

Bij een echte SQL-database wordt alleen de gevraagde data geladen, bijvoorbeeld alleen de partijen van één speler.

Toegang tot het hostingpakket

Toegang tot het hostingpakket is zeer belangrijk, omdat daar later databanken, koppelingen, hostinginstellingen en serverfuncties beheerd worden.

Wat ontbreekt momenteel nog?

  • technische creatie van de databank
  • koppeling met de websitecode
  • ontwikkeling van zoek- en laadstructuur

Toekomstvisie

De bedoeling is dat Krakkemat later kan beschikken over een grote eigen partijdatabase, spelerfilters, automatische koppelingen, statistieken, spelerpagina’s, uitgebreide zoekmogelijkheden en automatische publicaties.

Belangrijk inzicht

De huidige website is niet zomaar een gewone clubwebsite, maar de basis van een volledig eigen schaakplatform.

Nu zit de database nog in de website zelf. Later verhuist ze waarschijnlijk naar een echte aparte databank. Dat is geen probleem, maar juist een teken dat Krakkemat groeit.

Tot slot

Deze handleiding werd opgebouwd zodat bestuursleden zelfstandig met de website kunnen werken, generators correct gebruikt worden, data uniform verwerkt wordt, de website beheersbaar blijft en toekomstige uitbreidingen mogelijk blijven.

Belangrijk inzicht

Krakkemat is ondertussen meer dan een gewone clubwebsite.

  • eigen generators
  • eigen partijdatabase
  • eigen viewer
  • eigen PGN Tool
  • automatische koppelingen
  • groeiende digitale structuur

Evolutie van het systeem

Het systeem zal stap voor stap blijven evolueren. Nieuwe tools, koppelingen en databankstructuren zijn geen teken dat iets fout loopt, maar juist een teken dat Krakkemat digitaal verder groeit.

De huidige website vormt de basis voor toekomstige uitbreidingen. Nieuwe functies zullen geleidelijk toegevoegd worden zonder de bestaande werking te verstoren.

Voor bestuursleden

De belangrijkste regel blijft:

  • werk rustig
  • wijzig alleen wat nodig is
  • respecteer rode waarschuwingsblokken
  • vergeet nooit op te slaan en te publiceren
Een website hoeft niet ingewikkeld te zijn. Begrijp wat je aanpast, werk stap voor stap en laat de tools het zware werk doen.

Versiebeheer

Deze handleiding is versie 1.2 – compatibel met de meest recente versie van het wijzigingsbeheer.

Latere uitbreidingen kunnen extra screenshots toevoegen, Mollie integreren, nieuwe generators beschrijven, toekomstige databankstructuren documenteren en Webadmin verder uitbreiden.

De cockpit staat klaar. Nu gewoon rustig blijven rijden.

KRAKKEMAT

Spelerslijst

Beheer de spelerslijst voor competitiebeheer, PGN Tool en live registratie.

Speler toevoegen / wijzigen

Na iedere wijziging moet de spelerslijst opnieuw geëxporteerd worden naar "kmsot spelers data" op #homehtml en de website opnieuw gepubliceerd worden.

Spelerslijst

0 spelers
Nog geen spelers toegevoegd.
✓ Spelerslijst werd naar het klembord geschreven

KRAKKEMAT

Competitie-instellingen

Beheer de instellingen voor clubcompetities, blitzavonden en tornooien.

Competitie toevoegen / wijzigen

Competitie-instellingen worden normaal slechts één keer aangemaakt. Na export moeten ze vervangen worden in "kmsot competitie data" op #homehtml en daarna moet de website opnieuw gepubliceerd worden.

Wanneer "Op ELO" gekozen wordt maar minstens één actieve speler ELO 0 heeft, schakelt de pairing automatisch over naar willekeurig.

Competities

0 competities
Nog geen competities toegevoegd.
✓ Competitie-instellingen werden naar het klembord geschreven

KRAKKEMAT

Rondevoorbereider

Kies de competitie, ronde, datum, aanwezigen en eventuele bye vóór de pairing.

Rondegegevens

Kies een competitie om de rondecontrole uit te voeren.

Status

Aanwezig0
Afwezig0
Bye0
Te pairen0

Bye

Bij een oneven aantal aanwezige spelers moet één speler bye krijgen. Als de competitie dit vereist, kunnen enkel bestuursleden bye krijgen.

Geen bye nodig zolang het aantal aanwezige spelers even is.
✓ Actie uitgevoerd

Aanwezige spelers

Nog geen aanwezige spelers aangeduid.

Afwezige spelers

0 spelers
Geen spelers geladen.
window.kmRoundSetupApp = (function(){ "use strict"; const app = {}; app.STORAGE_KEY = "kmRoundSetup"; /*================================================== DATA ==================================================*/ app.players = []; app.competitions = []; app.rounds = []; app.presentPlayers = []; app.absentPlayers = []; app.byePlayer = null; /*================================================== ELEMENTEN ==================================================*/ app.el = { competition: document.getElementById("kmRoundCompetition"), round: document.getElementById("kmRoundNumber"), date: document.getElementById("kmRoundDate"), controlMessage: document.getElementById("kmRoundControlMessage"), presentCount: document.getElementById("kmRoundPresentCount"), absentCount: document.getElementById("kmRoundAbsentCount"), byeCount: document.getElementById("kmRoundByeCount"), pairingCount: document.getElementById("kmRoundPairingCount"), presentList: document.getElementById("kmRoundPresentList"), absentList: document.getElementById("kmRoundAbsentList"), byeSelect: document.getElementById("kmRoundByePlayer"), byeMessage: document.getElementById("kmRoundByeMessage"), search: document.getElementById("kmRoundPlayerSearch"), playerCount: document.getElementById("kmRoundPlayerCount"), nextRoundBtn: document.getElementById("kmNextRoundBtn"), saveBtn: document.getElementById("kmSaveRoundSetupBtn"), clearBtn: document.getElementById("kmClearRoundSetupBtn"), saveMessage: document.getElementById("kmRoundSaveMessage") }; /*================================================== LADEN ==================================================*/ app.loadPlayers = function(){ if(Array.isArray(window.kmPlayers)){ app.players = window.kmPlayers .filter(function(player){ return player.active; }) .slice(); } }; app.loadCompetitions = function(){ if(Array.isArray(window.kmCompetitionSettings)){ app.competitions = window.kmCompetitionSettings.slice(); } }; app.loadRounds = function(){ if(Array.isArray(window.kmCompetitionRounds)){ app.rounds = window.kmCompetitionRounds.slice(); } }; /*================================================== COMPETITIES ==================================================*/ app.fillCompetitionSelect = function(){ const select = app.el.competition; select.innerHTML = ''; app.competitions.forEach(function(comp){ const option = document.createElement("option"); option.value = comp.id; option.textContent = comp.name; select.appendChild(option); }); }; /*================================================== RONDECONTROLE ==================================================*/ app.getLastRound = function(competitionId){ let last = 0; app.rounds.forEach(function(round){ const roundCompetitionId = String( round.competitionId ?? round.c ?? "" ); const roundNumber = Number( round.round ?? round.r ?? 0 ); if( roundCompetitionId === competitionId && roundNumber > last ){ last = roundNumber; } }); return last; }; app.updateRoundControl = function(){ const competitionId = app.el.competition.value; if(!competitionId){ app.el.controlMessage.textContent = "Kies eerst een competitie."; return; } const comp = app.getCompetition(); if(!comp){ app.el.controlMessage.textContent = "Competitie niet gevonden."; return; } const historicalLast = app.getLastRound( competitionId ); const singleDay = app.isSingleDayCompetition(comp); /*================================================== LANGDURIGE COMPETITIE Enige bron voor vorige rondes: window.kmCompetitionRounds ==================================================*/ if(!singleDay){ const expected = historicalLast + 1; if(!app.readRound()){ app.writeRound( expected ); } const current = app.readRound(); if(current === expected){ app.el.controlMessage.textContent = historicalLast > 0 ? "Laatste gespeelde ronde is " + historicalLast + ". Volgende ronde is " + expected + "." : "Dit is de eerste ronde van deze competitie."; return; } if(current <= historicalLast){ app.el.controlMessage.textContent = "FOUT: ronde " + current + " bestaat reeds in de gepubliceerde historiek."; return; } app.el.controlMessage.textContent = "FOUT: volgende ronde moet ronde " + expected + " zijn."; return; } /*================================================== 1 DAG / BLITZ Hier mag de lokale voorbereiding wel mee bepalen waar de avond gebleven is. ==================================================*/ let savedRound = 0; try{ const raw = localStorage.getItem( app.STORAGE_KEY ); const saved = raw ? JSON.parse(raw) : null; if( saved && saved.competitionId === competitionId ){ savedRound = Number(saved.round) || 0; } }catch(e){} const lastKnown = Math.max( historicalLast, savedRound ); const expected = lastKnown + 1; if(!app.readRound()){ app.writeRound( expected ); } const current = app.readRound(); if( savedRound > 0 && current === savedRound ){ app.el.controlMessage.textContent = "Ronde " + current + " is de huidige ronde van deze blitz/ééndagscompetitie."; return; } if(current === expected){ app.el.controlMessage.textContent = "Volgende ronde is correct (" + expected + ")."; return; } if(current <= historicalLast){ app.el.controlMessage.textContent = "FOUT: ronde " + current + " bestaat reeds in de historiek."; return; } app.el.controlMessage.textContent = "FOUT: volgende ronde moet ronde " + expected + " zijn."; }; app.escapeHtml = function(value){ return String(value); }; return app; })();
(function(){ "use strict"; const app = window.kmRoundSetupApp; if(!app) return; /*================================================== HELPERS SPELERS ==================================================*/ app.playerName = function(player){ return [ player.lastName || "", player.firstName || "" ].join(" ").trim(); }; app.sortPlayers = function(list){ return list.slice().sort(function(a,b){ const an = String(a.lastName || "").localeCompare(String(b.lastName || ""),"nl"); if(an !== 0) return an; return String(a.firstName || "").localeCompare(String(b.firstName || ""),"nl"); }); }; app.getPlayerById = function(id){ return app.players.find(function(player){ return player.id === id; }) || null; }; app.isPresent = function(id){ return app.presentPlayers.indexOf(id) >= 0; }; app.isBye = function(id){ return app.byePlayer === id; }; app.getCompetition = function(){ const id = app.el.competition.value; return app.competitions.find(function(comp){ return comp.id === id; }) || null; }; /*================================================== RONDEVELD UITLEZEN / SCHRIJVEN ==================================================*/ app.getRoundField = function(){ const fields = Array.from( document.querySelectorAll( 'input#kmRoundNumber, input[type="number"][id="kmRoundNumber"]' ) ); /* Neem bij voorkeur het zichtbare rondeveld. */ const visibleField = fields.find(function(field){ return field.offsetParent !== null; }); /* Anders terugvallen op het oorspronkelijk gekoppelde veld. */ return ( visibleField || fields[0] || app.el.round || null ); }; app.readRound = function(){ const field = app.getRoundField(); if(!field){ return 0; } return ( Number(field.value) || 0 ); }; app.writeRound = function(value){ const field = app.getRoundField(); if(!field){ return; } field.value = value === null || value === undefined ? "" : String(value); }; /*================================================== COMPETITIETYPE ==================================================*/ app.isSingleDayCompetition = function(comp){ return !!( comp && comp.competitionMode === "singleDay" ); }; app.updateCompetitionModeUi = function(){ const comp = app.getCompetition(); const singleDay = app.isSingleDayCompetition(comp); if(!app.el.nextRoundBtn){ return; } /* Geen competitie gekozen: knop niet tonen. */ if(!comp){ app.el.nextRoundBtn.style.display = "none"; return; } /* 1 dag / blitz: Volgende ronde is beschikbaar. Langdurig: Volgende ronde bestaat functioneel niet. */ app.el.nextRoundBtn.style.display = singleDay ? "" : "none"; }; /*================================================== AANWEZIG / AFWEZIG ==================================================*/ app.setAllAbsent = function(){ app.presentPlayers = []; app.byePlayer = null; app.renderPlayers(); }; app.addPresent = function(id){ if(app.presentPlayers.indexOf(id) < 0){ app.presentPlayers.push(id); } app.renderPlayers(); }; app.removePresent = function(id){ app.presentPlayers = app.presentPlayers.filter(function(playerId){ return playerId !== id; }); if(app.byePlayer === id){ app.byePlayer = null; } app.renderPlayers(); }; /*================================================== BYE ==================================================*/ app.getByeCandidates = function(){ const comp = app.getCompetition(); let candidates = app.presentPlayers .map(app.getPlayerById) .filter(Boolean); if(comp && comp.byeBoardOnly){ candidates = candidates.filter(function(player){ return !!player.boardMember; }); } return app.sortPlayers(candidates); }; app.updateByeSelect = function(){ const select = app.el.byeSelect; const comp = app.getCompetition(); const presentCount = app.presentPlayers.length; select.innerHTML = ''; if(presentCount % 2 === 0){ app.byePlayer = null; app.el.byeMessage.textContent = "Geen bye nodig: het aantal aanwezige spelers is even."; select.disabled = true; return; } const candidates = app.getByeCandidates(); candidates.forEach(function(player){ const option = document.createElement("option"); option.value = player.id; option.textContent = app.playerName(player); select.appendChild(option); }); select.disabled = false; if(app.byePlayer){ const valid = candidates.some(function(player){ return player.id === app.byePlayer; }); if(!valid){ app.byePlayer = null; } } select.value = app.byePlayer || ""; if(candidates.length === 0){ app.el.byeMessage.textContent = "FOUT: er is een bye nodig, maar er is geen geldige bye-speler beschikbaar."; return; } if(comp && comp.byeBoardOnly){ app.el.byeMessage.textContent = "Er is een bye nodig. Volgens deze competitie mogen enkel bestuursleden bye krijgen."; }else{ app.el.byeMessage.textContent = "Er is een bye nodig. Kies één aanwezige speler."; } }; /*================================================== RENDER SPELERS ==================================================*/ app.createPlayerRow = function(player,type){ const isPresent = type === "present"; const row = document.createElement("div"); row.className = "km-round-player-row"; const btn = document.createElement("button"); btn.type = "button"; btn.className = isPresent ? "km-round-player-btn is-remove" : "km-round-player-btn"; btn.textContent = isPresent ? "−" : "+"; if(isPresent){ btn.setAttribute("data-remove-present",player.id); }else{ btn.setAttribute("data-add-present",player.id); } const middle = document.createElement("div"); const name = document.createElement("div"); name.className = "km-round-player-name"; name.textContent = app.playerName(player); const meta = document.createElement("div"); meta.className = "km-round-player-meta"; meta.innerHTML = player.boardMember ? "Bestuurslid" : " "; middle.appendChild(name); middle.appendChild(meta); const status = document.createElement("div"); status.className = "km-round-player-meta"; status.textContent = app.isBye(player.id) ? "Bye" : (isPresent ? "Aanwezig" : "Afwezig"); row.appendChild(btn); row.appendChild(middle); row.appendChild(status); return row; }; app.renderPresentList = function(){ app.el.presentList.innerHTML = ""; const present = app.sortPlayers( app.presentPlayers .map(app.getPlayerById) .filter(Boolean) ); if(present.length === 0){ const empty = document.createElement("div"); empty.className = "km-empty-state"; empty.textContent = "Nog geen aanwezige spelers aangeduid."; app.el.presentList.appendChild(empty); return; } present.forEach(function(player){ app.el.presentList.appendChild( app.createPlayerRow(player,"present") ); }); }; app.renderAbsentList = function(){ app.el.absentList.innerHTML = ""; const q = app.el.search.value.trim().toLowerCase(); const absent = app.sortPlayers( app.players.filter(function(player){ return !app.isPresent(player.id); }) ).filter(function(player){ if(!q) return true; return app.playerName(player).toLowerCase().includes(q); }); app.el.playerCount.textContent = absent.length === 1 ? "1 afwezige speler" : absent.length + " afwezige spelers"; if(absent.length === 0){ const empty = document.createElement("div"); empty.className = "km-empty-state"; empty.textContent = "Geen afwezige spelers gevonden."; app.el.absentList.appendChild(empty); return; } let currentLetter = ""; absent.forEach(function(player){ const rawLetter = String(player.lastName || player.firstName || "?").trim(); const letter = rawLetter ? rawLetter.charAt(0).toUpperCase() : "?"; if(letter !== currentLetter){ currentLetter = letter; const letterEl = document.createElement("div"); letterEl.className = "km-round-letter"; letterEl.textContent = letter; app.el.absentList.appendChild(letterEl); } app.el.absentList.appendChild( app.createPlayerRow(player,"absent") ); }); }; app.updateCounts = function(){ const presentCount = app.presentPlayers.length; const absentCount = app.players.length - presentCount; const byeCount = app.byePlayer ? 1 : 0; const pairingCount = presentCount - byeCount; app.el.presentCount.textContent = presentCount; app.el.absentCount.textContent = absentCount; app.el.byeCount.textContent = byeCount; app.el.pairingCount.textContent = pairingCount; /*---------------------------------- VISUELE PAIRINGSTATUS ----------------------------------*/ const pairingCard = app.el.pairingCount ? app.el.pairingCount.closest( ".km-round-status-card" ) : null; if(pairingCard){ pairingCard.classList.remove( "is-pairing-ok", "is-pairing-error" ); /* Nog geen spelers: neutrale toestand. */ if(presentCount === 0){ return; } /* Geldig: minstens twee spelers te pairen en een even aantal. */ if( pairingCount >= 2 && pairingCount % 2 === 0 ){ pairingCard.classList.add( "is-pairing-ok" ); return; } /* Oneven / nog geen geldige bye: actie vereist. */ pairingCard.classList.add( "is-pairing-error" ); } }; app.renderPlayers = function(){ app.updateByeSelect(); app.renderPresentList(); app.renderAbsentList(); app.updateCounts(); }; /*================================================== EVENTS SPELERS ==================================================*/ app.bindPlayerEvents = function(){ app.el.absentList.addEventListener("click",function(e){ const btn = e.target.closest("[data-add-present]"); if(!btn) return; app.addPresent(btn.getAttribute("data-add-present")); }); app.el.presentList.addEventListener("click",function(e){ const btn = e.target.closest("[data-remove-present]"); if(!btn) return; app.removePresent(btn.getAttribute("data-remove-present")); }); app.el.byeSelect.addEventListener("change",function(){ app.byePlayer = app.el.byeSelect.value || null; app.renderPlayers(); }); app.el.search.addEventListener("input",function(){ app.renderAbsentList(); }); }; })();
(function(){ "use strict"; const app = window.kmRoundSetupApp; if(!app) return; /*================================================== DATUM UITLEZEN ==================================================*/ app.readDate = function(){ const fields = Array.from( document.querySelectorAll( 'input#kmRoundDate, input[type="date"][id="kmRoundDate"]' ) ); /* Neem eerst een zichtbaar ingevuld datumveld. */ const visibleField = fields.find(function(field){ return ( field.value && field.offsetParent !== null ); }); /* Anders eender welk ingevuld datumveld. */ const filledField = visibleField || fields.find(function(field){ return !!field.value; }); /* Laatste terugval: het oorspronkelijk gekoppelde veld. */ const field = filledField || app.el.date; return field ? String(field.value || "").trim() : ""; }; /*================================================== RONDENUMMER UITLEZEN ==================================================*/ app.readRound = function(){ const fields = Array.from( document.querySelectorAll( 'input#kmRoundNumber, input[type="number"][id="kmRoundNumber"]' ) ); const visibleField = fields.find(function(field){ return ( field.value && field.offsetParent !== null ); }); const filledField = visibleField || fields.find(function(field){ return !!field.value; }); const field = filledField || app.el.round; return field ? Number(field.value) || 0 : 0; }; /*================================================== VALIDATIE ==================================================*/ app.validate = function(){ const comp = app.getCompetition(); if(!comp){ alert("Kies eerst een competitie."); return false; } if(!app.readRound()){ alert("Vul een ronde in."); return false; } const selectedDate = app.readDate(); if(!selectedDate){ alert("Vul een datum in."); return false; } const historicalLast = app.getLastRound( comp.id ); const current = app.readRound(); const singleDay = app.isSingleDayCompetition(comp); /*---------------------------------- LANGDURIG ----------------------------------*/ if(!singleDay){ const expected = historicalLast + 1; if(current !== expected){ alert( "Deze ronde sluit niet aan op de gepubliceerde historiek. " + "Verwachte ronde: " + expected + "." ); return false; } /*---------------------------------- 1 DAG / BLITZ ----------------------------------*/ }else{ let savedRound = 0; try{ const raw = localStorage.getItem( app.STORAGE_KEY ); const saved = raw ? JSON.parse(raw) : null; if( saved && saved.competitionId === comp.id ){ savedRound = Number(saved.round) || 0; } }catch(e){} const expected = Math.max( historicalLast, savedRound ) + 1; const isSavedPreparation = savedRound > 0 && current === savedRound; const isNextRound = current === expected; if( !isSavedPreparation && !isNextRound ){ alert( "Deze ronde sluit niet aan op de blitzhistoriek. " + "Verwachte ronde: " + expected + "." ); return false; } } if(app.presentPlayers.length < 2){ alert("Duid minstens twee aanwezige spelers aan."); return false; } if(app.presentPlayers.length % 2 === 1 && !app.byePlayer){ alert("Er is een oneven aantal aanwezigen. Kies eerst een bye-speler."); return false; } const pairingCount = app.presentPlayers.length - (app.byePlayer ? 1 : 0); if(pairingCount < 2){ alert("Er blijven te weinig spelers over om te pairen."); return false; } if(pairingCount % 2 !== 0){ alert("Het aantal te pairen spelers moet even zijn."); return false; } if(app.byePlayer){ const bye = app.getPlayerById(app.byePlayer); if(!bye){ alert("De gekozen bye-speler bestaat niet meer."); return false; } if(app.presentPlayers.indexOf(app.byePlayer) < 0){ alert("De gekozen bye-speler is niet aanwezig."); return false; } if(comp.byeBoardOnly && !bye.boardMember){ alert("Volgens deze competitie mag enkel een bestuurslid bye krijgen."); return false; } } return true; }; /*================================================== BEWAREN ==================================================*/ app.getPairingPlayers = function(){ return app.presentPlayers.filter(function(id){ return id !== app.byePlayer; }); }; app.buildSetup = function(){ return { competitionId:app.el.competition.value, round:app.readRound(), date:app.readDate(), presentPlayers:app.presentPlayers.slice(), absentPlayers:app.players .filter(function(player){ return app.presentPlayers.indexOf(player.id) < 0; }) .map(function(player){ return player.id; }), byePlayer:app.byePlayer, pairingPlayers:app.getPairingPlayers() }; }; app.saveSetup = function(){ if(!app.validate()) return; const setup = app.buildSetup(); localStorage.setItem( app.STORAGE_KEY, JSON.stringify(setup) ); window.dispatchEvent( new CustomEvent( "km:round-setup-saved", { detail:setup } ) ); const pairingWindow = window.open( window.location.origin + window.location.pathname + "#pairing", "_blank" ); if(!pairingWindow){ alert( "Het pairingtabblad kon niet worden geopend. Sta pop-ups toe voor deze website." ); } }; app.loadSetup = function(){ try{ const raw = localStorage.getItem( app.STORAGE_KEY ); if(!raw) return; const setup = JSON.parse(raw); if( !setup || typeof setup !== "object" ){ return; } const comp = app.competitions.find(function(item){ return ( item.id === setup.competitionId ); }); /* Een langdurige competitie wordt NOOIT hersteld vanuit localStorage. De rondevoorbereider start daar uitsluitend vanuit de gepubliceerde websitegegevens. */ if( !comp || !app.isSingleDayCompetition(comp) ){ return; } /* Alleen voor een ééndagscompetitie/blitz mag de lokale voorbereiding terugkomen. */ app.el.competition.value = setup.competitionId || ""; if(setup.round){ app.writeRound( setup.round ); } if(setup.date){ app.el.date.value = setup.date; } if( Array.isArray( setup.presentPlayers ) ){ app.presentPlayers = setup.presentPlayers.filter(function(id){ return !!app.getPlayerById(id); }); } if( setup.byePlayer && app.getPlayerById( setup.byePlayer ) ){ app.byePlayer = setup.byePlayer; } }catch(e){} }; app.clearSetup = function(){ if(!confirm("Rondevoorbereiding wissen?")){ return; } localStorage.removeItem(app.STORAGE_KEY); app.presentPlayers = []; app.byePlayer = null; app.el.competition.value = ""; app.writeRound(""); app.el.date.value = ""; app.updateCompetitionModeUi(); app.updateRoundControl(); app.renderPlayers(); }; /*================================================== VOLGENDE RONDE ==================================================*/ app.startNextRound = function(){ const comp = app.getCompetition(); if(!comp){ alert("Kies eerst een competitie."); return; } /* Bepaal de laatst gekende ronde uit: 1. de gepubliceerde/lokale historiek; 2. de laatst bewaarde rondevoorbereiding. */ const historicalLast = app.getLastRound(comp.id); let savedRound = 0; try{ const raw = localStorage.getItem(app.STORAGE_KEY); const saved = raw ? JSON.parse(raw) : null; if( saved && saved.competitionId === comp.id ){ savedRound = Number(saved.round) || 0; } }catch(e){} /* De volgende ronde is altijd één hoger dan de hoogste gekende ronde. */ const nextRound = Math.max( historicalLast, savedRound, app.readRound() ) + 1; /*---------------------------------- Maximum aantal rondes controleren ----------------------------------*/ const maxRounds = Number(comp.maxRounds); if( Number.isFinite(maxRounds) && maxRounds > 0 && nextRound > maxRounds ){ alert( "Deze competitie bestaat uit maximaal " + maxRounds + " rondes." ); return; } app.writeRound( nextRound ); /* Bye moet per ronde opnieuw gekozen worden. */ app.byePlayer = null; app.el.search.value = ""; app.updateRoundControl(); app.renderPlayers(); const setup = app.buildSetup(); localStorage.setItem( app.STORAGE_KEY, JSON.stringify(setup) ); /* Duidelijke bevestiging tonen. */ app.el.saveMessage.textContent = "✓ Ronde " + nextRound + " is voorbereid"; app.el.saveMessage.classList.add( "show" ); setTimeout(function(){ app.el.saveMessage.classList.remove( "show" ); },1800); /* Terug naar de rondegegevens, zodat het nieuwe rondenummer zichtbaar is. */ const roundSection = app.el.round.closest(".km-section"); if(roundSection){ roundSection.scrollIntoView({ behavior:"smooth", block:"start" }); } }; /*================================================== EVENTS ALGEMEEN ==================================================*/ app.bindMainEvents = function(){ app.el.competition.addEventListener( "change", function(){ const comp = app.getCompetition(); app.writeRound(""); app.updateCompetitionModeUi(); /* Bij een langdurige competitie wordt iedere speelavond opnieuw aanwezigheid opgenomen vanaf nul. */ if( comp && !app.isSingleDayCompetition(comp) ){ app.presentPlayers = []; app.byePlayer = null; app.el.search.value = ""; } app.updateRoundControl(); app.renderPlayers(); } ); document.addEventListener( "input", function(event){ if( event.target && event.target.id === "kmRoundNumber" ){ app.updateRoundControl(); } } ); app.el.nextRoundBtn.addEventListener( "click", app.startNextRound ); app.el.saveBtn.addEventListener( "click", app.saveSetup ); app.el.clearBtn.addEventListener( "click", app.clearSetup ); }; /*================================================== INIT ==================================================*/ app.init = function(){ app.loadPlayers(); app.loadCompetitions(); app.loadRounds(); app.fillCompetitionSelect(); app.loadSetup(); app.updateCompetitionModeUi(); app.updateRoundControl(); app.renderPlayers(); app.bindPlayerEvents(); app.bindMainEvents(); }; app.init(); })();

KRAKKEMAT

Pairinggenerator

Genereer de pairing, registreer de resultaten, bereken de rangschikking en bewaar de rondehistoriek.

Rondevoorbereiding

De rondevoorbereiding wordt geladen.
Livenotatie

Livenotatie

Deze tool is ontwikkeld voor het live registreren van zetten tijdens de competitie en is bedoeld als gebruiksvriendelijk alternatief voor het schriftelijk noteren van zetten.

Deze toepassing werd ontworpen voor gebruik op een smartphone.

Op grotere schermen is deze toepassing niet beschikbaar.
Livenotatie

Livenotatie

Registreer je partij rechtstreeks op je smartphone en stuur ze nadien door naar de Krakkemat-partijendatabase.
Eigenschappen:

☾ Donkere modus
🔋 Scherm actief houden
♟️ PGN-export

1 uur scherm actief = ongeveer 5% batterijverbruik, in donkere modus nog minder.



💡 Tip: verlaag de schermhelderheid van je toestel voor een langere batterijduur.

REPERTOIRE

Mijn persoonlijke openingstrainer

Wit

Nog geen witte openingen.

Zwart

Nog geen zwarte openingen.

KRAKKEMAT

Competitiebeheer

Beheer spelers, competitie-instellingen, rondes, pairings, uitslagen en rangschikking.