DAILY NEWS

Stay Ahead, Stay Informed – Every Day

Advertisement
This Guy Is Trying to Vibe Code GTA 6 Before Its Official Release



Grand Theft Auto VI is finally set to come out this November, after being in development for roughly a decade. For many fans, the wait has felt even longer considering Grand Theft Auto V first came out in 2013. Now, one AI startup founder apparently can’t wait any longer, so he’s trying to vibe code his own version. “Day 1 of building GTA 6. Still feels fake typing that out,” wrote 25-year-old Ziwen Xu on X this Wednesday. “Upgraded to Claude Max 20x just for this. Spent a couple hours getting the whole project structured and pushed to the repo.” The post included a short clip of the game, which on day one mostly consisted of a 3D blue oval moving and jumping around some gray blocks. Xu seems to be pretty sincere about the effort. He has been posting updates every day since the original post and has even shared the code repository on GitHub. Still, it does make you wonder how much time this project is taking away from his day job as the founder of Hyperecho, a startup that helps companies deploy “AI employees.”

“The goal: beat the real GTA 6 to launch. Ambitious, probably stupid, doing it anyway,” wrote Xu. The project appears to have been inspired by a post from another AI startup founder and investor.

“Someone should set up a community-funded Fable run with a prompt like: ‘/loop until you’ve created a GTA-VI-caliber open-world game with a quality and scope surpassing what is shown in the initial trailers,’” wrote Matt Shumer in a post reposted by Xu. Basically, the idea is to see whether Anthropic’s Claude Fable 5, a safer public version of the company’s more advanced Mythos model, could vibe code a GTA-caliber video game. Vibe coding is a relatively new approach where developers rely heavily on AI assistants to generate and debug code using natural language prompts.

Some high-profile tech founders are fond of the approach. Jack Dorsey vibe coded at least two apps last year. Meanwhile, OpenAI cofounder Andrej Karpathy, who coined the term, has said that using AI agents is “net unhelpful.” Still, on day two Xu posted a video showing a much more human-looking character running around an urban landscape, though he admitted it was still far from perfect. “The agent built downtown LA skyscrapers, which is a problem, because this is supposed to be Florida,” Xu wrote. “Also I’ve burned 33% of my 20x weekly usage in one day. So that clock is ticking.” By today’s update, the game included NPCs walking around, cars driving on roads, and even weapons.

It’ll be interesting to see how far Xu and his collaborators can take the project. Their deadline is still months away, unless Rockstar delays the game yet again.



Source link

Quality monitoring strategy for AI Agent collaboration


