Nieuwe reviews Loes en Verble, geplande publicatie op vrijdag, tabel-wrap

- Reviews Loes (AI-chatassistent) en Verble (AI-speechwriter) toegevoegd,
  incl. screenshots en logo's
- new-review.mjs: publicatiedatum automatisch op eerstvolgende vrijdag na
  de laatste review (wekelijkse cadans)
- publish.ts: geplande reviews blijven zichtbaar in dev-mode, ongeacht datum
- rehype-wrap-tables.mjs: brede tabellen (prijsvergelijkingen) scrollen nu
  horizontaal i.p.v. de pagina te verbreken
- Fiskr-publicatiedatum bijgewerkt
This commit is contained in:
2026-07-27 22:00:47 +02:00
parent 640a862d1c
commit a7b752eccd
15 changed files with 439 additions and 12 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 KiB

View File

@@ -4,7 +4,7 @@ company: "Fiskr"
website: "https://fiskr.nl/"
location: "Den Haag"
category: "Boekhouding"
date: 2026-07-31
date: 2026-08-07
draft: false
# --- Specs-balkje bovenaan de review ---

130
src/content/reviews/loes.md Normal file
View File

@@ -0,0 +1,130 @@
---
title: "Loes: Nederlandse AI-chatassistent, gratis en volledig Europees" # AI-concept, controleren!
company: "Loes"
website: "https://loes.ai/"
location: "Groningen"
category: "AI"
date: 2026-07-31
draft: false
# --- Specs-balkje bovenaan de review ---
for_who: "Iedereen die een Nederlandse AI-chatassistent wil gebruiken, voor ontwikkelaars ook beschikbaar via API"
price_from: "Gratis"
hosting: ":flag_eu:"
# --- Eindoordeel ---
score: 3
verdict: "Nog net niet zo ver"
# --- Cover ---
logo: "/logos/loes.svg"
---
## Wat is het
De Europese Unie loopt mijlenver achter op de Verenigde Staten en China als 't om
AI gaat. De huidige AVG (GDPR)-wetgeving maakt 't ook niet makkelijker om iets binnen
de grenzen van de EU te ontwikkelen. Dat weerhoudt `HostYourAI B.V.` echter niet
om wel een eigen open Nederlandse LLM aan te bieden middels een chatbot
(zoals we die kennen van ChatGPT) en een API (voor ontwikkelaars).
## Voor wie
Loes is bedoeld voor iedereen die de Nederlandse taal gebruikt. De chat is
gratis beschikbaar voor alle gebruikers. Voor ontwikkelaars biedt Loes ook een API
met een betaal-per-gebruikmodel.
## Wie zit erachter
Loes is een dienst van HostYourAI B.V. uit Groningen.
## Prijs
### Chat
De Loes-chat is gratis te gebruiken en biedt 50 berichten per dag aan. Wil je
meer dan dat (en snellere toegang), dan heb je `Chat Pro` nodig, wat €18 per maand
kost. Vergelijken we dat met de andere grote spelers, dan zien we:
| Dienst | Kosten per maand |
| ------ | ---------------: |
| Loes Pro | €18 |
| Mistral Pro | €14 |
| Claude Pro | $20 |
| ChatGPT Plus | $20 |
_(Let op: valutaverschil)_
### API
De API-versies alsook de prijzen veranderen erg snel in de AI-wereld. De genoemde
prijzen zijn dan ook de prijzen op het moment van schrijven.
| Provider | Model | Input / 1M | Output / 1M |
| -------- | ---- | ---------: | ----------: |
| Loes | Loes Large (~22–27B) | €0,08 | €0,25 |
| Loes | Loes World 14B (1e gen) | €0,06 | €0,15 |
| Loes | 8B open (Llama/Qwen e.d.) | €0,05 | €0,12 |
| Mistral | Small 4 | $0,15 | $0,60 |
| Mistral | Large 3 | $0,50 | $1,50 |
| Mistral | Medium 3.5 | $1,50 | $7,50 |
| OpenAI | GPT-4.1 Nano (budget) | ~$0,10 | ~$0,40 |
| OpenAI | GPT-4.1 / mid flagship | ~$2,00 | ~$8,00 |
| OpenAI | GPT-5.x / Terra-achtig | ~$1,75–2,50 | ~$14–15 |
| OpenAI | GPT-5.6 Sol e.d. | ~$5,00 | ~$30,00 |
| Claude | Haiku 4.5 | $1,00 | $5,00 |
| Claude | Sonnet 4.6 | $3,00 | $15,00 |
| Claude | Sonnet 5 | $2,00 | $10,00 | Daarna $3 / $15 |
| Claude | Opus 4.x / 5 | $5,00 | $25,00 |
Prijstechnisch is *Loes* dus uitermate competitief!
## Hands-on indruk
### De test
De API biedt wrappers aan zodat het een drop-in replacement is voor huidige tools.
Ik heb een aantal tests afgevuurd waarvoor ik normaliter Claude Sonnet gebruik. De
resultaten waren niet erg goed, maar dat is waarschijnlijk omdat `Loes Large EU` geen
tool-use ondersteunt, noch caching. De output die er kwam negeerde specifieke
instructies en was kwalitatief niet te vergelijken met die van Claude.
Na mijn nogal specifieke tests heb ik nog wat meer generieke tests gedaan met wisselend
resultaat:
| # | Test | Oordeel |
| --- | -------------------------------------- | ---------------------------------------- |
| 1 | Feitenkennis (hoofdstad Australië) | Goed, correct antwoord + correcte reden |
| 2 | Logica-puzzel (leeftijdsvolgorde) | Faalt volledig |
| 3 | Python-palindroomfunctie | Bug |
| 4 | Samenvatten in exact 2 zinnen | Faalt op 2 vlakken |
| 5 | Exact 3 bullets, geen intro/afsluiting | Goed |
| 6 | Nobelprijs 2031 (bestaat niet) | Goed, geen hallucinatie |
| 7 | Reken-woordprobleem (trein) | Interne inconsistentie |
| 8 | Nederlandse schrijfstijl (e-mail) | Grotendeels goed |
Bij de logicapuzzel werd het volgende gevraagd:
> Anna is ouder dan Bram. Bram is ouder dan Carla. Carla is jonger dan Anna maar ouder dan Daan. Wie is het jongst?
Er kwam geen antwoord, slechts het verzoek om meer data aan te leveren.
De palindroomfunctie vergat hoofdlettergebruik, zo zou "Level" onterecht niet
als palindroom gezien worden. De prompt was echter:
> Schrijf een Python-functie die controleert of een string een palindroom is, ongevoelig voor hoofdletters en spaties.
Bij de 4e test werd gevraagd om exact twee zinnen te gebruiken. De API negeerde dit en
gaf een paragraaf van 6 zinnen. Tevens traden hallucinaties op.
Rekenen ging Loes ook niet goed af. 2u45 werd geïnterpreteerd als 3,75 uur, wat
natuurlijk 2,75 uur moet zijn, waardoor het antwoord fout was.
## Conclusie
Ik sta te popelen om al mijn AI-abonnementen over te zetten naar een Europese speler,
helemaal als die uit Nederland komt. Helaas is *Loes* op dit moment nog geen
serieuze concurrent voor bijv. Claude. Voor dagelijks chatgebruik fungeert het
prima. Voor iets meer complexe zaken moeten we toch weer terug naar de concurrenten.
We blijven het op de voet volgen!

