# Changelog of Medium Following Scraper (`codingfrontend/medium-following-scraper`) Actor

- **URL**: https://apify.com/codingfrontend/medium-following-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/codingfrontend/medium-following-scraper.md

## Changelog

### \[1.1.0] - 2026-08-31

#### Security and correctness

- Removed browser fingerprinting, WebDriver-suppression flags, and Medium's internal GraphQL endpoint.
- Replaced private-endpoint extraction with bounded DOM reads from the public following page.
- Added strict input validation, truthful provenance fields, exact output-schema validation, and automated tests.

### \[3.0.0] - 2026-05-22

#### Changed

- Increased scroll attempts from `ceil(maxItems/10)+3` → `ceil(maxItems/5)+5` for each user profile
- Increased scroll wait from 2s → 3s to give Medium more time to lazy-load cards
- Increased `maxConcurrency` from 3 → 5 for parallel multi-user scraping
- Only stop early on empty scrolls after at least 3 attempts (avoids premature exit)

All notable changes to the Medium Following Scraper are documented here.

### \[1.1.0] - 2026-05-21

#### Added

- **Multiple usernames support**: New `usernames` array input — scrape following lists for multiple users in one run.
- **Parallel processing**: Added `maxConcurrency: 3` to PlaywrightCrawler.
- Input schema updated with `usernames` (stringList) field.
- Fixed final log to correctly report `state.totalScraped`.

#### Changed

- `validateInput` now accepts and passes through `usernames` array.
- Single `username` field now optional when `usernames` array is provided.

### \[1.0.0] - 2026-05-21

#### Added

- Initial production release of the Medium Following Scraper.
- Medium internal API-based architecture for efficient following list extraction.
- Support for single `username` input with cursor-based pagination.
- Modular project structure:
  - `src/main.js` — entry point with input validation and crawler init.
  - `src/routes.js` — Crawlee router factory.
  - `src/routes/handlers.js` — page handler with pagination logic.
  - `src/extractors/` — following profile data extraction logic.
  - `src/filters/` — URL-based deduplication.
  - `src/schema/input.js` — input validation (username, maxItems).
  - `src/utils/` — URL builder, helpers, and API call utilities.
  - `src/errors/` — `ScraperError`, `ErrorTypes`, `ErrorHandler`.
- Output fields: `username`, `displayName`, `bio`, `followerCount`, `isMember`, `profileUrl`, `avatar`.
- `.actor/actor.json`, `input_schema.json`, `dataset_schema.json` for Apify platform compatibility.
- Dataset views in `dataset_schema.json` for Apify Storage table display.
- `validate-datasets.js` for local dataset output validation.
- `Dockerfile` for Apify cloud deployment.
- `README.md` with full Apify usage guide.