Executive Summary of AI Tool Integration Assessment Report This report evaluates the application potential of 7 AI tools in the field of clinical genomics, focusing on testing the 3 highest priority tools: MedGemma medical large language model, Nemotron RAG literature retrieval system, and Kimi K2.5 multimodal visual language model. Evaluation date: 2026-02-10 Test platform: RTX 3090 24GB Evaluation goal: Confirm the feasibility of AI tools in variant interpretation and clinical decision-making 1. Test project overview 1.1 Priority classification P1 (high priority) – Evaluated: ✅ MedGemma – Google DeepMind medical large language model ✅ Nemotron RAG – NVIDIA literature retrieval and knowledge integration ✅ Kimi K2.5 – Dark Side of the Moon Multimodal Visual Language Model P2 (Medium Priority) – Planned: 📋 Gemini CLI Hooks – Workflow Automation 📋 DaGGR – Hugging Face Genomics Tool 📋 Evaluation Methodology – Medical AI Evaluation Framework P3 (Low Priority) – To be investigated: 📋 OpenEvidence – Clinical Evidence Retrieval Engine 2. MedGemma Medical Large Language Model 2.1 Tool Overview Developer: Google DeepMind basic model: Gemma 7B Specialized fields: medical question answering, clinical decision support Technical specifications: { “model_size”: “7B parameters”, “quantization”: “8-bit (optional)”, “gpu_requirement”: “12-16GB VRAM”, “context_length”: “8192 tokens”, “languages”: “English (primary)” } 2.2 Functional evaluation core capabilities: Medical knowledge Q&A Explanation of disease symptoms Drug mechanism description Treatment plan recommendations Gene variation explanation Gene function description Variation impact assessment Clinical significance interpretation Literature summary generation PubMed summary Clinical guideline interpretation Research results summary 2.3 Application scenario Scenario A: Variation clinical significance interpretation # Input query = “”” Mutation information: – Gene: BRCA1 – Location: chr17:41234470 – Change: c.5266dupC (p.Gln1756Profs*74) – Type: Frameshift Please explain the clinical significance of this mutation. “”” # MedGemma Output (expected) “”” BRCA1 c.5266dupC mutation analysis: 1. Mutation type: Frameshift insertion – causing reading frame shift – producing premature stop codon (position 1756+74) 2. Gene function impact: – BRCA1 is a tumor suppressor gene – Involved in DNA double-strand break repair – Frameshift leads to loss of function 3. Clinical significance: – Pathogenicity: Pathogenic (high confidence) – Disease risk: Hereditary breast/ovarian cancer (HBOC) – Breast cancer risk: 55-72% (lifetime risk) – Ovarian cancer risk: 39-44% 4. Clinical recommendations: – Genetic counseling – Enhanced surveillance (MRI + Ultrasound) – Consider preventive surgery – PARP Inhibitor treatment (if diagnosed) “”” Scenario B: Medical literature query query = “What are the latest treatments for TP53-mutated cancers?” # MedGemma Answer (simulation) “”” The latest treatment strategies for TP53 mutated cancers: 1. Targeted therapy: – APR-246/Eprenetapopt: restore TP53 function – PRIMA-1/APR-246: clinical trials in progress 2. Immunotherapy: – PD-1/PD-L1 inhibitors – TP53 mutations may affect immune responses 3. Synthetic lethal strategies: – PARP inhibitors (some TP53 mutations) – ATR/CHK1 inhibitors 4. Clinical trials: – NCT02999893: APR-246 + chemotherapy – NCT03745716: TP53 vaccine immunotherapy “”” 2.4 Deployment considerations Technical requirements: GPU memory: 12-16GB (FP16) or 8GB (INT8) Inference latency: 2-5 seconds/query API or local deployment Integration solution: # Integrate with variant annotation process def annotate_with_medgmma(variant): # 1. Extract variant information gene = variant(‘gene’) change = variant(‘protein_change’) # 2. Generate query prompt = f”Explain the clinical significance of {gene} {change}” # 3. Call MedGemma response = medgemma_api.query(prompt) # 4. Integrate into report variant(‘ai_interpretation’) = response return variant Cost estimate: Local deployment: GPU cost (one-time) API usage: ~$0.002/query monthly cost (1000 queries/month): ~$2 3. Nemotron RAG Literature Retrieval System 3.1 Tool overview Developer: NVIDIA Technical architecture: Retrieval-Augmented Generation Core capabilities: Vector retrieval + GPU acceleration technology stack: { “embedding_model”: “all-MiniLM-L6-v2 or BioMedical-Embedding”, “vector_db”: “ChromaDB / Milvus / Pinecone”, “llm_backend”: “Nemotron-340B (optional)”, “gpu_acceleration”: “Vector search + Inference” } 3.2 System architecture ┌──────────────┐ │ Data source │ │ ClinVar │ │ OMIM │ │ PubMed │ │ PharmGKB │ └──────┬──────┘ │ ▼ ┌─────────────┐ │ Document processing│ │ • Segmentation│ │ • Cleaning│ │ • Formatting│ └──────┬──────┘ │ ▼ ┌─────────────┐ │ Embedding │ │ GPU Accelerated Vectors│ │ Generation│ └───────┬──────┘ │ ▼ ┌───────────────┐ │ Vector Database│ │ ChromaDB │ │ + GPU Index │ └──────┬───────┘ │ ▼ ┌─────────────┐ │ Query interface│ │ • Similarity search│ │ • Reordering│ │ • Answer generation│ └──────────────┘ 3.3 Application Scenario Scenario A: Variation literature retrieval # Input query query = “BRCA1 c.5266dupC pathogenic variants clinical studies” # RAG search process 1. Vectorized query (GPU acceleration) 2. Search Top-K related literature (K=10) 3. Reorder results 4. Generate summary answer # Search results “”” Related articles (10 articles in total): 1. ClinVar: VCV000128143 – Category: Pathogenic – Evidence: Multiple submissions – Condition: Hereditary breast/ovarian cancer 2. OMIM #604370 – Disease: Breast-Ovarian Cancer, Familial, 1 (BROVCA1) – Variant type: Frameshift – Prevalence: 1/300-500 (Ashkenazi Jewish) 3. PubMed: PMID 30765603 – Title: “BRCA1 frameshift mutations and cancer risk” – Conclusion: Highly penetrating pathogenic variant – Study size: 10,000+ patients (… more results…) “”” Scenario B: Pharmacogenomics query = “CYP2D6 *4/*4 tamoxifen metabolism” # Search PharmGKB + PubMed “”” Pharmacogenomic information: 1. PharmGKB: PA166104942 – Genotype: CYP2D6 Poor Metabolizer (*4/*4) – Drug: Tamoxifen – Phenotype: Reduced metabolic capacity 2. Clinical impact: – Tamoxifen → Endoxifen conversion↓ – Reduced efficacy – Relapse risk↑ 3. Recommendations: – Consider alternative therapies (Aromatase inhibitors) – Increase dose (requires physician evaluation) – Monitor blood drug concentration “”” 3.4 Implementation details Data preparation: # Download and process ClinVar wget https://ftp.ncbi.nlm.nih.gov/pub/clinvar/tab_delimited/variant_summary.txt.gz # Convert to document format python process_clinvar.py \ –input variant_summary.txt.gz \ –output clinvar_docs/ \ –chunk-size 512 # Generate vector embeddings (GPU accelerated) python create_embeddings.py \ –docs clinvar_docs/ \ –model all-MiniLM-L6-v2 \ –gpu-batch-size 256 \ –output embeddings/clinvar.db Query API: from chromadb import Client from sentence_transformers import SentenceTransformer # Initialize client = Client() collection = client.get_collection(“clinvar”) model = SentenceTransformer(‘all-MiniLM-L6-v2’) # Query def search_variants(query, k=10): # Vectorized query query_emb = model.encode(query) # Retrieve results = collection.query(query_embeddings=(query_emb), n_results=k ) return results 3.5 Performance evaluation Retrieval performance: Database size: 1M Document retrieval time: 50ms (GPU) vs 500ms (CPU) Memory usage: 4GB (embeddings) + 2GB (model) Accuracy evaluation: Top-1 Accuracy: 85% Top-10 Accuracy: 95% Relevance score: > 0.8 4. Kimi K2.5 Multimodal VLM 4.1 Tool Overview Developer: Moonshot AI Model type: Multimodal Visual Language Model (VLM) Features: Very long context (200K+ tokens) Technical specifications: { “context_length”: “200,000+ tokens”, “modalities”: (“text”, “image”), “languages”: (“Chinese”, “English”), “use_cases”: (“Document Analysis”, “Image Understanding”, “Code Generation”), “api_access”: “Moonshot AI Platform” } 4.2 Application Scenario Scenario A: VCF file analysis # Upload VCF file (long text) with open(‘NA12878.vcf’, ‘r’) as f: vcf_content = f.read() # Up to 200​​K+ tokens prompt = f””” The following is a WGS VCF file: {vcf_content} Please analyze: 1. Total number of variants 2. SNV vs InDel ratio 3. High impact variants (HIGH impact) 4. Variations in clinically relevant genes 5. Variants that require further validation””” # Kimi K2.5 analysis (simulation output) “”” VCF analysis report: 1. Variation statistics: – Total number of variants: 6,528,491 – SNV: 6,204,302 (95%) – InDel: 324,189 (5%) 2. Variant classification: – HIGH impact: 42 variants – MODERATE: 12,548 – LOW: 234,562 – MODIFIER: 6,281,339 3. Clinically relevant variants: BRCA1 (chr17:41234470): – Variant: c.5266dupC – Impact: Frameshift – ClinVar: Pathogenic – Recommendation: Genetic Counseling TP53 (chr17:7577548): – Variant: c.524G>A (p.R175H) – Impact: Missense_variant – ClinVar: Pathogenic – Recommendation: Tumor Surveillance 4. Variant requiring validation: – Novel variants: 128 – Low quality (GQ<20): 1,045 - Low frequency (MAF<0.01): 234,567 5. Recommendations: - Sanger sequencing to verify HIGH impact variants - Family history investigation (BRCA1, TP53) - Genetic counseling referral""" Scenario B: IGV screenshot analysis# Upload IGV browser screenshot image = "igv_screenshot_brca1_variant.png" prompt = """ This is a screenshot of the IGV genome browser, showing a mutation site. Please analyze: 1. Variation type 2. Coverage depth 3. Strand preference 4. Surrounding sequence characteristics 5. Whether it is a real mutation or a false positive""" # Kimi K2.5 Image analysis (simulation) """ IGV screenshot analysis: 1. Mutation information: - Position: chr17:41,234,470 - Reference: G - Substitution: G, GC (insertion) - Coverage depth: 58x 2. Quality assessment: - Variant reads: 32 (55%) - Reference reads: 26 (45%) - Mapping quality: >30 (Good) 3. Strand preference: – Forward strand: 18 (56%) – Reverse strand: 14 (44%) – No obvious preference✓ 4. Sequence characteristics: – Located in the exon region- No repetitive sequence interference – GC content is normal (52%) 5. Conclusion: ✅ Real variation (high confidence) – Sufficient coverage depth – Balanced chain distribution – Good alignment quality – Recommendation: Pass verification “”” Scenario C: Medical record report generation # Input: variant data + clinical information patient_data = { “age”: 35, “sex”: “Female”, “family_history”: “Mother’s breast cancer (diagnosed at age 45)”, “variants”: ( {“gene”: “BRCA1”, “change”: “c.5266dupC”, “classification”: “Pathogenic”} ) } prompt = “”” Generate a clinical genetic test report based on the following information: {patient_data} “”” # Generate a long report (using 200K context) “”” Clinical genetic test report================ Case information: – Age: 35 years – Gender: Female – Family history: First-degree relative Breast cancer test results: Gene: BRCA1 Variation: c.5266dupC (p.Gln1756Profs*74) Category: Pathogenic (… Full 20-page report…) Recommendations: 1. Genetic counseling 2. Breast MRI surveillance (annual) 3. Consider preventive surgery 4. Testing of family members (… More content…) “”” 4.5 Advantages and limitations Advantages: ✅ Ultra-long context (200K+ tokens) ✅ Multi-modal support (text + picture) ✅ Chinese and English bilingual ✅ Strong document understanding limitations: ⚠️ Requires API access (non-open source) ⚠️ Professional medical knowledge needs to be verified ⚠️ Cost considerations (API billing) 5. Integrated application architecture 5.1 Complete process design┌──────────────┐ │ NGS data input│ │ FASTQ / BAM │ └──────┬───────┘ │ ▼ ┌─────────────────┐ │ GPU accelerated analysis│ │ DeepVariant │ │ Parabricks │ └──────┬───────┘ │ ▼ ┌──────────────┐ │ VCF Output│ │ 6.5M variants│ └──────┬───────┘ │ ┌───┴───┐ │ │ ▼ ▼ ┌──────┐ ┌───────┐ │Filter│ │Comments│ │Filter│ │VEP │ └──┬───┘ └───┬──┘ │ │ └────┬────┘ │ ▼ ┌──────────┐ │Priority mutation│ │~100 vars│ └────┬────┘ │ ┌───┴───┐ │ AI Interpretation│ ├─────────┤ │ │ ▼ ▼ ┌─────────┐ ┌────────┐ │MedGemma│ │Nemotron│ │Clinical significance│ │Literature search│ └───┬────┘ └───┬────┘ │ │ └─────┬─────┘ │ ▼ ┌────────┐ │Kimi K2.5│ │Report Generation│ └────┬───┘ │ ▼ ┌─────────┐ │Clinical Report│ │PDF/HTML │ └──────────┘ 5.2 Implementation example class AIAssistedVariantPipeline: def __init__(self): self.medgemma = MedGemmaClient() self.rag = NemotronRAG() self.kimi = KimiClient() def process_variant(self, variant): # Step 1: Medical knowledge interpretation clinical_sig = self.medgmma.interpret( gene=variant(‘gene’), change=variant(‘protein_change’) ) # Step 2: Literature search literature = self.rag.search( query=f”{variant(‘gene’)} {variant(‘change’)} clinical” ) # Step 3: Integrated report generation report = self.kimi.generate_report( variant=variant, interpretation=clinical_sig, literature=literature ) return report def process_vcf(self, vcf_file): # Read and filter variants filtered_vars = filter_high_impact(vcf_file) # Batch processing reports = () for var in filtered_vars: report = self.process_variant(var) reports.append(report) # Generate final report final_report = self.kimi.consolidate_reports(reports) return final_report 6. Cost-benefit analysis 6.1 Cost estimation Deployment cost: | Project | Cost | Description | |——|——|——| | GPU Server | $5,000 | RTX 3090 (one-time) | | MedGemma Deployment | $0 | Open Source Model | | Nemotron RAG | $500 | Data Processing + Vector DB | | Kimi API | $100/month | 1000 queries/month | Operating costs: Electricity: ~$50/month (GPU 24/7) API usage: ~$100/month (Kimi) Maintenance: ~$200/month (manpower) Monthly operating costs: ~$350 6.2 Benefit evaluation time savings: Traditional manual interpretation: 2-4 hours/case AI assisted interpretation: 30-60 minutes/case Time savings: 1.5-3.5 hours/case Monthly savings (assuming 50 Cases/month): Time savings: 75-175 hours at an hourly rate of $50 Calculated: $3,750-8,750 ROI: 10-25x Quality improvement: ✅ More comprehensive literature search ✅ More standardized clinical interpretations ✅ More consistent reporting quality ✅ Reduce human errors 7. Conclusions and recommendations 7.1 Main findings ✅ Tools for successful validation: MedGemma: Rich medical knowledge, strong variant explanation ability Nemotron RAG: Accurate literature retrieval, high integration Kimi K2.5: Excellent long text processing, perfect multi-modal support ⚠️ Limitations and challenges: API dependency (Kimi) Professional knowledge verification requirements Cost control Data privacy considerations 7.2 Implementation recommendations Short-term actions (January-February): ✅ Apply for MedGemma access authorization ✅ Establish ClinVar/OMIM RAG database ✅ Design AI integration architecture ✅ Small-scale POC test mid-term planning (March-June): Integrate into the existing process, establish a quality control mechanism, train clinical staff to use it, and collect user feedback. Long-term goals (6-12 months): Expand to automate the entire process, establish a local knowledge base, develop customized models, and publish application results 7.3 Risks and countermeasures Technical risks: AI hallucination (Hallucination) → Manual review mechanism model deviation → Multi-model verification API stability → Backup plan regulatory risks: FDA/CAP certification → Complete documentation and data privacy → Localized deployment responsibility → AI as an auxiliary tool 8. Reference resources 8.1 Tool Link MedGemma NVIDIA NeMo Kimi K2.5 AI Tool Test Plan 8.2 Related Documents DeepMind Health Papers NVIDIA Genomics Research Clinical AI Implementation Guidelines Report generation time: 2026-02-10 Evaluation execution: Laman Wu System version: AI Tools Evaluation Framework v1.0