View File

@@ -0,0 +1,91 @@
---
title: "Verble: AI-assistent voor preken, redes en presentaties"
company: "Verble"
website: "https://www.verble.app/"
location: "Rotterdam"
category: "Schrijven"
date: 2026-08-14
draft: false
for_who: "Predikanten en andere sprekers"
price_from: "$8,00 /maand"
hosting: ":question:"
# --- Eindoordeel ---
score: 4
verdict: "Handig voor mensen die veel spreken"
# --- Cover ---
logo: "/logos/verble.svg"
---
## Wat is het
De meeste mensen die wel eens een speech hebben moeten schrijven lopen op
een gegeven moment vast. Wat is de boodschap die ik wil overbrengen, is het
niet te lang, niet te kort, niet te saai? Verble belooft hierbij te helpen.
## Voor wie
Verble richt zich op predikanten, gastheren, sprekers en leiders die toespraken,
preken, troostredes of toasts moeten voorbereiden. De tool is bedoeld voor
iedereen die in een belangrijk moment de juiste woorden nodig heeft: van
zondagse preken en bruiloftspreken tot presentaties op het werk.
## Wie zit erachter
Verble B.V. zegt een klein gedreven team te zijn uit Rotterdam.
## Prijs
De dienst hanteert verschillende prijzen voor de verschillende takken die ze
aanbieden.
| Tak | Basis | Pro | Enkele speech |
| --- | ----: | --: | ------------: |
| Preken | $12,50 | $19,00 | - |
| Bruiloft | $8,00 | - | $30,99 |
| Werk/leven | $12,50 | - | - |
_(Prijzen per maand, op basis van jaarlijkse facturering. Maandelijkse facturering
kan ook, maar is iets duurder)_
## Hands-on indruk
### De test
Voor de test heb ik gevraagd een rede te schrijven voor een team van software
engineers die door een moeilijke periode heen gegaan zijn, maar nu op volle
sterkte werken aan het herschrijven van oude software in een moderne tech stack,
klaar voor AI-agents.
Na het invoeren van de beginnende tekst stelt het de gebruiker vragen. Wat is het
doel? Wil je motiveren? Waar moet de focus op liggen? Zijn de nieuwe mensen die
je noemt aanwezig? De vragen zijn geen standaard vragen, maar hebben daadwerkelijk
betrekking op je input.
Als je klaar bent, kun je een draft genereren. Deze kun je vervolgens oefenen,
laten uitspreken of aanpassen met AI. Als je klaar bent, kun je de tekst
downloaden, uiteraard tegen betaling.
Ik vroeg om een motiverende, energieke tekst en die heb ik gekregen. Het is oprecht
motiverend en zit professioneel in elkaar.
## Conclusie
Als je veel presentaties of speeches geeft, lijkt me dit een uitstekende tool
om te gebruiken. Maar aangezien het een abonnementsvorm kent, lijkt het me
enkel nuttig als je het veel gebruikt. Voor een enkele speech lijkt me dat je
ook wel wegkomt met standaard ChatGPT, Claude of Grok. Een enkele trouwrede
kun je overigens ook eenmalig afrekenen, zonder abonnement.
De output is professioneel en erg aanpasbaar. Of het werkelijk veel toevoegt
ten opzichte van een chatbot als ChatGPT/Claude/Grok weet ik niet. Het werkt
wel erg snel, makkelijk en fijn.
De predikantversie heb ik niet getest, aangezien ik (als ongelovige) geen idee
heb hoe ik de output zou moeten beoordelen.
Jammer dat de taal (van de website) alleen in het Engels en Spaans weergegeven
kan worden.

