From ef6b487c52208bb424dbefd435795393249f1d5a Mon Sep 17 00:00:00 2001 From: codebude Date: Tue, 8 Sep 2026 08:54:03 +0200 Subject: [PATCH 1/4] Heimdall integration documentation --- docs/.vitepress/config.base.ts | 1 + docs/api/integrations/heimdall.md | 46 ++++++++++++++++++ docs/api/integrations/index.md | 3 ++ .../screenshots/integrations-heimdall.png | Bin 0 -> 23554 bytes 4 files changed, 50 insertions(+) create mode 100644 docs/api/integrations/heimdall.md create mode 100644 docs/public/screenshots/integrations-heimdall.png diff --git a/docs/.vitepress/config.base.ts b/docs/.vitepress/config.base.ts index e9e5a9a6..85da19ba 100644 --- a/docs/.vitepress/config.base.ts +++ b/docs/.vitepress/config.base.ts @@ -95,6 +95,7 @@ export default defineConfig({ { text: 'Embed API', link: '/api/integrations/embed-api' }, { text: 'Dashy', link: '/api/integrations/dashy' }, { text: 'Glance', link: '/api/integrations/glance' }, + { text: 'Heimdall', link: '/api/integrations/heimdall' }, { text: 'Home Assistant', link: '/api/integrations/homeassistant' }, { text: 'Homarr', link: '/api/integrations/homarr' }, { text: 'Homepage', link: '/api/integrations/homepage' }, diff --git a/docs/api/integrations/heimdall.md b/docs/api/integrations/heimdall.md new file mode 100644 index 00000000..e0ec5dcc --- /dev/null +++ b/docs/api/integrations/heimdall.md @@ -0,0 +1,46 @@ +# Heimdall + +LibrisLog can be integrated into [Heimdall](https://github.com/linuxserver/Heimdall), +an application dashboard and launcher for your self-hosted services, as a +[LibrisLog enhanced app](https://github.com/linuxserver/Heimdall-Apps). + +The enhanced app displays your reading statistics (books read, currently +reading, want-to-read, and total counts) directly on your Heimdall tile. + +## Prerequisites + +- A running LibrisLog instance reachable **from the Heimdall server** + (Heimdall fetches the statistics server-side, so no + [CORS](/guide/configuration#core-settings) configuration is needed) +- An [API key](/api/integrations/#api-keys) with access to the + statistics endpoint + +## Configuration + +1. In Heimdall, add a new item and pick **LibrisLog** as the application type + (it is listed as an *enhanced app*). +2. In the config section of the app, enter the address of your LibrisLog + instance in the **URL** field. The URL **must end with a trailing slash**: + + ``` + http:/// + ``` + +3. Enter your API key into the **Password (API key)** field. +4. Select which values the tile should display under **Stats to show**: + **Read**, **Reading**, **Want to read**, and/or **Total**. Hold + Ctrl (or Cmd) to select multiple entries. +5. Click **Test** to verify the connection. If everything is configured + correctly, Heimdall reports *"Successfully communicated with the API"*. + +::: tip The URL field needs a trailing slash +The config section of a Heimdall enhanced app can be confusing: the **URL** +field needs the address of your LibrisLog instance **followed by a slash**, +e.g. `http://192.168.1.100:8000/`. Without the trailing slash the app cannot +fetch your statistics: the tile stays empty and the **Test** button fails. + +::: + +## Result + +![Heimdall Widget](/screenshots/integrations-heimdall.png) diff --git a/docs/api/integrations/index.md b/docs/api/integrations/index.md index 055f0f8e..806e63f9 100644 --- a/docs/api/integrations/index.md +++ b/docs/api/integrations/index.md @@ -39,6 +39,9 @@ headers. For these integrations you need an **embed token**, used with the - [Glance](/api/integrations/glance) — Display your LibrisLog statistics on a [Glance](https://github.com/glanceapp/glance) dashboard using the custom API widget. +- [Heimdall](/api/integrations/heimdall): Display your LibrisLog statistics + on a [Heimdall](https://github.com/linuxserver/Heimdall) dashboard using the + LibrisLog enhanced app. - [Home Assistant](/api/integrations/homeassistant) — Expose your LibrisLog reading statistics as sensors in [Home Assistant](https://www.home-assistant.io/) using the RESTful diff --git a/docs/public/screenshots/integrations-heimdall.png b/docs/public/screenshots/integrations-heimdall.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1b0c350d512d9449cecbed31daa1d63a6df9f8 GIT binary patch literal 23554 zcmXuJ2RNJW`#wx0q;^_0YlfP&_l(hmE~;wpQl+(OZ-Sy?Q&qcmOT`|gV((QHrNkaJ zV$>f0=kxu&?{VBop5(}r-1jxl^SZ7mohK+Na%OTOA|fg+O$}WlB4QKZIt2;>o_%D8 z`hXW=H(it((YK*H8^9Z|o$6y%BBF{oiVG_U@cxF2rjZ*F5q0~258`g;VjJMYo9_1w z-JdzXboa7)YfFTBYisM|_R87a{5cf3#l%NTLsie)e7iZq?@o8xT3pNG&M#{OHCRhD zm>YK|!Hvy^l2mRjgCxPtvXHyKmRm5r_E@^-LsRPqA^Ys_eooHELy1k_kL0&5o9<37 zG`-$C)?45F;``Otmz3jvFaE&i#NEI^CO9on<+5y(4Y&5zoOemriLB+z=fCflDsC>V z$M!O~y0<&&4jZDp?%bt^voAa=Es|$A0?|4f#ee*Ocz>IbMeENg>ibwad#|9@W zqge%Y$j7E9UhW<8@=H2)jm$|iAp9c8RogGOt<1~{?JRubpUe1$vDZj}NUC9Dctp9b~K7{6!^Bh~{JcDLx-syn)uO!`ku5Zaknw&PCjhYF1 z?V^?-;}aInAZ%M>-sjMq@y8Rwl1niX)nCaHy7_DcRGHFZ+D;Gs`{JltDDa4?_ZFzl~|FGni=`ux1#OAVW(r$WIteB>z8Ohrt`kF z;3g5}d27vN4lCm4%mUJh%**@IZ^LGPJoet8&Wy6u_CoM;u-ephE_V0hZ-iTNzP;$s#9G0!Prz2{LJHd_r?iD&d#M50}}ZP!Yv9zqqkG%Z^tp{ z+?Ny0Z^S~A-}F+iKa6*!nyO~?-ekyEi)Z+@oKx?f#u%c{5ol|)mxOHiQtbwc*n@eb}4ju*i9@Va_m4bQSuIz9Z6jZ2x%cZqSmb+QgVg-*@OJK5#FrD zbE(xC09=c8Ku^ucgBjd4m0G`;w#PxG&D0D+D2id2vs6h}{-R4YPlaBn9s#*Lik6+4FLrqX;4>nbRQanDeA459nyE=vog%-IyFQm%uB}Am#$>TxaKBVXvCt4+BQ?l5>v`84f1N5Q>)zc zDOZf`Mdd3CbCQ4QJ***Y8gF3Dm@ePQleVm|#W`S|a8=*2(3rW8g^~N}47$;4@~vy} zZD}Fo=u(6o?a&;3c)>fnf_%7Fdvs;|Lej1&rJcQ68EP>&1;UUbrp2^a8ws-!)|ywytONG6$l;LkDc9ko#BA}e0J+SnPnd2MyJEN zeqLy`00}k4=+55-SDYA`>^kgcA8O3>MQ?%nx`K?k;7qrjNICsM0P%L$dE1=S{{3*) z2Cu4A5x@L*pUso$Y*FP zRqH52&Ka7Z3+?QV#gLAhB$W=*)QPrLEXMCt5}@8Cj@G`n*du1RmmwhE`8`@V8y2hC^=pe|JAqkY;A(kS6&0Qm6MIxNsKHWoiNO{JI6q z1J8A?;~7zYj{<>hcA_$PLsPxpRSungd3T#yVFc*{k?z{|&vfgP8D_Z){qDjGR%Dpy zk+O_2VnZ_v38*TACM}%k`m|r_gbq42UO64#JmXHGyqiLuuq#pG9^cj&k`2A+xzH~2 zh7b`tlg$nN_i}D!9O^A38nAnYR8TbkgpMIk6gw6XIkX9ev#8JD0>+uJxSOOlS!$qP zO;W{I6j+K5WEt#LA^yV+97Fy|%BM)z>TY_;ZrM)(nl(wr;RfE%FTZ{<_Lh<|aJJ2p zljP}<644WXlb}uQGS`C^g~h$td2JLXty%zjV(aN*_@X{=puE4PXP$C9?ypX`zu_;p z9^B)g^KQF<#D@`ydkK5j>hGvEWlk1d;wQsQQWQRpsB1YhRf*1|Hf^l;teOmD-*ykl zbpGOW$Z_L-KvZWy6whT8Pr$1=;;)<~`6_>;5{;y?^yGudYjRk4s3mzqUh*s_=jP|I zJl4f|ep4?UCo^mZ30ud*BJS`c_i{NoiQ(Vpj2RReOTVRy4*x_G_moI_z6efE?Hn5z6dXBA?Es= zI8b#2G^l?ipU~0(Bpu`G8X~zBqEEb zapZV)pC7_BxYr=US!TU#Ftd)(raZcgmq9y;KZ(l!**ee{RlPsD{F8IxqijxvdfHIp z5YGV^E|$ywFn2y4WSo-(8)tZP3q2JwuCfbtOIt_Ol9IWHu)0*nbLetZvA9=~)CXJ7 z^8BmtQ8KWo2rrxcTikZA`8 z;loZaw{!T4^x%i^6J7J|F4lWQzEipNDh=*@1#cKV^PFR@{)A*w;Wn0GtM=MsU=NKO zx}+-M_7tWI`oDtZv0>>O9d&BBN8skXh4t9s-Ms`scD+hc;}8wv&lVGtp3SgvXH1F9 z#^8tfhfcQ?3I+r}qKfhYmY>bvqC@F0h}s&GZ1tYCBeg3|Yu>=GPaF_-55Bl@|GA*SdOo_{UhfSLxN1>)O6b+y=LCZHj5&Klu-6gR!(`4;la8pj;@G&WNb@B=0UgD z!R^7N;+8uXwMt;U?}WB57EE+kFAn^E3U>8<|7B*z0z`LBTK(Npe;bmiF;c?7c-Dk_ zq^gi5V=Ji+7415R2LaY0U(LIfL2+|mVTnTCKP(&N$5e;zhq_naZOM6`nqu7ky)vi+ zHwMiv#Y_I9Z@8elUC)E09C%RJJ%45ZoOZuDmBbt)^BTTmO*1p0m8~Ceu6t)oV8eyFm zIyimTlePqMq^FK5dNAOoR^!0nE$&0zU@Ayt`=O8AyFXtZrQ0v|1RP{Yc)m>i0ZY>M zc;-gnUU+JB^T${8MA`Q1j-A&<@+f@&4iy2c(;7um8_DR2MScrn?aC-H`N%MiJ$1&8DaobH&{jXReKx3Ij($xbl)gsls)umu>lP*6NEY}D75Gy= zB=#X@IC%B`HQlc!5W`LhnML4AlDTUck``r1)HlF_x8iguM^PPn>^;;|aQW)7-;nXC zBtNlre1Ehfu@&>)_0-lz80VLufiOi3k!><8Nz#IIm7^tbw}v0S)3u!Ti=jdpsvlL_ zfuAE0DmVQr=ty}&-N@rXQ-8q8Ur*^b@kbB?nnZ3U7eP`grbs%`ypnHX7}J@%85FuV zZoh!m3bbXPZAG^wYL;_gSSZAEoE}G7Y=L5hI35yjUGa(jkc8KHHs;uKRylwI-uFs< zG8cP?q;*}wH*N_lRv{3$hkB8V#!2QGIBj)*zx0zMg z92QbJ>EVw5?z(^}y(5G?I6&W){kJO|Iwn0!V3XIfI3a@@KRCi)5fu;}NyXu95L87qR86iUH}_duiRBTh?ayBjii3d&~%Gg9e>o&DE+`VH3~j*oR>}?asX>nN-ZPSB`IcZ zn6;#`4hGGN7LyiIe&Rn%>OX_Pan7m1Y79Op)6I8Yc;8hOke&!f;z2xrdc*H&#hxvf zCC%eu{E*0HP=nbh>Xkh=_nORp0JpAcv{VU%sw6xHS~=jTHqSXfIMw%o2j6;6KIoU0 z;HyW2-TkMGBdT1TPvaPvC8ABl-+y|xKPqsRy%npaI{xAW`4jD0PnMnJ(c88!9j`l* zp*sr^aGe6>gyxRFmBR8)pr#S;tL9NBi8*aIY#ey&JU@lWEb2+dir(WeZ$EXdcav?v zuBd&6ZxKqaD|zuMyZe{J-~F%qom9HmxA*M)t(=L5pDF$b!I%ZADt^BVW%2{5G5V3H z`}l{pF$T7tGhT6mh;tV(xRFat4wgi*^_==s7>W?KrP2Xaa`_1J)UmYafFVzE^DvhY zTt3uyl)GfTmu2CL>o>C06Q17fenib4w<`B`k$dUYI6u-2=d2A!}pNFp+a z80?@=U@ssQ2S`%^3j-_)0m%t zgsNT7B(!m+BcXA$O_nHfdAK+5MJT;FKHudDFJunNd!HX_F6;b|yb>myj*M@@nc!k! z!f<{a;k*eAJ_sMQkffbjldR%K4^%CB0jf^h0p)j%>gC@sn)ZR5-Y+OvNf~-Cfb@JS zl?WYP}F? z4{Q=_>o2YiYQ9dyth#|7){qcMbVr7M4AyfwN=mq0~6=G~f(!TE7Uc7Ts{<0a6) zDPU0T0vrn`*UfT=|76$wc~}EEy^qes;2th;N8T{E33E%e-tq=uHyzkHtiJ;K2K-Ai zhQk)j7y0po8*D6!K`{HE823U}!t3+L2Qr%4e(viU@O*AkvkR+y|E2Bc=6D;u^rd~k zG%1GGa@qtBAH;oSeCQTaB;T!@`NDo>Y2(|CH(`5{dPj$=cS?dZ9|SHj_>*{vw>?3g z&`E#>C_Z5jf3um0-xF;jA}K#L;q-4Mj#ciHzt6lq4q-GW6NM)~*DG3{?3dA4eqF0z z^Nf#4tI9ddeNtAJh?GUOBv?!HfhwE=YHkD0gyk@7X|@8IumSt9wSJ&m#^gw}(Mz=D zrK4nBH!~QRRPDe<;TXWEryp3-O?vs()4xO@~VF=^!0uiB}quCnNKy>dBm%yM9$9m4D1L@u7eFq2C zF@5nihNF|JlCVr4@VRbeq+&?nO-XZXJi6pv@pcwU_MCqJI3!;_VhuKOohs^&q@7jm z%UTa*;uIDmH3@aL>fh_NZ#cc*IYf>&Cf7x}+&F;R-hK`QSKZcr@?gRl5hofY32KWl zUEXjH_FpN=w}y=@GHkM^G$%j_fWXuoIHdqJPW3|L;ea1248si{ z0xH_g&q+rCpC!S(;fl3uFnk6&9HyyDOQQDE)>iv2^u=@gh*DEjMb+m>3A8@>&MHio zf_dN*FHMR;teyT7+9~nto(9vSEc{aK)@k3QXeXy+A-%LZ!_;`|6C}2rgaYoJOY#a_ zK#{eKvHb7qGl?8L=eZcX*qvybHuYm-x&?Ow;wyLS186PaWL9fF;B{ywOh+dZ zc9a0v_XrS3Ev>*J;%LP<%ZKD|kt0l2(M$`YgK+=5S*YMx>=5)$A+?J+PU*!hVG6$+ z{fz2lJcWP)Yd^vwVL!>4?e`4Q=zB^(^?doHanC=`3r!muO2cPwI5(z2hRr0Yv72~w zOY?>Ppu6$t|4hIb?!U=IeD5KXDx)&3ZSie{!Cv9Xay2@!vhC;FKi;ZeNm!UT%diRh zKcLc}M05%16WX`aGhJ;^q|fA|yj)^)?A@=PNC&I`jDaUSa}Cy%*v7tp0DXX3&kz3a zg0>J!5Ela-L0Tx#Gpv6(q&cNI<;rvFvDF#52Y~tRWTCKj;HTsqvQsoLWr8k^@X0eK zsb^_5V;=@=COE}k7fCq0diZktk+CaA3LYgu0&!zZtb%Fze;j&!;hAT;nsUXlG)HLCM-m+hV z%*dn4klcp26+_ev1lcB7?SW4i-lZiT+7jP>Wz`L8%Oj!ApixYwrAuRDgzdKMejLPb z48yk+<8p?fO)$2N|IUfvU&nBehIKrwxG>)vfZC+3bHI5gxmdlEV9ChhtYqR?0<{tS z^GetNKhXfCBZDqcI5+53SZQP0*4gxyZ!0w06A7JRamR@q7GMA1yS}soQJYgLCetyd z-MVSU>{;kE-|!(|&E!UFHw8%>^|npe@GB%XkHi}6md2#|i&(`5?-3k9s$oa7)=0vY zPZ$oXq)HZ`4!=Cg+@B9p#^Y0P?Io?HTvRaQKT>n11 z*;VUzlB4Y#?+H{&I}CxpuJJ3u>RPG^X|25P)t)rA6@z}O4cCTcIm%^Cv8Ky>GLSNu zsSy*s9N3RZ%?eu4{&9I^aXn$tJfq+$v-s8zpD><@vFwIu8zbXKHV|!;&_aqZi@wNi z>I`b@1Zv^VyEZE;a8|`LOuYFxcYSaY8q&icm6RrR3xnBoMOO;@bz%wNxl1YWSW zoXRbQ(p;^2o7&+=-4&Qr0mtD9SGTI#oeer6kd=SI5PnC{um_%qi?_X2@jfA3DLnMd z7roxOj5wapoMc%TsknW}qvG2R=U-oiWi7A4w(P)VFzZKfQw^Vxt#GxF>POuaI~Z&y z2HyphGH`P!eCtqH3EMB+Vzvn@H6}KvmG?KKkMAi-AGFfVA-0MwKiWEz6O+|(T`tC8 zGnrad#ziiy@uQ{qTj9C9{q0W-b`>TuNa8gU_2KF}jkAF~cJ(=)KMJn92Ko-XS}y(> z>^7hN^7?VEa@8Gly{B@8m!S#VKcBxcUADMds#Cc>wz%H%YB}3zx$0L*`87<&rsWsL z1fYbMNZS9xzaNvTD4G?BwEja9potJUa}Hz(nRL`S7Ro30{+f82Oa;XllJRNua=Wjm8%^C z74^yM`Kya#N$ACvN?J(!#t)f>iQP#3)={Me<^oj) ze;?JsiR8@(x48pI;f;^#J&4yZ+=fmjsc$l&jPvWupV)RA&u#8A_W0)#tvN`Je$vu77!y1vnfb$e_(_)u`tBJf{~O3=B;kK?Oz z_KVBwvur?1H0&3PsOziOZgjYl{Ci-vvfNsAUo~P0qy`sq$6hk2vPm@^ghm|BUwVC@WNo?% zjW}*O-a+M``W-A5FHrq_BKVs2QX<~HwW4gim*pp zkZI@uq>zp-MVo@HRQD|lKU2Z@|8g&mg}Cf&mqz~SP2a*2tmoD4^^SAUURBV^c4)Rs zO576BQ=+mU_si>vma7wkmJ8U~wMEc{bIZwS==Cn@`mp`_U~)cSt<&Jj#%ihaS1t== zqN=xZsUkMvfQe*Os~ML1`#AG8xsur}ckWJ$Y}m37IDHsCCEeB@K@&t^9)h~PVo)b9 zUwX{m3|fQ5Q?vOyhhUgr3A@O|Vb6w0+^Z)wk@XR?hB;hW+7=yS9)P0f}#VSGs7rpy9zez`7 zL*0Sxeeh3FZ5{fiYH~wM z%)UNQ@jvlWIXSt$xU{%hInD|?jVt=_je>th|a$GLf2hnU3Ug zV~oDFOk;F!3;F48y{%NVw8+;bi{peVUaU(=+u)v@tlNHqvCRc}rBN|`gssj85C{vX za$m_ff)sax*M|Wga54j1QypEv*}ph;<%<(G77?MAh{3(-VdyU;ew8i;gWCw6bsrE} zeMvjZ)Y?q_#wKiF@k3K%8n9*?nas&|7BKN93MnRDDTpQ9DbtGV2g_j_Mnp% zm5cP<%k7z<{rNfXy>pAEz0|tNxgS+WnO%i5-M1R!Iy^N@9Vl8x088ROk-X=pe}RdY zh>09KxqkNiYQfH($?AL!MhTDi0W;G^(yi+J3385o8OGl9t#J}d5N=2eI(c`fi1uW& zS~%C_;^xrd&-qBeXWHh!KcBadScAQ?A&A2jH`idvu{sZknHPShoJ1Qe#$XWgV_INg zc!yaB>S1q>0H5$Pn=sU=qS{NXhvt`$fF+EIWmUl2sFtKJayW>xhHUA0NwF-clh4%u z7QxysEs9Jul!i9lZTn38S~Vukc6$Wk=|Lo+HdT_tXVA0pE`IFa+E`=u>CZ_O@9WFD zxwEh7UKYD-4J*YN_HP>9UhI_(`gC;7)=i47OiZ?GCOmVQPWqHe|3v29Pskw;I#2N8 zID29P|I`lr5-e#5@KkY-7&;k7$XH}yXNCt!q7B`XVDv55_=V72k^N(4Z+H_bCKzaH zEc6aQM<5Sa`7pHVYyWAShG{_Ve&M@WG?&qTwv=2gyJ>f@Y3Bo<`t0-xAn97>N<4Le z0%U%z5mh)-^II0Dhw{Vl`$VfCltlP55@Xx{BQU+t@9Nr+`*P|}CdjhCP$(O*Fq+-+ z{=&KZNTRVR+mTv+;^R{+R{CH~1N_%*-aP$&vVob*W=66vi5W76Dz_Tq@ zU@132PWnpH;Fh)2{>O2 z;8}*DR7?X};Lq<4w@kySg<|mLWVPaI>3M;3qoUc9hyu$o3Y$_Z97}685s59J*V{k& za7|k#l{N^2x{t8@HJE332Bo4oy?>?jx{afb`(sNzkDd+E&!Hm{k5!9Uep0L&6kWaX zST*@tHP0mvq^KtP_iC!mM%UiNsY<#;Mxw=e8KqPhfny4lvVLfsFI(%Pd8jx%2lC>j z7}tJ>;JSde6T)E)CbT1^A)I#1jG2k2nKPSfQ*6ugXCwYEb*@A84ptS_F2V(&a1N}+ z{CkYc!UI!tt0-ys)c?mr5KP1k!3coe4MC}eAn3f-Fd0y5M9WrtUmY*V`1^RBbJx#a?Gws9EGBOWsWchg5jfXjt?=MskLdyuk)?yS46E<*mgg(z>qA3m{)-0 zi5?j6NzOV-Z5h(6QtjbvlZG=p!Dr68tdClvVz41}E|tQx<0@$wTrSByjwj3%qdm~8 zg&Czd%VB8N=KrdD9OAxI1yqu`2n;q>U**TKP2jiIm&kbi6eOM(cJe=3S1_@Oj~*XPCX6_PV%s)wh3D)kzwGycK0DKvGUm*6rUt**e63yl5*C6 zVko9=ix0=Gf5F|dol%J+q@7+ukLy{|^vF!kOi5BsfuuSbeJ2MU6&E~;)FEcfhw5=@!J*`9_g#CdINEWNYD=~;ElmDTh=ax z^zP}l1QfadA9aGr0W=LDJJ`zus5W6275~9Q7i$|Ph=z^8L~rnK0QF^K{#O`6-)rZ1 zw84YcAF#^)-}~tk@;%+f1}t_5>8ljX{QlDnl7lyc8EBQQSH?IvHi-0y3M3y55QwFB;DGHaB~4|UiFzICl4*g7pH85JYqnKp5aris3LDU8fju=_OFf>S zs(J<26*sQ~R*S88;r`#m(R=kFGnnAQ+Y*&E@>nY{7o=Q5t+uKx$LCw{Mh-0I=)gs? zhj;rOMX}WSrm5X_oo*eD{ATQ;mc$Pu#()spYFHCV@*;sB{`QP3ffqBMu$ zV3ZZS9ux~_)q&$pqE6;i&8E`2uvIZ3qiu|w9OSC*2wfs!?^TfLHE%o=q@A;ZyOk2+ zt+yCdI>iN7v_F8J&Bt;0wW^V4ch1M*I~76nA$vrLVsW@ZRw&a#TT1=mmZA)k>PonQ zxnJglVlw&{6z>DJ3H#uqabRk`^yukdbd_IO{tKoJBAJ^o+Sj5k{fcd+L6E}7lolsb zU;XtKj`$slmg{Sk;B=&SL}+mG1eG01%ok+c?FwpWh&O2hv#Qu54tZRi0EUI088C}Fn!&l^%VhXfK4#vGJst(hRnSpV&dd&8IgxKU1qk> zKCrls(`sdbOAf9|Ju*0S^c)H-uwP93T-(|7&c5VKGAQ1YfO!}bScUtYhSEsf{WK&SJ(eLNSn}40XKf$ItRa)$8 ziyad%%;Y8v?|;+ZmdC|=%Fkle5Bxd1im(CqwGtxeyh_!kiiv%J>O4S8v&iLlyd>vG zLaYD?N9&Gff4&mbB))7jm>XU8H0p9~tb6fbZ7egLX=PH_PWzPAjoCI%AUj5N>RKrH z1Vw)mo-twz-d%-t-7Wv-XbvxRHqXw=jMLJbV{o;3^VT8Y;OtClVD(=?O3lC>GBGvv zXMcZp)$I2?Y*caax0(9DrQd@lVSi#Duj#ssLj*D$ysdwNBTXX-uIHtcql z5AJt$Or!zbnDiNW=RZDYI}*clK4;UNE6>HFM8%}q8yA|h%x0Qa`2-xD{?-SqZTtvP zy^HQ#nFwEb-V1&218%f@2}V7Q@<7rG%yqS-d+q!d`!A4pPwS621_O=YdvtXostnkV zi0e8UF}0`Xl`Qi5TRNrIegLe3pg7@{4Dr__@i4*|Y6^NjB%Squ4dXUYkn+v0;hSBu z#c+p>Yu4>;X_p z>|=8tCQc;@&V_I$!ukYXe=wNr7ksTL2?Tf^ zU2G3DMatvr-*n)a8%`OExhGV{U1X;}Ayw*V`t{4}V5Z#0Z?3Mkj)AUnEybAp(6rOe zwA1_6A-~_P{--&we>Y*G@Y%+L!}SjCUg!W+gUqb?k{gbB{G{xg^GiAM*_UC3zhVKc zX560OW~OC5q^8Vlx$~D#$Y`bsnU8Rx`%r4}eNINUL%ePIaBK5yb++whKlA~dPXfJH zd{YXYLfs_ZHold?3XjLcKbtcjuQeR6)%FeW#HQ8@|AL&}*FW z;>h&(`rb)aB*ozRnf3u>wVv4M<#xjT9}8>jiUT{=IyeUZR zwIawFe3Q!ej4T&61yHrv7cT=Vnks!g1H}YovTeZDU~!ioPdZ`Y@`f)C9!Obtq4zSN zn;MRn`@en7tpJHCNuasIb4PEGrlBm694{ggDtf0+dHCT%!sWnCzocpjK#l*=lZvP6 zT0SeAXD_vU3hvP26hRUoCfWGVs;BA?{nlbk>Hrh=fdf*#$twH)fx#~sdA~FLU(&|E z74C_HyxCeM0rCRmMSWeu2-LuCRq+$>XM7GOLU$cRL2CBh;`ZEFrvVPOkxHF$af@;B z-4_QAJL#vb_E|D-G=tGv6j0o_Ke z2A>)WNyi`}C?~%;n|>FQXkkqMsP>MMoAr@tru{1?pmD}27vN-7Qc_@M2mXt}A*p1X z{xrD$ee&AQ%jR$+d0;E8A^hTVnk0w%~sG621|op})5&+uZAxA5iN!k0i> zrj*U93we?qblwv7dGZ=APk6<~S=5yI%m4hQ#nGFzH;L}}6d0}Y+XO*kTao8K-q$34 zt5IwRs!_H19LjM7J-n+8co}{3P1w!DJH%85{)3~*OA#qP{pS(|4M;Fy~p?) ziPRm741D)L%jx1-0y#M(FV-vihkl+$E!5q8H-8t&$l@;{Rih>6N$_Q}db2N(W^^Y# zgE>6|Jq*WSwB-dyDAm;6W;!N-^2{zO=NA_W-Jk{);r>ub)GrzPpCa0+;7>2p zEn805_@`I`dsW=86JDeW^cw&o>yk%cr~+s<$o2yw8 z3>pf6(jc)?RU{_9+a2#!EsNKH_}skl$4T)iQ(*0$%}-qCK-5&z^zx#uWRXtby)h4^ zKMg+00plV!qlsu_pyL$W?sxd7zN>VJ*aUSXxZNIFiAva|Ww4yvbPD3(ZxFt~i50-M zRN`=P%n!^`q6NPee0%T;oCxzhkGT8oNfk@HP2f{NICk_4ia_AK7~g6Vhif3S@4{UY zDPr$umwbC|YBoP0BCsR@N;gXWPfVYOGuSgfHU%8puMAiRxcwbe@KPFtHm2P_QUs~Q zjmXG`Im_gjB1oyD4Z%(^Ieu)M3L^85kuG*&y&H1nDwFYl9Yi(^g{6dYL_uqi8`DsF z4mgKDBGaUeE;uHqnkcu_FR#=NUjBup5m!iUiTp1p?Jg)Tg4A%Xsi(#JQGG8e{@B~H zFbxeRFQ%NJ!#~cZMW-dLjUlypXu`6~Bs46c;lGLRowM=J`f;?1a4+H)#&|l%ZmHW~ z5gUJf;Ywxy5E^uMM7%R$JpF)~D-wmH7 zK+!bhTVHcMD)Ol~8C6SNSX{_)^!RC)xBqMSLiT*ZM8IqZO36!J)zDB3UK?Yn_>nQN zmQ%h$1z6&>e@6;FT-vdyJ<&e};<`8kqX3M5U+Lo_13i-`!8`D(X9{1}(?LAiiWru; z;}Z&t7|nao1Zzr1#b@d0suV3xtN|6kH{H9ashwddmtmp6&Ft4$e>T+w7%-Ca#|AvH zivqxhtvq3;Dh@#5iUuhAwFkh`>J}d*b_Vl7r8txk4}O0Dmj5zW9ilWyotTfJ$C6dn zPx{VG1}yd*xqQOP&jmyPHKb*>KCVR_@<$)<#B+B411G~BTVW1q7$K&IKow2>+lyNw z&#id3r81%IgkaKs8Dy-l=qI}mh|G)0YAx-44TT<)Y6(f_vjG8y`kVHHJw`nr26*qAFx-+KywX38&N>p-x5vxS)BQopVwREQ0Qjt{{VC*2?mODMItQWSZ%RJU|&A~^18N2L7({k!?Oqa zPwxIByCe8d$rQ`080b9JppX|diau~uo!oXyfbMrK25^=5r$ z`<_UKauOSzC($NQ;38u6UzGrvr-*}&r>raN!yJ2||Lsi*L}M2wo_Ajw!p=u262E9* zOXf7rLD%$v_-qlyPlPrd@ruD0&*>uLvrs2$h~>G+NAvBFA1HDiC3e+pUvW$@sI8)Y z$9;`7@a?Jb+r9mijFQkbmdn`XU23@one||2%abge=sZ5uul>n(Ob-GzmA%gL_GDy~ z;`!~@FG8KUSTQ5h9j!l9e%ySQTe!Y5FXSdIUCan1gKh+o7cgyk zW3io~DH+1ooQ{T`^fBbnySOg1Ag2m3v<=6Wg}VzE%@GGt3>R^7dt^+#-5F-NMGmp% zPAYFp9Ou)1k34(c`c$~3=ciIG!x4B#!Dao;(^ea+tEs)>ux8Z-zxK~Z@48RkvC_ppzFiVb1;+y}a4}hcQzJ zspTzR*GbxeCyzhCq~}_${j9+;)S7(p`cW_p2Ei42JuMtm&YyZz*Avmx5JB-&~+W zmsXa8&XQY4t>@dr{m|6gRFsaz4HEK%)pcC@_Pt??M$=`6%6S>@77Ie4VgNz@TJ$Fn z6KbAMsvomcL8)k(L)8f>^{|kT~LnyvdPx;!7CAVNpg;w#VZ2NV*9yITBoe zy9_t%2PWRo;S5{N*>*aM$2OU>rW@0fWC7Xq|S zQsRrRSHAwQsw#xR`KYQ%qZc4XWR);)R#A9QsxM+*s+RI~){^i2mPa90|2fJObiUb0O+Q@ziQH@&tJ}?JHf5B z#c*I`kwbne=RYw_d0$@vDtvo=>7jQmGxz{SutOFf#VwP^L7^>(2CA&Il`NKJWf_bnF%t<>SZpZP`X@$d8OZe%Q6Rg9GII z=x?z!L4MZD3b)$lRm~B{3_m<}{HaGnJdgxWwpK#hS6S*N-zm{H&?k$0q#?KCd}cIv z(BAgKrPtc5R)`FG)dvh<3teyPEL45$73p>;jr1e9{{dVv!R7k$?<=;2boQYA-pgI* z*&HN+4<6rp--&JE^Mzez4{XZq!J$ZNpYDia98vTCKMivy#cXItiir>M7)=yw$e9vn zggy!0uMIUl<&qH~6xyqAWbKZ?FRnuxXSFt6J=b~J%jXeP=jL?=(Dx!&{+n&yD z;&o|p9{I6VI=678(uq8wz5%(_?yUVe7$MO%HBxtQ@D9{YEebbWw-jU|4ke>t|M6uA zI@?UD*noI}enPe*4w6YBF!ezh#R~{?q@%6>cJsUuByFetJ=Di4^{!WyR^Vo8cO>nV zvEt^7F7O%jmULUeNAIJ_MRqS_@s_}@xnP8@Xp?0MD{hO#c;YXv52}`M+^ctVFiR`y z4q#E=)>yh=SnSSRb}cVg>OwS|$+Aj|hRQC2gNAhrNDB&EeOWjHZX~jL{6k2VvnYRj zljQ(M)5I)c;HrJ}it`+Bk^jwz)?+M@BrA$&ADToNbU2+mGM<;g(GI+#*tQhJwlGJt zw@tcW9_pG$3;`d;J%UeVn~pQLjuSJQ1T&|8*pQPMZ!~&m-ly^cj|U+>>Zp z)dl>J%1m%*=(gROxP}$jrKU*l2i zFdRQaRV$8egI3(oMdGd1E(#1K?#72FQyv~$vb!OB$~W)IyKqXIDzO++-9?bU9*25A zkEQH^R#JHT8%|5W>(BUlAo)#y{^DQ$BPsxnGl8d4v)cZ@mN)z9_I$I7&v0wTAF`?& z>!jSrPc_>in&5E=RB{Q+%jM-YwW1V4rq&i$m@m1ni;LsE@^N|+G!>$G9UmYqflfVu z&RRrYx4zzTqne^Sc@n&**!Fo8ZPR)e_U3`=fg<`1m@k|cn6cFKt^3-8N(!2fUy4-|oUtcwe-+r%ugrm>GX;skn;*fmHE-7GNRz>@pfu6?4} z>9Nlwb4W=@tPqCw>0C`4RvdlPw}!pm$d<0j|u@E*!1^y;q4o-Pz4t*iK?oW^S_VCsXXf9*jl#OZwjwl zo=c!{LlV)yG5B7IXyhZ8gMrWYk)kiu-f*d;;B3JXBKa>@6|XS(&HJM{YN12WpZL#B zc7xN+n_IPZ;6MUR>wPC(IfR(8({q|V%m3HMnLk3={r}%=jIrPLohGuItYvFvWK@zY zSrTT-PLk|dW+tSpl`WMr9f5BXHu5-@yIA>r2EgWQ$rmq9+cN5%7|l*4UR%)mP2ar5t2>%3MI)tWKC+fmhg~QpoPN-LD%*BK0%uD2zC;&IY}i$VA-5+l0m6NXK)S--ZH5%^lBRzCs!*OGE$!HeW#6tVOCDh(mWUCECYmMR7<~sdnGxov;!lcr0XKbB@`lt-1q)-owYvvu(1%R$iUW$XRT5udi0r0%m5hhmR>mdkTeYZ%7v6p>~o6P4M+i^H)`@l-3ljNv@kmOqITe0Pv+&2 zc06>PtMv?rm^&0}Cc6#W0z27DlG3}$?Ej~bErj5*z<`&55%VxN80(MOBed`;Ch-@~{ zY^VUIi=IGUG*>EFnxqQy_rke_^t+TmDa`d;D@5MQfca4AvZy*WROH?N5Mc|%(1tnv zHt-3Hx558ixHS*+Psxl8e=A;Kc#Flp!0 z#;!59oAM=Fgfeo|Q&1I7>ZxiJQ8AO{m3H`>2D{ayWd&oL31+chj|4CPV%czyC7GX1e`*=jXa;E))fp@jsI2|0lA9KYVU3 zrvX%gy|~0~9I6n%Rg=*nd`x=Gr!97w;>439@C;V@WGjPnqdhMaWMPmzb8j3uX;yn6Rv7lf!il zhr+J0csKzGogX4Od-)?VM*x3)@~#u{uK0gJUTB^<>l`AsVi0-eXHs1OzF#^}@cwxO zRa%AX$~~*OM_7MsP(aLspjDtoO#uKQZ@ge3Kt1$wyOc^deS`Q(f-R=W-`;zP8;T#M z)hgl`Y$?Qk(gsHfoSu7>1EW`YW@@}U=CNP^gy9*(+ar80gPF=GB>!@PM;J5k=38EI zf}l9azSeSQ&Y=p}5B^gz{D4Cd^O;ca&qE$l3wYz^e~rM^L^B)_Cuf6#02|v?t1yv< zf3n3ov%WsE(Y|&6T;H?>ZQ2NX)+M&HR~=p&<$;v2O_rkw=-4!*inV=%tW23)1Q{S# z-GRYlO46CLeIGTehDdLdsp5pKBHeAI z{)%}3|MF?yyXAttD$93TfF|`4wM+nC;`}LSI|=IbiDer@a`lP>)Q43IU}4Gb{DcPp zS_vsxG*Kun0&3(7%-x)w0TF)wBlePs-vm@nB9mv{)N{PuWk~M7 z#`1K2er&RAUiO)A9!c#;01R>AH3vR3m;ae1w(sE|+};#_fO{TfYk@Izk^r?KGW8-Gxt=XS97L$;QY^wh{7Of4SUX-`*Fy?9 z=rvvL$$b}~pEeyJ(LAja(|mJ33swXUOr)O$4G}A~z-mDXQ41^HkHed)t{JGeF9&XQ zpPGFB%{$K3sVyaE`%^ zjrOr@F1_C3GauQvBi+CD?cSs%dx~HcZw5+~Oc|QPxUId^Bd)CO{j^+}eZad>YlkNyBW>Y=PW)ol zHZxjRX0*;b{LuH|`EK=l^ZuqM)ZZbrnmTSY?=N$e%U#^m!7>*W9Kz4gVN>>#Q1YuO zdOqtbS^C|@JFj6{E2dc(DNc$6KskTHTFTc$-cBmN(@V9RPxVV~>Ug=o=(AgclLZ!6 z)^lU?{SIJbJilf!Ym{!)wjtf}qFd{I=kQi52cx}z24Wjc3k0L&XH_FN3k^NnhxPtk z`7@P0vB;vO^rVh!)(#qdHu)*#^o{mRIm&R70S-EU&>NMcd;OD}UB``~t*E+?5BR;u zqb0ALi}C^*BeUrS+cm>j@3zSLh|ScR`q+DA$T>u|t^RuJ#xctR&_eN;IqG1gleSn9f-2-KXq?JUK5dh6}WveDkwqUtwya z6#F{Lr8!UYGF|Vl8sBlS)#R4;^-qJ;P+VUI{{CobnDepY?z_v=b?=*tgt#qP{Fypd zGb97N4f7Td{`A0`Iudj@LKaj>3)fTHb}}1Iwu=|YS;sSvU@}W+YVy}K;YKDNKO*>; z?OBQ2_W4f`6Qn4MF>qa5gg_Cbn4QdzZsUI)%zxF;<2!09 zF`Zx$6o#t9P{b7AsXFqsQji2qy+t5bF#rizTEbeW)}Z3AdA^TSC=5QC{`TI`gL!B37U#-vlWt>Fv9*3`?h(obU{wYn#`t@ z%J#TsXnznwt~4r12}TgEM`x6f{C%It;C_+Wmta|9ci7GHXM+0D5&kaCi;|+_ffbHERjuu<{8_a>IxEK zOD3*7rv}SOVr&xFpGnKDjk4(~!5F^%mSeAc{)wQyy7sGYl=-9LO6Mr?LA7}fWM_>e zB;T0x#6wx*r6srH?I3whY4k^DHok!+rx=F&ceA$EC(aAjv8RF`%}v_x3+<~CeVygC zDtkZr0$SjDp%(by^1K&^4|X|?-D7o9P@fjf)5iV%>7SucmelKi8yAd}YRDJC*O<5W9(&E&Pk3d0gE>LjuWNhTaunVAmh?>9 z?P#CSYt9-qAFLkuNqa_1;P!=|muOr@CX@qVVqb$Zz7|O}^pzZ`?c;4NK2fNZo`e_{ zQ<4<$hz)=G4q{8J@qLu1u=URa;F5yK(Ip|Zt=TJ_^+P68l533uQ0X(ciXOG?-9@JT zFk!~>?`;mrn^emh$gTT4^Q%p(<=SHRF+O73O17>UR3HzI*ghJp*-!>~CDU!6f6RnK=9R!I+col2 zi8JC!r9rY`@3EZyyw9rLR-w2hd<1Ep3#AGoxq3gt{mgYAmqa$e+P(xFw`~PA`945v z)UJ@cPzGECp0RkLoQs_my~bBp%+v9Rbo)zmS@ZesyamyWtrt5L3UtHbla%}r@l|p; ze=>%oTP09KcHDW`6wSr*NYjp=kn4hfz>R|)p-sF%kxyawPOlRmhYiC&odKQaD0naq z6{j_SxC{F(Ez)`0gWVJJIk#=0{GZ4**R0y#8t4LCd&tVAMo7sJVA~_&gM$tD7`FDHy^=(nL>FJ z`ch^7p9zCE!wOTO{DyvhGoJckEo0T2V7?ki7niggGSP;)inrSta)>*Kl4XLQz%?x%zKHBeo<6;wcI5JV$RF4cJE3<+<|MXXz zq%}=M;J?q^Y`gM&l!`=giE(*1#x5v$Lye=P+osxo1$|L5Ewh=VO#k`pj@Gvs4Ep*t zKWw|yxKtDGy6V#TrfsZ#@9M^V14IA#HV+tCaaFuaLJ4NGU%}wLPsx8}5fsO-3RO<; zS>M$R8H_IB`ofdHN6|MyJ+Sg=3iTX{O=Yc;mRxo!iK$}8UDFS<+U5{+Njmbo}8P}=M_I_?X zZmxd$n4`u@6YNBMHF#@P0;Ls5*Rxyw*wYErAr=u z)F(=|?3yBIB&G7Z=R>{8X~Ld3;`R*!=*iegxI>S7vYcI;odfe>S#e-ZHUrC7wQ1A- zBBA!PZ(hv$rpAqjs#D1M3Hu+Hz{;2FmSNF7n62JgOM-dD(pUMY5{uFq(}Ifq7AfP5 zP{%!l&|ULA)UsQEew{Dwh)pV6;eZ!nZ!6B|!f`|T*M^_qf@`UYKXm+s3XWK z?1#H@oY}_R|AxquJl0p}$Ekviak^I{x{9Y!_f#twxg;K*6-@y=AvW~K870>oFt2F_ zjs2Gnx zq$yB1O~u?>E8ZDNN7If#^sCalWP z(-g8`<_n6+&J-nNP*N+j^+|e-r#7h7(+CG8!@Scg{p z3~y5}kYme zgL>laT|GB>?yFt5hT$tDC%eY1lL6#llyz`IH#`YmhDqEL+CaR6-DfA z@rs-A@nRT_Yt?xVV7;4ufh)`&Khq~d9>^ZGgjv7xn1RNFiNyP}E9LKvkLy`tq@3OFd*30BN`DP5XynYVu9uL)F- zQjB=ZB_&Ap8E!mhbQ^=SLw!e~8$qv4lDVmxq^@FmLVi}*0ub`6try^RAHr-^@6@Ow zAyQ6(rrcVI_)0R2gOGu-KN-faNr~Vv(Pb+ZpeDDni4`})S_H*LbY)4{I!h_+hKQt41f@^n@bb%CM)n|n4#EQ z1yaB;8XCOLw8W^fW&eOYdngwtg;66q>{iG{O>qqvqL9?N&-d7dPn|wFc(gs+ms&z0 zKDF6*f?YTPqp+E%_XM=jh|VBSFM_%ApUYUj7pHi?%Ym9f=XKLP%s7M;=Jnz2`9rUr z=YPIam(;w?#<**}Xw$|LOTSnH{3wmbbV=Ia7Q!@HtY6fT-xxhjR)D`XFm!h$_EZz!QPEQ+UNPf6J5nt?1!?PlAvd(aPfe%ZpSF_77YG() zQ<#M{y;x}HpF&iQryP$l9khh8;BcFvp4U!e6^o0xqDqLWp%~2T`m_#(Q`onI`D7=f1Fmmr7!Qh^38gA`oLdhbp^*wCnhb{kf&6!`mHzeu#obI!?u?axYRgbJqEo#xajb=CU~?JOoJ&iY@p zg8i8`IUj5b4Py(@h?(uVd$NdGBy&1ZH0n%zr)s+mNULYR?!{~IfEiD%GDWY4>OD86 zk;&67UUiZwlW|cmEY450y@G@^MBk9AX@Vr8Ae^c&F ze&Lt2PV$=CZOWZ=yQ`pc^UuuDiKF#YoM50i^+uo1p@&DTT~YpJirx~5r33d)i7O2{*CW>(p`C>TbcHTWl Date: Tue, 8 Sep 2026 08:54:55 +0200 Subject: [PATCH 2/4] Reformatted text --- docs/guide/using-librislog/library.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/guide/using-librislog/library.md b/docs/guide/using-librislog/library.md index 439e30de..7b998972 100644 --- a/docs/guide/using-librislog/library.md +++ b/docs/guide/using-librislog/library.md @@ -63,26 +63,26 @@ Search external sources for book metadata: - **Google Books** — Requires API key (set in `.env`) - **Hardcover.app** — Requires API token (set in `.env`) -Open Library and Hardcover (if an API token is configured) are queried **in parallel** for both title and ISBN searches. Google Books is only used as a **fallback** when the other sources return no results — or on demand via the **Search Google Books too** button, which adds Google Books results to the current results. +Open Library and Hardcover (if an API token is configured) are queried **in parallel** for both title and ISBN searches. Google Books is only used as a **fallback** when the other sources return no results, or on demand via the **Search Google Books too** button, which adds Google Books results to the current results. While a search is running, the **Search** button changes to **Cancel**, so you can stop the request at any time and refine your query. #### How results are grouped -Different providers often describe the same book slightly differently (title language, page count, publisher, cover). Instead of dropping these variants, LibrisLog keeps every result and groups the ones that represent the same book. Each group shows a **"N results"** badge with a **Show editions** toggle — expand it to review the individual records and pick the one you want to import. +Different providers often describe the same book slightly differently (title language, page count, publisher, cover). Instead of dropping these variants, LibrisLog keeps every result and groups the ones that represent the same book. Each group shows a **"N results"** badge with a **Show editions** toggle: expand it to review the individual records and pick the one you want to import. Results are grouped by this rule: -- **Same ISBN** — if two results carry the same ISBN, they are grouped together. ISBN-10 and ISBN-13 forms of the same ISBN count as equal (e.g. `0441013597` and `9780441013593`). -- **No ISBN — same title + same authors** — results without an ISBN are grouped by a normalized title (case- and whitespace-insensitive) together with the same sorted author names. +- **Same ISBN**: if two results carry the same ISBN, they are grouped together. ISBN-10 and ISBN-13 forms of the same ISBN count as equal (e.g. `0441013597` and `9780441013593`). +- **No ISBN, same title + same authors**: results without an ISBN are grouped by a normalized title (case- and whitespace-insensitive) together with the same sorted author names. Consequences you may notice: -- Two results with the *same title* but **different ISBNs** are **not** grouped — they are different editions (different language, publisher, or page count) and appear as separate entries. +- Two results with the *same title* but **different ISBNs** are **not** grouped: they are different editions (different language, publisher, or page count) and appear as separate entries. - A result with an ISBN and a result without one are never grouped, even if the title and authors match. - Results that differ only in metadata (cover, publisher, page count, description) but share an ISBN or title+author are grouped so you can compare them side by side. -Because an ISBN can only be owned once per user, a group with a shared ISBN always represents a single book — importing one variant is enough. +Because an ISBN can only be owned once per user, a group with a shared ISBN always represents a single book, so importing one variant is enough. ### ISBN Barcode Scan From cfc030996c1789182ee3d01a4dbb4b022e860581 Mon Sep 17 00:00:00 2001 From: codebude Date: Tue, 8 Sep 2026 09:23:44 +0200 Subject: [PATCH 3/4] Update release notes --- docs/releases.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index 2f86aa1d..52519c27 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -16,6 +16,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner | Version | Date | Type | |---|---|---| +| [v1.9.0](#v1-9-0-smarter-import-search-input-ux) | Unreleased | Feature release | | [v1.8.0](#v1-8-0-—-camera-zoom-control-optional-telemetry) | 2026-09-02 | Feature release | | [v1.7.0](#v1-7-0-—-reading-streaks-goals) | 2026-08-26 | Feature release | | [v1.6.0](#v1-6-0-—-reading-progress-possession-tracking) | 2026-08-23 | Feature release | @@ -34,6 +35,31 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- +## v1.9.0: Smarter Import Search & Input UX + + + +**Summary:** Groups duplicate import-search results into expandable edition groups, makes running searches cancelable, introduces an adaptive date input with a native picker, detects insecure camera contexts, and fixes timezone handling in the daily page statistics. + +**Features** +- 📚 **Edition groups in the import search**: results from different providers that describe the same book (same ISBN, or same title and authors) are now grouped into expandable entries with an "N results" badge. Compare the variants side by side and import the one you want; no result is dropped anymore. See the [Library guide](/guide/using-librislog/library#how-results-are-grouped) for the exact grouping rules +- 🛑 **Cancelable book search**: while an import search is running, the Search button becomes a Cancel button, so you can stop the request and refine your query +- ⌨️ **Escape closes dialogs and drawers**: overlays such as the sidebar, the book drawer, and the import modal can now be closed with the Escape key +- 📅 **Adaptive date input**: date fields in the book form now use a segmented year/month/day input that no longer assumes the month or day after the first keystroke, validates values as you type, and accepts pasting a complete date. A calendar button next to the field opens the native date picker +- 🌐 **Searchable timezone picker**: the timezone setting on the profile page is now a searchable dropdown covering all IANA timezones +- 📷 **Secure context detection in the barcode scanner**: if LibrisLog is served outside a secure context (plain HTTP on a remote host), the scan button is hidden and the scanner explains why the camera cannot start, instead of showing a black box. See the [Library guide](/guide/using-librislog/library#isbn-barcode-scan) for details +- 🔗 **Heimdall dashboard integration**: new documentation for the LibrisLog enhanced app, which shows your reading statistics directly on [Heimdall](https://github.com/linuxserver/Heimdall) tiles + +**Bug fixes** +- 🗓️ **Timezone-correct daily page statistics**: pages read between two progress updates are now attributed to calendar days in the user's timezone instead of fixed 24h slots, so the pages-per-day view matches your local days. Your heatmap may shift slightly after the upgrade +- 🏷️ **Better contrast for selected suggestion items**: the selected entry in tag and author suggestion dropdowns now has stronger contrast and a visible border in all themes + +**Breaking changes:** None. + +[Compare with v1.8.0](https://github.com/codebude/librislog/compare/v1.8.0...main) + +--- + ## v1.8.0 — Camera & Zoom Control, Optional Telemetry From b2f8caadbbfa486f554ae7f31244d6e01fcbad1b Mon Sep 17 00:00:00 2001 From: codebude Date: Tue, 8 Sep 2026 09:27:40 +0200 Subject: [PATCH 4/4] Unified release title headings in release notes --- docs/releases.md | 60 ++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 52519c27..97d1bda6 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -17,21 +17,21 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner | Version | Date | Type | |---|---|---| | [v1.9.0](#v1-9-0-smarter-import-search-input-ux) | Unreleased | Feature release | -| [v1.8.0](#v1-8-0-—-camera-zoom-control-optional-telemetry) | 2026-09-02 | Feature release | -| [v1.7.0](#v1-7-0-—-reading-streaks-goals) | 2026-08-26 | Feature release | -| [v1.6.0](#v1-6-0-—-reading-progress-possession-tracking) | 2026-08-23 | Feature release | -| [v1.5.2](#v1-5-2-—-maintenance) | 2026-06-22 | Maintenance | -| [v1.5.1](#v1-5-1-—-maintenance) | 2026-06-22 | Maintenance | -| [v1.5.0](#v1-5-0-—-password-reset-usability) | 2026-06-22 | Feature release | -| [v1.4.0](#v1-4-0-—-embeddable-views-arm64) | 2026-06-14 | Feature release | -| [v1.3.1](#v1-3-1-—-maintenance) | 2026-06-09 | Maintenance | -| [v1.3.0](#v1-3-0-—-more-languages) | 2026-06-09 | Feature release | -| [v1.2.2](#v1-2-2-—-maintenance) | 2026-06-08 | Maintenance | -| [v1.2.1](#v1-2-1-—-import-reliability-multi-user-consistency) | 2026-06-08 | Feature release | -| [v1.2.0](#v1-2-0-—-startup-screen-update-checks) | 2026-06-01 | Feature release | -| [v1.1.1](#v1-1-1-—-maintenance) | 2026-06-01 | Maintenance | -| [v1.1.0](#v1-1-0-—-polish-missing-covers) | 2026-05-31 | Feature release | -| [v1.0.0](#v1-0-0-—-initial-release) | 2026-05-28 | Initial release | +| [v1.8.0](#v1-8-0-camera-zoom-control-optional-telemetry) | 2026-09-02 | Feature release | +| [v1.7.0](#v1-7-0-reading-streaks-goals) | 2026-08-26 | Feature release | +| [v1.6.0](#v1-6-0-reading-progress-possession-tracking) | 2026-08-23 | Feature release | +| [v1.5.2](#v1-5-2-maintenance) | 2026-06-22 | Maintenance | +| [v1.5.1](#v1-5-1-maintenance) | 2026-06-22 | Maintenance | +| [v1.5.0](#v1-5-0-password-reset-usability) | 2026-06-22 | Feature release | +| [v1.4.0](#v1-4-0-embeddable-views-arm64) | 2026-06-14 | Feature release | +| [v1.3.1](#v1-3-1-maintenance) | 2026-06-09 | Maintenance | +| [v1.3.0](#v1-3-0-more-languages) | 2026-06-09 | Feature release | +| [v1.2.2](#v1-2-2-maintenance) | 2026-06-08 | Maintenance | +| [v1.2.1](#v1-2-1-import-reliability-multi-user-consistency) | 2026-06-08 | Feature release | +| [v1.2.0](#v1-2-0-startup-screen-update-checks) | 2026-06-01 | Feature release | +| [v1.1.1](#v1-1-1-maintenance) | 2026-06-01 | Maintenance | +| [v1.1.0](#v1-1-0-polish-missing-covers) | 2026-05-31 | Feature release | +| [v1.0.0](#v1-0-0-initial-release) | 2026-05-28 | Initial release | --- @@ -60,7 +60,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.8.0 — Camera & Zoom Control, Optional Telemetry +## v1.8.0: Camera & Zoom Control, Optional Telemetry @@ -83,7 +83,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.7.0 — Reading Streaks & Goals +## v1.7.0: Reading Streaks & Goals @@ -116,7 +116,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.6.0 — Reading Progress & Possession Tracking +## v1.6.0: Reading Progress & Possession Tracking @@ -138,7 +138,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.5.2 — Maintenance +## v1.5.2: Maintenance @@ -154,7 +154,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.5.1 — Maintenance +## v1.5.1: Maintenance @@ -169,7 +169,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.5.0 — Password Reset & Usability +## v1.5.0: Password Reset & Usability @@ -191,7 +191,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.4.0 — Embeddable Views & ARM64 +## v1.4.0: Embeddable Views & ARM64 @@ -213,7 +213,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.3.1 — Maintenance +## v1.3.1: Maintenance @@ -228,7 +228,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.3.0 — More Languages +## v1.3.0: More Languages @@ -245,7 +245,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.2.2 — Maintenance +## v1.2.2: Maintenance @@ -260,7 +260,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.2.1 — Import Reliability & Multi-User Consistency +## v1.2.1: Import Reliability & Multi-User Consistency @@ -282,7 +282,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.2.0 — Startup Screen & Update Checks +## v1.2.0: Startup Screen & Update Checks @@ -298,7 +298,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.1.1 — Maintenance +## v1.1.1: Maintenance @@ -315,7 +315,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.1.0 — Polish & Missing Covers +## v1.1.0: Polish & Missing Covers @@ -333,7 +333,7 @@ LibrisLog v1.8.0 brings camera selection and zoom control to the barcode scanner --- -## v1.0.0 — Initial Release +## v1.0.0: Initial Release