diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 582db2fa..8c7bf663 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.10.2"
+ ".": "0.10.3"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8cb47495..df70a35c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 0.10.3 (2026-08-21)
+
+Full Changelog: [v0.10.2...v0.10.3](https://github.com/Xquik-dev/x-twitter-scraper-java/compare/v0.10.2...v0.10.3)
+
+### Documentation
+
+* tighten Java setup and API guidance
+
## 0.10.2 (2026-08-20)
Full Changelog: [v0.10.1...v0.10.2](https://github.com/Xquik-dev/x-twitter-scraper-java/compare/v0.10.1...v0.10.2)
diff --git a/OPENSSF.md b/OPENSSF.md
index 03d4d728..8497d456 100644
--- a/OPENSSF.md
+++ b/OPENSSF.md
@@ -8,11 +8,7 @@ Assessment date: 2026-07-24.
## Eligibility
-This public Java SDK is active and released.
-
-It is eligible for the OpenSSF Best Practices badge.
-
-No OpenSSF-defined ineligibility applies.
+This active, public Java SDK qualifies for the OpenSSF Best Practices badge.
## Verified Technical Controls
@@ -36,17 +32,11 @@ No OpenSSF-defined ineligibility applies.
| CI | Pull requests and pushes run pinned, least-privilege workflows |
| Two-factor authentication | The Xquik-dev organization requires 2FA |
-The maintained-source gate covers 1,198 of 1,319 executable lines.
-
-That result is 90.83% line coverage.
+The maintained-source gate covers 1,198 of 1,319 executable lines (90.83%).
It covers 424 of 520 branches, or 81.54%.
-The raw report keeps untouched generated-source coverage visible.
-
-It covers 104,652 of 110,632 generated-inclusive lines, or 94.59%.
-
-It covers 27,560 of 30,010 generated-inclusive branches, or 91.84%.
+The raw report covers 104,652 of 110,632 generated-inclusive lines (94.59%) and 27,560 of 30,010 branches (91.84%).
Exclusions use the repository-owned, provider-neutral generated-source header prefix.
@@ -68,7 +58,7 @@ The license report covers 100 resolved runtime and test components.
Jazzer completed 3,544,654 retry-header iterations during this assessment.
-Maven Central published `v0.5.2` from the exact release tag.
+Maven Central published `v0.10.2` from the exact release tag.
All 15 public files verify with this OpenPGP fingerprint:
@@ -76,7 +66,7 @@ All 15 public files verify with this OpenPGP fingerprint:
The root JAR SHA-256 is:
-`87a9b770f16b32d016fac4220a5ec626d32871e692d9b7bc8d261be8e0a58e89`
+`7c0ba8741e41eae3c13f5d47e91e100668862b1ae03f57832bfa513e9e5b2393`
## Outstanding Gold Blockers
diff --git a/README.md b/README.md
index 1f3d5d2a..5a74bd08 100644
--- a/README.md
+++ b/README.md
@@ -3,31 +3,28 @@
[](https://github.com/Xquik-dev/x-twitter-scraper-java/actions/workflows/ci.yml)
[](https://www.bestpractices.dev/projects/13735)
-Use the Xquik Java SDK for Twitter search, timelines, profiles & followers.
-Manage media, webhooks & X automation with typed Java methods.
-It provides a Twitter API alternative through documented Xquik REST routes.
+Search Twitter, read timelines, fetch profiles & export followers with Xquik.
+Use typed Java methods for media, webhooks & X automation.
-[API Reference](https://docs.xquik.com/api-reference/overview) | [Authentication](https://xquik.com/auth.md) | [Javadocs](https://javadoc.io/doc/com.xquik.api/x-twitter-scraper-java)
+[API Reference](https://docs.xquik.com/api-reference/overview) | [Authentication](https://xquik.com/auth.md) | [Javadocs](https://javadoc.io/doc/com.xquik.api/x-twitter-scraper-java-core)
-[](https://central.sonatype.com/artifact/com.xquik.api/x-twitter-scraper-java/0.10.2)
-[](https://javadoc.io/doc/com.xquik.api/x-twitter-scraper-java/0.10.2)
+[](https://central.sonatype.com/artifact/com.xquik.api/x-twitter-scraper-java/0.10.3)
+[](https://javadoc.io/doc/com.xquik.api/x-twitter-scraper-java-core/0.10.3)
-## Choose the Java SDK
+## Java Client
-Choose this client for Java services using builders and typed models.
+Use this SDK for Java services with builders and typed models.
Use synchronous calls or `client.async()` for `CompletableFuture` pipelines.
## Common Twitter & X Tasks
-Map each task to its REST route and Java service.
-
| Task | REST Route | Java Service |
| --- | --- | --- |
-| Search tweets without the X API | `GET /x/tweets/search` | `client.x().tweets()` |
+| Run an advanced Twitter search | `GET /x/tweets/search` | `client.x().tweets()` |
| Retrieve tweets, threads, replies, or quotes | `GET /x/tweets/{id}`, `GET /x/tweets/{id}/thread` | `client.x().tweets()` |
| Search X or Twitter users | `GET /x/users/search` | `client.x().users()` |
| Scrape an X profile timeline | `GET /x/users/{id}/tweets` | `client.x().users()` |
@@ -55,7 +52,7 @@ Map each task to its REST route and Java service.
Gradle:
```kotlin
-implementation("com.xquik.api:x-twitter-scraper-java:0.10.2")
+implementation("com.xquik.api:x-twitter-scraper-java:0.10.3")
```
Maven:
@@ -64,7 +61,7 @@ Maven:
com.xquik.api
x-twitter-scraper-java
- 0.10.2
+ 0.10.3
```
@@ -96,7 +93,7 @@ export X_TWITTER_SCRAPER_API_KEY="your-api-key"
OAuth users can set `X_TWITTER_SCRAPER_BEARER_TOKEN` instead.
-Create 1 client and reuse it:
+Create one client and reuse it:
```java
import com.x_twitter_scraper.api.client.XTwitterScraperClient;
@@ -105,7 +102,7 @@ import com.x_twitter_scraper.api.client.okhttp.XTwitterScraperOkHttpClient;
XTwitterScraperClient client = XTwitterScraperOkHttpClient.fromEnv();
```
-You can also pass credentials directly:
+Pass credentials directly when needed:
```java
XTwitterScraperClient client = XTwitterScraperOkHttpClient.builder()
@@ -123,7 +120,7 @@ Supported client settings:
System properties override environment variables.
-## Search Posts
+## Search Tweets
```java
import com.x_twitter_scraper.api.models.x.tweets.TweetSearchParams;
@@ -165,7 +162,7 @@ XTwitterScraperClient client = XTwitterScraperOkHttpClient.builder()
.build();
```
-Xquik may return a successful HTTP response with a structured API error. Handle its documented code.
+Successful HTTP responses can contain structured API errors. Handle documented codes.
## Read Raw Responses
diff --git a/build.gradle.kts b/build.gradle.kts
index f635ad43..0437aebe 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -36,7 +36,7 @@ licenseReport {
allprojects {
group = "com.xquik.api"
- version = "0.10.2" // x-release-please-version
+ version = "0.10.3" // x-release-please-version
dependencyLocking {
lockAllConfigurations()
diff --git a/scripts/fast-format b/scripts/fast-format
index e6728507..84b2a1f0 100755
--- a/scripts/fast-format
+++ b/scripts/fast-format
@@ -6,43 +6,34 @@
set -euo pipefail
-echo "Script started with $# arguments"
-echo "Arguments: $*"
-echo "Script location: $(dirname "$0")"
-
cd "$(dirname "$0")/.."
-echo "Changed to directory: $(pwd)"
if [ $# -eq 0 ]; then
echo "Usage: $0 [additional-formatter-args...]"
- echo "The file should contain one file path per line"
+ echo "Provide one file path per line."
exit 1
fi
FILE_LIST="$1"
-echo "Looking for file: $FILE_LIST"
-
if [ ! -f "$FILE_LIST" ]; then
- echo "Error: File '$FILE_LIST' not found"
+ echo "File list not found: $FILE_LIST. Check the path."
exit 1
fi
if ! command -v ktfmt &> /dev/null; then
- echo "Error: ktfmt not found"
+ echo "ktfmt is unavailable. Install it first."
exit 1
fi
# Process Kotlin files
-echo "==> Looking for Kotlin files"
kt_files=$(grep -E '\.kt$' "$FILE_LIST" | grep -v './buildSrc/build/' || true)
-echo "==> Done looking for Kotlin files"
if [[ -n "$kt_files" ]]; then
- echo "==> will format Kotlin files"
+ echo "==> Formatting Kotlin files"
echo "$kt_files" | tr '\n' '\0' | xargs -0 ktfmt --kotlinlang-style "$@"
else
- echo "No Kotlin files to format -- expected outcome during incremental formatting"
+ echo "No Kotlin files found. Nothing to format."
fi
# TODO(mbudayr): support palantir-java-format