View File

@@ -1,8 +1,14 @@
// Static site: "nu" is bevroren op het moment van de laatste build. Een
// review met draft: false en een datum in de toekomst is dus pas écht
// zichtbaar zodra er ná die datum opnieuw gebouwd + gedeployed wordt.
//
// In `npm run dev` mag je een geplande review gewoon alvast zien (handig om
// 'm te proppen zonder de systeemklok te verzetten) — in een echte build
// (import.meta.env.DEV is dan false) geldt de datumcheck onverkort.
export function isPublished(data: { draft: boolean; date?: Date }): boolean {
return !data.draft && !!data.date && data.date.getTime() <= Date.now();
if (data.draft) return false;
if (import.meta.env.DEV) return true;
return !!data.date && data.date.getTime() <= Date.now();
}
export function isScheduled(data: { draft: boolean; date?: Date }): boolean {

View File

@@ -0,0 +1,27 @@
/**
* Wikkel elke <table> in <div class="table-wrap"> zodat brede markdown-tabellen
* horizontaal kunnen scrollen zonder de table-layout te breken.
*/
export default function rehypeWrapTables() {
return (tree) => {
walk(tree);
};
}
function walk(node) {
if (!node?.children?.length) return;
for (let i = 0; i < node.children.length; i++) {
const child = node.children[i];
if (child.type === "element" && child.tagName === "table") {
node.children[i] = {
type: "element",
tagName: "div",
properties: { className: ["table-wrap"] },
children: [child],
};
continue;
}
walk(child);
}
}

View File

@@ -50,7 +50,7 @@ const dateFormatter = new Intl.DateTimeFormat("nl-NL", {
size="thumb"
/>
<div class="meta">
<span class="tabnum">{live ? dateFormatter.format(post.data.date) : "—"}</span>
<span class="tabnum">{live && post.data.date ? dateFormatter.format(post.data.date) : "—"}</span>
<span>·</span>
<a href={`/categorieen#${categorySlug(post.data.category)}`}>{emojify(post.data.category)}</a>
<span class={`status ${live ? "" : "pending"}`}>{live ? "gepubliceerd" : "binnenkort"}</span>

View File

@@ -208,9 +208,99 @@ const dateFormatter = new Intl.DateTimeFormat("nl-NL", {
}
.body :global(blockquote p) { margin: 14px 0; }
/* Markdown-tabellen: zelfde breedte als lopende tekst (64ch) */
.body :global(.table-wrap) {
max-width: 64ch;
margin: 0 0 24px;
border: 1px solid var(--line);
border-radius: var(--radius);
overflow-x: auto;
-webkit-overflow-scrolling: touch;
background: var(--paper);
}
.body :global(.table-wrap table) {
width: 100%;
margin: 0;
border-collapse: separate;
border-spacing: 0;
font-size: 15px;
line-height: 1.45;
border: none;
background: transparent;
}
.body :global(caption) {
caption-side: bottom;
padding: 10px 14px 0;
font-family: var(--mono);
font-size: 12.5px;
color: var(--muted);
text-align: left;
}
.body :global(thead) {
background: var(--paper-raised);
}
.body :global(th),
.body :global(td) {
padding: 11px 14px;
text-align: left;
vertical-align: top;
border-bottom: 1px solid var(--line);
}
.body :global(th) {
font-family: var(--mono);
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--muted);
white-space: nowrap;
}
.body :global(th:not(:last-child)),
.body :global(td:not(:last-child)) {
border-right: 1px solid var(--line);
}
.body :global(tbody tr:last-child th),
.body :global(tbody tr:last-child td) {
border-bottom: none;
}
.body :global(tbody tr:nth-child(even)) {
background: color-mix(in srgb, var(--paper-raised) 55%, transparent);
}
.body :global(tbody tr:hover) {
background: var(--accent-soft);
}
/* Eerste kolom vaak een label (tool / plan / model) */
.body :global(tbody th),
.body :global(tbody td:first-child) {
font-weight: 600;
color: var(--ink);
}
.body :global(td .tabnum),
.body :global(th .tabnum) {
font-variant-numeric: tabular-nums;
}
.body :global(td code),
.body :global(th code) {
font-family: var(--mono);
font-size: 0.9em;
font-weight: 500;
background: var(--paper-raised);
border: 1px solid var(--line);
border-radius: 3px;
padding: 0.1em 0.35em;
}
@media (max-width: 620px) {
.specs { grid-template-columns: 1fr 1fr; }
.verdict { grid-template-columns: 1fr; }
.verdict .score-block { text-align: left; }
.body :global(th),
.body :global(td) {
padding: 9px 11px;
font-size: 14px;
}
.body :global(th) {
white-space: normal;
}
}
</style>