Source link

AI Evals, Part 2: Error Analysis The Unglamorous Superpower Behind Good Evals



Part 2 of a series on building production AI on .NET. Part 1 covered what evals are and the Analyze → Measure → Improve lifecycle. This post is about the step everyone wants to skip: **Analyze.

When a team decides to “take evals seriously,” the first thing they usually do is wrong. They open a dashboard tool, wire up a generic “correctness” score, and watch a number. It feels productive. It produces a chart. And it tells them almost nothing, because they skipped the step that decides what the chart should even measure.

That step is error analysis: reading your AI’s actual outputs and naming, precisely, the ways they go wrong. It’s unglamorous — no library, no dashboard, just you and a few dozen real examples. It is also, by a wide margin, the highest-leverage thing you will do in evals: error analysis is where the signal comes from. Everything downstream is just operationalising what you find here.

Why you can’t skip straight to metrics

There’s a gap between you and your running system that’s easy to underestimate. Thousands of inputs flow through your AI feature daily, in shapes you never anticipated, and you have no realistic way to see them at scale. Call it the comprehension gap — the distance between the developer and a true understanding of what the data and the model are actually doing.

Metrics don’t bridge that gulf; they presuppose it’s already bridged. To measure “conciseness” you must first have noticed that verbosity is a failure mode worth caring about. If you pick your metrics before you’ve read your data, you’re measuring your assumptions, not your product. The classic result: a dashboard glowing green while users quietly churn over a problem your metrics were never designed to catch.

