Here are complete, clear, step-by-step details of the Susila Polyclinic App that I already created for you in the canvas.
This explains how it works, what features it has, and how you can make it a real production app.
---
✅ SUSILA POLYCLINIC APP – FULL DETAILS
Your app is built as a single-file HTML web application.
It includes design + frontend logic + offline features all inside one file.
---
🔷 1. MAIN FEATURES INCLUDED
✔ Appointment Booking System
Patient enters Name, Phone, Service, Date, Notes
Form has real-time validation
On submit:
Sends data to backend /api/appointments
If network fails → Saves offline and retries when online
✔ Services List
Shows all available clinic services:
General Consultation
Pediatrics
Dermatology
Displays price + duration
Can be extended easily
✔ Save Draft (Auto Storage)
Patients can click Save Draft
Saves details to localStorage
When they reopen the app → Draft auto-loaded
✔ Offline Mode Queue
If the internet is down:
Appointments get stored as pending
When network comes back → auto-send to server
**
Keep it simple, Manage the states properly and use the hooks wisely, let your components be small and functional. Be sure with whatever you are doing.
As keinabel stated, this is unfortunately not possible.
Here are the potential workaround approaches:
Links should be formatted like this:
<file://domain.server.com/directory>
(Some engines may require the link formatted with more slashes at the beginning:
<file:////domain.server.com/directory>
)
However, you need to add this note:
(Right-click > Copy link address, and paste it into Windows Explorer)
Result: file://domain.server.com/directory
(or file:////domain.server.com/directory)
If anyone knows or finds another method, please let me know.
You can either in your <> link replace spaces by %20 (like you should for ordinary []() links too).
Alternatively, the following approach also works:
[\\\\domain.server.com\share\folder\subfolder\My Folder](file://domain.server.com/share/folder/My%20Folder)
Result:
\\domain.server.com\share\folder\subfolder\My Folder ((Right-click > Copy link address, and paste it into Windows Explorer))
You have to test whether your Markdown engine also supports this form:
[\\\\domain.server.com\share\folder\subfolder\My Folder](//domain.server.com/share/folder/My Folder)
If I'm understanding your question, you are able to store data in a SharePoint list or on the backend of a form, save it to OneDrive to manipulate with Excel and then import the Excel into PBI. A similar process could be followed with SQL.
However, I'd recommend performing the functions and manipulations in PBI to reduce the risk and make the process cleaner. Though, I can appreciate the idea of getting the data ready in excel, first, then moving to PBI. When I started with PBI I did that but then forced myself to re-make it all in PBI so I could remove Excel from the process. In the long run, that will be better and introduce less variables.
why am i getting response like ls: aliased to ls --color=auto when i am type the command " which ls "?
New API from requires you to sign in with their play integrity API for the app that are performing sensitive actions from your app like. Deleting file, changing account email, password etc. They have documented everything you need to know here.
@463035818_is_not_an_ai I don't know how to properly use this either but I decided that not having provided a benchmark was too much of an issue because people would just upvote that a benchmark was needed and ignore the actual question. Frankly I prefer using the more traditional format where questions and answers are improved as needed
@Homer512 Provided what I consider to be an excellent answer, I think the question and his answer are really all that are needed for other readers
This is a version for standalone component (Angular 15+)
You need withInMemoryScrolling: https://angular.dev/api/router/InMemoryScrollingOptions
// app.config.ts
import { ApplicationConfig } from '@angular/core';
import { provideRouter, withInMemoryScrolling } from '@angular/router';
import { appRoutes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [provideRouter(
appRoutes,
withInMemoryScrolling({
scrollPositionRestoration: 'enabled',
anchorScrolling: 'enabled',
})
)],
};
// your component
<a routerLink fragment="some-id">Scroll Top</a>
That is correct, but can you make it for me as searching method like find or anything else
No, the problem is exactly that now in framework mode you no longer have index.html file.
Instead you need to create a root.tsx file with Layout which automatically generates inline scripts, through the <Script /> component.
Check it out
https://reactrouter.com/upgrading/router-provider#4-add-the-root-entry-point
If you're transfering files, it does get a bit more complicated, you'll probably have to ensure that Mojolicious is streaming the files, rather than gobbling them up into memory first.
const htmlDecode = (input: string): string => {
const doc = new DOMParser().parseFromString(input, 'text/html')
return doc.documentElement.textContent || ''
}
Maybe this is more modern way.
I foud that I missed to add row
await updateManager.DownloadUpdatesAsync(newVersion);
in my code. I thou it was some kind of file upload from a cloud source. But it looks like its uploading resources from a folder to a folder on the users PC (some kind of temporary folder that will be used after ur app is stopped).
I have solved this issue by adding latest version of worklet library even though my project doesn't support it and also adding latest version of reanimated library
I re-validated my WhatsApp Business eligibility, synced the Business Account with my app again, cleaned up an inactive test number tied to an expired payment profile, and regenerated a fresh access token. That resolved the webhook's business eligibility/payment’ error instantly.
In case this helps others. I was having this same runtime error when calling a really simple function. Finally I did realize I did mistakenly declare the function to return a QString value, when it wasn't my intention. Since the function was expected to return something, and it didn't, the error occured just before ending the function call.
It looks like you're trying to pass a specific value from your row into the isin() method. If you try using
if df.loc[n] in First_row that should get you past the first step. In any case the issue is definitely that you're giving isin() a value and not a list. Rather than embedding these loops super deep could you turn it into separate sections? I expect you'll run into trouble with i being reused like this as well, so iterating through each row separately will work better and you can just save i to a unique index variable. As it is your final printout will use the final value of i and print out every value what whatever index df.loc[n] is present in the third_row.
You can install add-ons in Blender using Python with bpy.ops.preferences.addon_install
bpy.ops.preferences.addon_install(filepath = '\path\to\zip\file')
Is this maybe a XY problem? In this case I would instead try using an enum Param with all the possible parameter types as enum options. Then use a Vec<Param> instead of tuples.
edit: Also can't you use a type alias?
When creating a new database diagram in SSMS I could only choose tables, not views. View dependencies can technically be viewed in the view design, but that will only show the dependencies for a single view, while I would like a diagram of the whole database.
Is there any way to avoid writing the full T?
Is a "How to" question with factual answers. But if you don't want an answer you do you.
You can try the ignoreCorruptFiles option, documentation.
This question is exactly seeking opinionated advice, there can't be factual or 'correct' methods when you simplify the code.
I assume that you have ruled out the Database Diagrams feature that exists in SSMS? Can you elaborate why that wasn't suitable, as that'll give details on what features it is missing for your needs.
In addition to SSMS Database Diagrams feature, I've also used Redgate's SQL Dependancy Tracker for visualisation as well, though that is a paid product.
You're missing "proxy_next_upstream"
location / {
proxy_pass http://backends ;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504 non_idempotent;
....
}
double check the key or other silly whitespace trailing issues
You are totally there. Find out what's up with the key. I am using free version and using the same config, in on Linux though.
you can use "az webapp config set" with "--min-tls-cipher-suite".
Here is the official document. https://learn.microsoft.com/en-us/cli/azure/webapp/config?view=azure-cli-latest
So you're using React Router 7 in Framework Mode and via following this document -> https://reactrouter.com/how-to/spa#single-page-app-spa ?
Perhaps using Data Mode and then just modifying Vite initial start point (index.html) should be fine?
I am assuming you have an index.html on root, where then is something defined like this:
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
Where root is the entry point of the app, can't you modify this file for what you need?
Most likely, the report contains subreports with their own parameters. You can avoid repeated prompting by LINKING the subreport parameters to main report parameters.
Try to change the type of scheduler. There are many available in Pytorch.
Otherwise try to change the number of classes nc=7 directly in the configuration file defined at DEFAULT_CFG_PATH.
You cannot remove the iOS keyboard accessory bar in a normal React web app.
It’s controlled by iOS, not the browser, and can't be hidden with CSS or JavaScript.
Only possible in a native iOS app, not on the web.
Thank you very much for the answers. I suspected that it can't be done as I expected. I have probably been ruined by C++.
You should mention your target OS in the question.
Linux: compute a single hash for a given folder & contents? could be a candidate for a duplicate, if you're looking for a Linux solution.
I am using Array Networks Load Balancer in front of two Apache web servers (RHEL 8, Apache 2.4.62).
My issue is: Apache access logs only show the Load Balancer IP, not the real public client IP.
What I need:
I want Apache access logs to store the actual client’s public IP, not the LB’s IP.
What I have tried:
Enabled mod_remoteip in Apache
Added this configuration:
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy <LB_IP>
LogFormat "%a %l %u %t \"%r\" %>s %b" combined
Restarted Apache
I also used tcpdump and I see packets coming from the LB, but everything is in hex format because traffic is HTTPS (port 443).
I am not sure whether the Array LB is actually inserting the X-Forwarded-For header or not, and Apache still logs only the LB IP.
Installation process most probably stops at Reinitializing system properties message because pingDS has no enough free disk space. IT requires almost 6GBs of free disk space. You can find relevant error message regarding this at the ldap-access.audit.json file.
If you want a clean code.
list1 = [1, 2, 3]
list2 = [2, 3, 4]
list3 = [4, 5]
merged = list(set(list1 + list2 + list3))
print(merged)
// Result -> [1, 2, 3, 4, 5]
Actually, what solved my problem was this script:
# Put Azure CLI path before /mingw64/bin
export PATH="/c/Program Files (x86)/Microsoft SDKs/Azure/CLI2/wbin:$PATH"
Do not use
ini_set('memory_limit', '-1');
on a production server.
It means that PHP can "eat" all available memory on a server. It can be handy for testing/debugging apps but it should NOT be used on production servers.
Editing php.ini file should be sufficient. Also do not forget to restart PHP.
You may fetch offsets for all topics with
kafka-get-offsets --bootstrap-server <SERVER>:9092
or for specific topic with
kafka-get-offsets --bootstrap-server <SERVER>:9092 --topic <TOPIC>
I am facing the similar issue when animation width - 'auto' on animate the animation jitters a little bit at the end of exit.
<motion.div
style={{ justifyContent: 'flex-end' }}
className="flex items-center gap-4 bg-background backdrop-blur-2xl border rounded-full p-2 origin-right h-9"
>
<AnimatePresence mode='wait'>
{isActive && (
<motion.div
layout
layoutId='item'
initial={{ width: 0, opacity: 0, filter: 'blur(2px)' }}
animate={{ width: 'auto', opacity: 1, filter: 'blur(0px)' }}
exit={{ width: 0, opacity: 0, filter: 'blur(2px)' }}
transition={{
duration: 0.3,
ease: 'easeInOut',
delayChildren:0.1
}}
style={{ transformOrigin: 'right'
}}
className="overflow-hidden relative"
>
<div className='flex items-center gap-4'>
<NavigationItem text="Home" href="/" />
<NavigationItem text="Documentation" href="/docs" />
</div>
</motion.div>
)}
</AnimatePresence>
<Menu
animate={isActive == true ? true : false}
className="w-5 h-5 flex-shrink-0"
onClick={() => setIsActive(!isActive)}
/>
</motion.div>
You cannot categorize anything just on the name, unless the name contains some word(s) that hints at the category.
Not with an MSI. The MSIEXEC process will not allow this UI element through. The best that you can do is to write a string to the log with the same information.
I think approach 1 should work with a small tweak:
The problem is caused by the mismatching bookmark-names. Since you create a bookmark named "event", the workflow engine is waiting for a stimulus with that name. So, if you change
var stimulus = "myevent";
to
var stimulus = "event";
this should be fixed.
In my case, it was solved when I upgraded toolVersion in:
jacoco {
toolVersion = "0.8.13"
}
If speed and low overhead are high on your list, Tuskr is definitely worth shortlisting.
Out of the tools you mentioned, it has been the snappiest in real usage for me. The run logs load quickly even for longer suites, and the UI stays responsive without the “TestRail lag” effect. The test case structure is clean enough that you can onboard people without a long setup phase, but it still supports linking runs to builds or tickets in a way that feels natural instead of bolted on.
Just add a trailling slash when you are doing a PUT request otherwise it will redirect you and make it a GET request
here is my modest proposal gist.github.com/bd77ca6679bc3b2aad8009b4077b5902.git it contains two classes that rotate and compress CompressedTimedRotatingFileHandler and CompressedRotatingFileHandler
I see this issue thats why making a plugin called "Post Title Trimer", so you can use it. https://wordpress.org/plugins/cpt-post-title-trimer/ here's plugin link.
@CoderForHire Thank you for the security reminder - you're absolutely right! I'm already getting the UserId from the server-side JWT token via IHttpContextAccessor, never from client input. That was a concern I had from the beginning.
and your question: "What would you use the navigation entities for?"
The user information (CreatedBy/ModifiedBy names) is displayed in:
+product detail pages - showing "Created by John Doe on 2024-01-15"
+admin audit logs - tracking who made changes
+history/activity feeds - "Product 'iPhone 15' was updated by Jane Smith"
so yes, I do need to display this information, but not on every query - only on detail views and admin pages, given that:
+I only need this info for detail views (not list views)
+my current approach with separate queries is working fine in production
+the BaseEntity pattern is already established in my codebase
I think I'll stick with my current approach (Option 2) - querying users separately when needed. The extra 1-2 queries for detail views seem acceptable compared to adding navigation properties to every entity that inherits BaseEntity.
I traced the issue to an outdated version of styled-components that wasn’t compatible with React 19. After upgrading it to the latest version, everything worked again.
For context: I upgraded to React 19 first while still on React Native 0.77 (which was using React 18), before moving up to a newer React Native version. I’ll double-check the rest of the dependencies for React 19 compatibility as well.
try : CH34xFIX fix this error (Permission 13) : https://github.com/Cyrillinux/esptool/releases/download/packages/CH34xFIX.zip
Good luck
Cyril
I'm not a PDF specialist and I work with "client goods".
We are required to have this type of form and I would have liked to inject data into it from my application, rather than filling it out manually. However, the signature part prevents me from automatically filling out XDP section B.
I suspected cheating. THERE WAS SO MUCH MORE! The Barry Cyber Investigations saved my future. Really. F all those people who tried to gaslight me and tell me why I shouldn’t hire someone to make sure I wasn’t lying to myself. He certainly was. Now I am in a better place. Take your power back people. I 1000% recommend. Wish I had made the call sooner. Contact Danny via email using InfoATthebarrycyberinvestigationsDOTcom or via WhatsApp at +1(814) 488-3301
There's a removal notice here for WebSphere Liberty, which is built from Open Liberty so the same applies: https://www.ibm.com/docs/en/was-liberty/nd?topic=liberty-removal-notices#rwlp_remfeat__29001_se8
With a more detailed explanation here: https://community.ibm.com/community/user/blogs/macdara-butler/2025/11/13/liberty-java-8-support which says:
The final Java 8 release of Liberty has been changed to 28.0.0.12, with iFixes provided until December 2030.
29.0.0.1 will be the first release of Liberty to not support Java SE 8, as noted in the Liberty Removal Notices.
There is a 29.0.0.1 in the "End of Open Liberty support" for version 8 at https://openliberty.io/docs/latest/java-se.html#supported
Does that mean January 2029?
https://www.ibm.com/docs/en/was-liberty/base?topic=liberty-removal-notices#rwlp_remfeat__29001_se8 <- we see in the Java SE 21 entry that "29.0.0.10" means October 2029, so yes.
You can hide access to the organisation settings by adding users to the Project-Scoped-User group. Needs to be enabled as a preview feature. See the section "Restrict user visibility to organization and project information" at the following link
Custom parameter groups and root user with grant privilegese works also for me.
mysql -h ***.rds.amazonaws.com \
-u root -p \
--ssl-mode=REQUIRED \
--default-character-set=utf8mb4 \
database < /tmp/backup.sql
in my case my new resources same sames names like existing ones
if it you case too, just try to use resources without custom names or first find the old ones and remove them if possible
flutter pub cache clean
flutter clean
flutter run
groupValue is not actually used inside the _buildRadioButton widget.
onChanged is passed because it’s needed for the InkWell tap handling — I’m using InkWell to keep the current UI design and control the tap area.
You could calculate the value of P where V next changes, and just check if you're less than that.
It turned out that when in full debug mode, FastMM never releases the used memory back to the OS. The memory is released back into the unallocated memory pool and re-used internally (by your program) when needed, but never back to Windows.
Source of information: https://www.youtube.com/watch?v=204qa4wVR2I
Also an issue in slightly old browsers as this feature was added to browsers in 2023 or there around: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers#browser_compatibility
Legacy version of pdfjs fixes this, so use that or require newer browser versions.
I was able to solve the issue using following lines of code -
Using apostrophe!
Please note - I still use Robot Framework SSH Library.
All this code is running from a .robot file and executes on a remote machine with a SSH connection open!
${part1} = Set Variable py ""${remote_file_full_path}
${part2} = Set Variable --id 11064 --output C:\\Sandeep\\process_output.txt""
${part3} = Catenate ${part1} ${part2}
${status}= Execute Command ${part3} return_stderr=True return_stdout=True
thanks!
I don't know whether your SDK is a dynamic library or a static library. If it is a static library, you can use addresses to filter the addresses in the crash stack. If it is a dynamic library, you can filter by image name. As for the initialization location you mentioned, it can definitely be initiated in the API of your SDK. If your API is not called, there is no need to worry about crashes occurring inside your SDK at all.
View = A live camera feed (always shows current scene)
Materialized View = A photo (shows the scene at the time it was taken, updated occasionally)
I got the solution for the above problem just force install the numpy version 1.24.4, restart the kernel and it works well.
The manual dark mode toggle allows users to switch between light and dark themes, while by default, the website automatically follows the system’s color scheme for seamless user experience.
why are you passing onChanged and groupValue to _buildRadioButton?
add to .zsh file these:
typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=0
typeset -g POWERLEVEL9K_DIR_SHORTEN_STRATEGY=none
How it will solve my problem? I expect to pass the string to a method it may either hex code string or named color string and it should return the color.
In my case this error is resolved by setting the startup project in the solution to the API project.
Just an additional note: In https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Configuration-Changelog I see spring.thymeleaf.enabled as removed with "No longer required.".
From my own experience, modern lightweight tools usually feel much smoother than traditional ones like TestRail when accessing logs. I haven’t used Tuskr extensively, but Quase’s UI and run-log loading have typically been quick for small QA teams. It also helps that you can link results to tickets without heavy setup. If your priority is minimal maintenance and fast execution workflows, tools built for smaller teams tend to perform better long-term.
I've sorted this out. See the comment in https://github.com/spring-projects/spring-boot/issues/48280#issuecomment-3575462316
Thank you very much, woxxom, for your always knowledgeable answers.
Can you predict that navigation will occur from the content script and wake up the background script by sending a message? This will require you to run a content script in arguably every web page and frame, so it will consume megabytes for users with many tabs which is much more wasteful than keeping the background script alive.
Hmm, that gives me an idea. In fact, clicks on such intercepted URLs only occur on pages of the same domain, and I already insert a content script into all pages of such domains for other reasons. So I could simply send heartbeat messages from the content scripts to the background script to keep it alive only when pages from such domains are open, and the background script could then go inactive when no such pages are open. In this case, I can register the listener asynchronously only for the relevant URLs. That should work and be a reasonable compromise, right?
I see a similar use case in WECG suggestion #908, so it would make sense to open an issue there
I don't think it's quite the same issue. It addresses other issues that I also have/had, such as that there are no DNR events in no-dev mode, which I think is another major shortcoming, or that I didn't want the ERR_BLOCKED_BY_CLIENT error page to be displayed when a request is blocked. The browser should just do nothing.
I ended up using the redirect rule to redirect requests to a public 204 ‘no content’ endpoint for the ‘block’ and listening for the onHeadersReceived event for that redirect URL to be notified when a ‘block’ occurred. It’s again a hack, but it works...
but many important use cases have been crippled or completely destroyed for years going forward until a better alternative is devised in the API, if ever.
Hope dies last...
我也遇到的同样的问题,datagrip无法连接postgresql 报错提示【ERROR: units "epoch" not supported在位置:referenced column: startup_time.】
The latest version supported by pygame is Python 3.13, so the best way is to install Python 3.13 or earlier versions.
The error "ModuleNotFoundError: No module named 'setuptools._distutils.msvccompiler'" occurred here, which is for Python 3.13 for windows.
If you must use Python 3.14, you can try to compile code with a lower version of the setuptools, as the latest version of setuptools has already deprecated distutlis.
One more thing not mentioned here before - Windows 11 has "Smart App Control", starting from 22H2. If enabled, app may just fail to load unsigned DLLs and you will get "Part of this app has been blocked" notification from Windows.
You can build your output payload up to the 6mb limit, any log records after that you can reingest into the kinesis stream.
Issue is resolved after using quarkus.rest.fail-on-duplicate=false configuration suggested by @geonand.
Thank you for the help.
Check this url for more information https://github.com/quarkusio/quarkus/issues/51203
Add below code to the end of .p10k.zsh.
# Force p10k dir segment to display full $PWD instead of ~
function prompt_dir() {
p10k segment -i '' -t "$PWD"
}
In my case it's work with opening wamp\alias\phpmyadmin.conf file and increase same time there like php.ini
max_execution_time = 259200
max_input_time = 259200
memory_limit = 1000M
upload_max_filesize = 750M
post_max_size = 750M
What I understood is that you are trying to switch off gradient checkpointing, which is fine if you have enough GPU memory.
TO achieve this, before you define the training configs of the Trainer class, use the prepare_model_for_kbit_training() method.
The way you do this is below:
model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=False)
This does not work for me. I have .NET SDK 8 and want to install dotnet-ef 9.0.10. According to Microsoft (learn.microsoft.com/en-us/ef/core/miscellaneous/platforms) this should be compatible.
I’m experiencing the same issue. I recommend creating a corresponding report in Google’s official Issue Tracker and following up there for better tracking.
Please explain the broader context here; for example, by "ingredient" do you mean literally something for a food-recipe, or is that a more abstract term for a component part of your system? (And if so, then please tell us what your system actually does).
Also, please edit your post to include the full definitions of createDomainObject, InventoryItemKind, DomainTypes, NamedCoreModel, CoreModel, IsPerishable, and IsIngredient.
除了配置firebase,还需要到https://console.cloud.google.com/apis/credentials?project=xxxx 上配置你这个项目,获取的就不会是null了,记得还需要配置。
location /__/auth {
proxy_pass https://<project>.firebaseapp.com;
}
It didn't work for me. I completely delete my ios folder and recreate it again
Is this solution viable? I cannot achieve the required result using this approach. The FontFamily object for WPF is successfully created, however, when I apply the font to a control, the text rendering does not change.
Add a strong default password using the
OPENSEARCH_INITIAL_ADMIN_PASSWORD
environment variable.
There is no default admin password set: https://opensearch.org/blog/replacing-default-admin-credentials/
Ben from the future:
The underline is finally here! November 2025. That must have been an impossible feature to implement.
We have encountered the same issue that you described:
ExternalPurchaseCustomLink.token(for:) returns nil on one TestFlight device (while isEligible == true) — other device gets SERVICES token
Could you please let us know how you resolved it and what the underlying cause was?
For context, we are working in React Native.
Thanks for the advice!
The goal was to make pinch-to-zoom enlarge everything (text included) while keeping the layout reflowed, so users with poor vision could see all content at once without horizontal scrolling. But I get now that changing native pinch behavior—especially for accessibility—can cause more harm than good
Found a way to avoid this issue. Using SQL format as input data type works (instead of DICT or CSV)
new update now use
@react-native-documents/picker
for migrate to a new package i recommend this article
https://medium.com/@anazrasak/file-upload-with-react-native-document-picker-updated-how-to-use-the-new-package-45d4a4302b56
Good luck
I think @Dan Guzman is right.
The NCI_UNQ_001_PO_Concept_Status index on the Orders table is ready and active, so it has protected your data from duplication.
The error message "Cannot insert duplicate key row in object 'dbo.Orders' ..." means that you tried to insert data into the Orders table from somewhere and this index did not allow it - very correctly. So, look for duplication in the source table.
in fiber framework simply
c.ClearCookie()
My end goal is I wanted is the transparent overlay should move like user can customise according to their need like make it small or big and how its working when user move the container left it gets small and when right it gets large in width and same for up and down
Great insights in this article!
It made me think about measuring human performance beyond traditional analytics.
I recently tried a simple reaction time test online, and it was surprisingly accurate: https://reactfasttest.com/
Could be a fun way to complement performance tracking.