This uses phaser, standard web tech, wasm (built from Go engine running on server).
Trying to build browser games that feel more like Steam games.
This uses phaser, standard web tech, wasm (built from Go engine running on server).
Trying to build browser games that feel more like Steam games.
The main idea is that tests should just be Python: plain `assert` statements instead of custom matchers, no fixture magic, and when tests fail you get readable diffs that actually show what went wrong. Tests can be simple functions or structured with steps that self-document in the output.
I would be very happy to receive any feedback!
- pytest already works with assert. Why brag about something that is already commonplace?
- It could help if your docs explained the alternative to using fixtures. I assume it would be done by re-using givens, but you could make it clearer what is the preferred way to do it, and what is gained, or lost, but doing it that way.
- Can you explain how your diff is better than the pytest diff? (I'm asking as someone who hates the pytest diff)
The Problem: News fatigue is real. Reading 50+ articles daily (from hundred of different sources) to stay informed is unsustainable, but traditional aggregators just dump links without context.
Wikli uses a three-stage pipeline:
Scraping & Processing (Cloudflare Workers): RSS feeds → content extraction → AI classification Semantic Clustering (Python): Claude groups related articles across sources into coherent stories Digest Generation: AI synthesizes clusters into readable reports with context and TLDR
Technical Highlights:
Cloudflare Workers + PostgreSQL for scraping infrastructure Hybrid content extraction (Readability + Puppeteer fallback for tricky sites) Claude Sonnet 4 for clustering and synthesis (outperformed embedding-based approaches) Theme-based filtering with relevance scoring (0-10 scale per article) Telegram bot with stateless approval workflow for editorial control
What's Different:
Semantic clustering beats chronological or source-based grouping Context from previous digests prevents repetition Human-in-the-loop via Telegram for quality control (can edit title/approve digest) Open architecture: separate Brief Generator (Python) and Scraper API (TypeScript)
Stack: TypeScript, Python, PostgreSQL, Drizzle ORM, Claude/Gemini APIs
The system handles rate limiting across domains, AI API throttling, and includes a DataManager abstraction for centralized data operations. Currently live in Italian at wikli.com - language-agnostic by design but focused on the Italian market for now. A the moment running with two topics (AI innovation and Inter Milano Football Club) via Telegram and wikli.com website.
Happy to get any feedback.
It’s a daily puzzle game that combines soccer and chess.
It prioritizes accessibility, longevity, performance, and simplicity.
With the autoloader, one script tag loads components dynamically without downloading the entire library. (npm also available.)
Theming uses color-mix() and OKLAB to create uniform color palettes from a single CSS property. Adaptive palettes are used for dark mode.
All form controls are form-associated via ElementInternals and work with native validation APIs (required, pattern, etc.).
Dialogs, popovers, tooltips, etc. use Popover API for top-layer access without having to portal or hoist.
Some of the more fun components include: Joystick, Stamp, Mesh Gradient, Flip Card, Random Content, Intersection Observer, Typewriter, Lorem Ipsum, Slide Activator
The library is free for personal, educational, non-profit use. Commercial use requires a license.
Supposedly, one people of the Sea Peoples were the Peleset, as the egyptians called them (https://en.wikipedia.org/wiki/Peleset), which are believed to be the same people as the Philistines, for which the Romans gave Palestine its name.
Is it capable to go from `[name] -> [my daughter as a concept] -> age` ?
These are excellent questions, and you're absolutely right that they should be clear from the landing page. I'll work on fixing that.
Short answers:
1. Good point about asserts. When writing the benefits, I was targeting a broader audience (unittest users, people coming from other languages like JS), but the reality is most visitors are probably "pytest escapers" who already know pytest uses assert. I'll reorganize the selling points to focus on what actually differentiates Vedro.
2. The main philosophy is "all you need is functions and their compositions", no special decorators or dependency injection magic. But this is indeed missing from the index page. Will definitely add clear examples showing how to handle common fixture use cases with plain functions.
3. One diff example on the landing page clearly isn't enough. I'll add more comparisons. Since you hate pytest's diff output too, I'd love to hear what specifically bothers you about it, your pain points would be incredibly valuable for improving how I present Vedro's approach.
I wrote a very simple function:
When I run it with normal Python, this is the exception: It's compact and simple to understand. It pinpoints the exact location of the error, and I easily scan the text to find the function call-stack.Now here's the pytest error:
It doesn't pinpoint the error, it adds code lines that might be irrelevant, and extra information I don't care about.I will say using `--tb=short` fixes most of it, at least in this example, and sometimes it's even preferable, because it's shorter. But it still doesn't pinpoint the error like normal Python exceptions do.