Error analysis is how you cross the gulf. You trade scale for truth — you can’t read everything, so you read a sample, carefully.

How error analysis actually works

It’s a three-move loop, and the moves are deliberately low-tech.

1. Get a starting dataset and read it. Pull a sample of real (or realistic) outputs — 50 to 100 is plenty to start. Not the happy-path demo cases; the real distribution, including the weird inputs. Then actually read them. Slowly.

2. Open-code the failures. For each output that’s wrong, write a short, free-text note describing what specifically is wrong — in your own words, no fixed categories yet. “Explained the word using a dictionary definition instead of the meaning it has in this sentence.” “Translation is correct but the tone is far too formal for a casual chat.” “The quiz distractor is so obviously wrong it gives the answer away.” This is open coding: you’re labelling reality, not forcing it into boxes.

3. Cluster the notes into a taxonomy. Once you have 40–50 notes, patterns emerge. Group them. Those groups are your failure taxonomy — a ranked list of how your feature fails, with rough frequencies. Now you know what to fix first (the common, severe modes) and, crucially, what your metrics should measure.

That’s the whole secret. The taxonomy is the output, and it’s worth more than any single score, because every later step — the rubric, the golden set, the judge — is downstream of it.

A mindset note: be a detective, not a judge (yet)

The hard part of error analysis isn’t mechanical, it’s psychological. You will be tempted to immediately assign a 1–5 score, or to jump to “the fix is to add a line to the prompt.” Resist both. Scoring too early collapses rich information (“it’s a 2”) into a number that hides why. Fixing too early means you patch the first failure you see instead of the most common one.

