writinglife.kobo.com Thread. Authored by weaver-auto. License: open.
These checks run before every recipe. Any failure halts execution and notifies you.
This is what installs to ~/.webloom/threads/. No magic. Just JSON.
{
"domain": "writinglife.kobo.com",
"name": "writinglife.kobo.com Thread",
"version": "1.0.0",
"author": "weaver-auto",
"license": "open",
"created_at": 1779181355,
"seed_url": "https://writinglife.kobo.com/",
"anti_bot": {
"verdict": "normal",
"signals": [],
"page": {
"title": "Sign-in | Rakuten Kobo",
"url": "https://authorize.kobo.com/signin?returnUrl=https%3a%2f%2foauthv2.kobo.com%2fconnect%2fauthorize%2fcallback%3fnonce%3d77af3694-61f4-4895-b2db-4374b56cbbcc%26code_challenge%3dKkN3vnn_zIODsf35e0pxrAoYyBSZpwNeOfWtZTX2UFU%26code_challenge_method%3dS256%26response_type%3dcode%26client_id%3dselfweb%26redirect_uri%3dhttps%253A%252F%252Fwritinglife.kobo.com%252Fredirect%26scope%3dopenid%2520kobo_profile%2520public_api_authenticated%2520public_api_anonymous%26state%3d9f9ovce8fi9e331et3rq6d0jcb",
"bodyLen": 307,
"interactiveCount": 41,
"ready": "complete"
}
},
"framework": {
"frameworks": [],
"raw": {
"frameworks": [],
"primary": "vanilla",
"indicators": {
"has_password_input": true,
"has_file_input": false,
"has_label_wrapped_file": false,
"has_drop_zone": false,
"iframe_count": 2
},
"page": {
"title": "Sign-in | Rakuten Kobo",
"url": "https://authorize.kobo.com/signin?returnUrl=https%3a%2f%2foauthv2.kobo.com%2fconnect%2fauthorize%2fcallback%3fnonce%3d77af3694-61f4-4895-b2db-4374b56cbbcc%26code_challenge%3dKkN3vnn_zIODsf35e0pxrAoYyBSZpwNeOfWtZTX2UFU%26code_challenge_method%3dS256%26response_type%3dcode%26client_id%3dselfweb%26redirect_uri%3dhttps%253A%252F%252Fwritinglife.kobo.com%252Fredirect%26scope%3dopenid%2520kobo_profile%2520public_api_authenticated%2520public_api_anonymous%26state%3d9f9ovce8fi9e331et3rq6d0jcb",
"ready": "complete"
}
}
},
"fingerprints": {
"body_class": "",
"title": "Sign-in | Rakuten Kobo",
"url": "https://authorize.kobo.com/signin?returnUrl=https%3a%2f%2foauthv2.kobo.com%2fconnect%2fauthorize%2fcallback%3fnonce%3d77af3694-61f4-4895-b2db-4374b56cbbcc%26code_challenge%3dKkN3vnn_zIODsf35e0pxrAoYyBSZpwNeOfWtZTX2UFU%26code_challenge_method%3dS256%26response_type%3dcode%26client_id%3dselfweb%26redirect_uri%3dhttps%253A%252F%252Fwritinglife.kobo.com%252Fredirect%26scope%3dopenid%2520kobo_profile%2520public_api_authenticated%2520public_api_anonymous%26state%3d9f9ovce8fi9e331et3rq6d0jcb",
"a_declarative_count": 0,
"a_button_count": 0,
"forms_count": 2,
"next_data": false,
"nuxt": false,
"react": false,
"redux": false
},
"pacing": {
"signals": {
"cloudflare": false,
"hcaptcha": true,
"recaptcha": true,
"akamai": false,
"datadome": false,
"kasada": false,
"perimeter": false
},
"profile": "cautious"
},
"inputs": [
{
"tag": "input",
"id": "LogInModel_UserName",
"name": "LogInModel.UserName",
"type": "text",
"placeholder": "Email address",
"aria_label": "Email address",
"role": null,
"content_editable": false,
"fill_strategy": "fast_setter"
},
{
"tag": "input",
"id": "LogInModel_Password",
"name": "LogInModel.Password",
"type": "password",
"placeholder": "Password",
"aria_label": "Password",
"role": null,
"content_editable": false,
"fill_strategy": "fast_setter"
}
],
"buttons": [
{
"tag": "button",
"id": null,
"text": "Show\n Hide",
"aria_label": "Password hidden",
"click_strategy": "js_dispatch"
},
{
"tag": "button",
"id": null,
"text": "Continue",
"aria_label": null,
"click_strategy": "js_dispatch"
},
{
"tag": "button",
"id": null,
"text": "Reset Password",
"aria_label": null,
"click_strategy": "js_dispatch"
}
],
"priors": {
"sources": [],
"candidate_selectors": []
},
"preflight": [
{
"name": "input_LogInModel_UserName",
"kind": "selector_exists",
"probe": "#LogInModel_UserName",
"expected": "input #LogInModel_UserName"
},
{
"name": "input_LogInModel_Password",
"kind": "selector_exists",
"probe": "#LogInModel_Password",
"expected": "input #LogInModel_Password"
},
{
"name": "button_show_hide",
"kind": "button_text",
"probe": "show\n hide",
"expected": "button 'show\n hide'"
},
{
"name": "button_continue",
"kind": "button_text",
"probe": "continue",
"expected": "button 'continue'"
},
{
"name": "button_reset_password",
"kind": "button_text",
"probe": "reset password",
"expected": "button 'reset password'"
}
],
"states": []
}