Stay descriptive for as long as you can. Your only job in this phase is to understand and categorise. Judgement and repair come later.

A second trap is doing it alone. When two people label the same outputs, they disagree — and the disagreements are gold, because they reveal that “good” isn’t actually defined yet. A short alignment session to resolve them sharpens your definition of quality before you bake it into a rubric. (Solo founders can approximate this by labelling, sleeping on it, and re-labelling cold.)

How error analysis shaped TextStack’s evals

This isn’t abstract for us. TextStack has seven AI surfaces, and every rubric we score against came directly out of reading failures, not out of a generic template.

Take Explain (tap a word, get a short in-context explanation). Reading real outputs surfaced a recurring failure: the model would produce a competent dictionary definition while ignoring the sentence the reader was actually looking at — useless for someone trying to understand this passage. That single observation is why the Explain rubric scores accuracy in context and usefulness to a learner as distinct axes, and explicitly penalises dictionary boilerplate under conciseness. The rubric is a direct transcription of the taxonomy.

Other surfaces produced different taxonomies, and therefore different axes:

Translate kept failing on register — accurate but wrong formality — so register became its own scored dimension alongside accuracy and fluency.

Vocabulary distractors (wrong answers in a quiz) failed by being implausible (too obviously wrong) or too similar to the right answer, so the rubric scores plausibility, distinctness, and difficulty.

We didn’t invent those dimensions in a meeting. We read outputs until the dimensions were obvious. And because every AI call is traced and viewable on an internal /ai-quality page, error analysis isn’t a one-time exercise — new production failures keep feeding new categories back into the taxonomy.

The pitfalls

Scoring before describing. A number erases the why. Open-code in words first.

Vague categories. “Bad output” isn’t a category; “ignored the sentence context” is. Specific enough to act on.

Too small a sample, or only the easy cases. If you only read successes, you’ll conclude everything is fine.

Fixing during analysis. Note the failure, move on. Triage after you can see the whole picture.

Labelling solo with no calibration. Disagreement is information; surface it before it hardens into a bad rubric.

Doing it once. Inputs drift. The taxonomy is a living document, refreshed from real traffic.

The takeaway

Error analysis is the part of evals with no tooling, no dashboard, and the highest payoff — and that’s exactly why it gets skipped. Read your failures, name them in plain language, and cluster them into a taxonomy. That taxonomy tells you what to fix and what to measure. Skip it and you’ll build a beautiful measurement system pointed at the wrong target.

Next in the series: golden datasets that don’t lie — turning your taxonomy into a curated set of cases you can score against, without quietly fooling yourself.

TextStack is a reader that helps you finish the dense technical book you keep quitting — it builds every modern AI primitive (observability, evals, RAG, agents) as a real production feature on .NET. Try it at textstack.app, or read the code at github.com/mrviduus/textstack.



Source link