- ↔
- →
- How to make task list less depressing? - The Workplace Stack Exchange
- Our Values - Zed - The editor for what's next
- Shottr – Screenshot Annotation App For Mac
- crawshaw - 2025-06-08
- .dotfiles | Adib Hanna | Substack
- June 13, 2025
-
🔗 @cxiao@infosec.exchange Canadians in case you did not know, we have some No Kings protests tomorrow mastodon
Canadians in case you did not know, we have some No Kings protests tomorrow here too in solidarity
Vancouver BC, 11am, US Consulate
Toronto ON, 12pm, US Consulate, and Queen's Park
Ottawa ON, 2pm, US Embassy
London ON, 12pm, Victoria Park
Peterborough ON, 12pm, Confederation SquareLots of US border towns having them too. Check https://www.nokings.org for the full list
#NoKings #canada #vancouver #toronto #ottawa #londonont #peterborough
-
🔗 sst/opencode v0.1.31 release
- feat: claude 4 opus
- Nord theme (#64)
- Update README.md
-
🔗 News Minimalist Israel attacks Iran + 4 more stories rss
In the last 1 day ChatGPT read 26474 top news stories. After removing previously covered events, there are 5 articles with a significance score over 5.9.
[6.6] Israel launches air assault on Iran —reuters.com[$] (+1194)
Israel launched an air assault on Iran Friday, aimed at preventing them from obtaining nuclear weapons, according to Israeli Prime Minister Benjamin Netanyahu.
Netanyahu, who has long warned against Iran's nuclear program, authorized the strike after the International Atomic Energy Agency declared Iran in breach of non-proliferation obligations. He evoked the Nazi Holocaust, saying Israel learned the lessons of history.
The strikes reportedly disabled Iranian air defense systems near a key nuclear site. This action comes as Netanyahu faces domestic challenges and amid stalled US-Iran nuclear talks.
[6.0] World-first blood cancer therapy to be given on NHS —bbc.com(+5)
A groundbreaking "Trojan horse" cancer therapy, which delivers toxic drugs directly into cancer cells, will be available on the NHS in England, offering significantly extended remission for blood cancer patients. This marks a world first.
The new treatment targets myeloma, a blood cancer, and has shown to halt the disease for three years, nearly tripling the duration compared to existing therapies.
The NHS decision follows positive clinical trials and a cost-effectiveness review. The therapy is expected to benefit around 1,500 patients annually.
Highly covered news with significance over 5.5
[5.5] Trump stops California's gasoline car sales ban — tagesschau.de (German) (+30)
[5.5] Putin orders Russia to quickly develop drone forces — reuters.com [$] (+7)
[5.5] AI tool helps couple conceive after 18 years — today.com (+2)
Thanks for reading!
— Vadim
You can create a personal RSS feed with premium.
-
🔗 sst/opencode v0.1.30 release
No content.
-
🔗 sst/opencode v0.1.29 release
wip: refactoring tui
-
🔗 upstash/context7 v1.0.14 release
What's Changed
- docs: Adds instructions for Zencoder.ai by @viborc in #271
- docs: add installation instructions for Amazon Q Developer CLI by @ryof in #273
- Feat/replace env vars with cli args by @enesgules in #278
- docs: add installation instructions for Visual Studio 2022 by @jongalloway in #287
- fix: InitializeResult schema mismatch in Context7 server response by @nielthiart in #283
New Contributors
- @viborc made their first contribution in #271
- @ryof made their first contribution in #273
- @jongalloway made their first contribution in #287
- @nielthiart made their first contribution in #283
Full Changelog :
v1.0.13...v1.0.14
-
🔗 sst/opencode v0.1.28 release
load API keys
-
🔗 sst/opencode v0.1.27 release
bedrock loader
-
🔗 google/adk-python v1.3.0 release
1.3.0
(2025-06-11)
Features
- Add memory_service option to CLI (416dc6f)
- Add support for display_name and description when deploying to agent engine (aaf1f9b)
- Dev UI: Trace View
- New trace tab which contains all traces grouped by user messages
- Click each row will open corresponding event details
- Hover each row will highlight the corresponding message in dialog
- Dev UI: Evaluation
- Tool enhancements:
Bug Fixes
- Agent Engine deployment:
- Fix broken agent graphs (3b1f2ae)
- Forward
__annotations__
to the fake func for FunctionTool inspection (9abb841) - Handle the case when agent loading error doesn't have msg attribute in agent loader (c224626)
- Prevent agent_graph.py throwing when workflow agent is root agent (4b1c218)
- Remove display_name for non-Vertex file uploads (cf5d701)
Documentation
-
- June 12, 2025
-
🔗 astral-sh/uv 0.7.13 release
Release Notes
Python
- Add Python 3.14.0b2
- Add Python 3.13.5
- Fix stability of
uuid.getnode
on 3.13
See the
python-build-standalone
release notes for more details.Enhancements
- Download versions in
uv python pin
if not found (#13946) - Use TTY detection to determine if SIGINT forwarding is enabled (#13925)
- Avoid fetching an exact, cached Git commit, even if it isn't locked (#13748)
- Add
zstd
anddeflate
toAccept-Encoding
(#13982) - Build binaries for riscv64 (#12688)
Bug fixes
- Check if relative URL is valid directory before treating as index (#13917)
- Ignore Python discovery errors during
uv python pin
(#13944) - Do not allow
uv add --group ... --script
(#13997)
Preview changes
- Build backend: Support namespace packages (#13833)
Documentation
- Add 3.14 to the supported platform reference (#13990)
- Add an
llms.txt
to uv (#13929) - Add supported macOS version to the platform reference (#13993)
- Update platform support reference to include Python implementation list (#13991)
- Update pytorch.md (#13899)
- Update the CLI help and reference to include references to the Python bin directory (#13978)
Install uv 0.7.13
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.7.13/uv-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/uv/releases/download/0.7.13/uv-installer.ps1 | iex"
Download uv 0.7.13
File | Platform | Checksum
---|---|---
uv-aarch64-apple-darwin.tar.gz | Apple Silicon macOS | checksum
uv-x86_64-apple-darwin.tar.gz | Intel macOS | checksum
uv-aarch64-pc-windows-msvc.zip | ARM64 Windows | checksum
uv-i686-pc-windows-msvc.zip | x86 Windows | checksum
uv-x86_64-pc-windows-msvc.zip | x64 Windows | checksum
uv-aarch64-unknown-linux-gnu.tar.gz | ARM64 Linux | checksum
uv-i686-unknown-linux-gnu.tar.gz | x86 Linux | checksum
uv-powerpc64-unknown-linux-gnu.tar.gz | PPC64 Linux | checksum
uv-powerpc64le-unknown-linux-gnu.tar.gz | PPC64LE Linux | checksum
uv-riscv64gc-unknown-linux-gnu.tar.gz | RISCV Linux | checksum
uv-s390x-unknown-linux-gnu.tar.gz | S390x Linux | checksum
uv-x86_64-unknown-linux-gnu.tar.gz | x64 Linux | checksum
uv-armv7-unknown-linux-gnueabihf.tar.gz | ARMv7 Linux | checksum
uv-aarch64-unknown-linux-musl.tar.gz | ARM64 MUSL Linux | checksum
uv-i686-unknown-linux-musl.tar.gz | x86 MUSL Linux | checksum
uv-x86_64-unknown-linux-musl.tar.gz | x64 MUSL Linux | checksum
uv-arm-unknown-linux-musleabihf.tar.gz | ARMv6 MUSL Linux (Hardfloat) | checksum
uv-armv7-unknown-linux-musleabihf.tar.gz | ARMv7 MUSL Linux | checksum -
🔗 sst/opencode v0.1.26 release
Update error message to say opencode instead of sst (#81)
-
🔗 sst/opencode v0.1.25 release
ci
-
🔗 sst/opencode v0.1.24 release
ci
-
🔗 sst/opencode v0.1.23 release
ci
-
🔗 sst/opencode v0.1.22 release
sync
-
🔗 The Pragmatic Engineer Builder.ai did not “fake AI with 700 engineers” rss
Originally published in The Pragmatic Engineer Newsletter.
An eye-catching detail widely reported by media and on social media about the bankrupt business Builder.ai last week, was that the company faked AI with 700 engineers in India:
- "Microsoft-backed AI startup chatbots revealed to be human employees" - Mashable
- "Builder.ai used 700 engineers in India for coding work it marketed as AI-powered" - MSN
- "Builder.ai faked AI with 700 engineers, now faces bankruptcy and probe" - India's Business Standard
In the past week, I 've been talking with several engineers who worked at Builder.ai, and can confirm that this detail was untrue. But let's hold that thought for a second, and do a thought experiment about how we could make this headline be true! Something like it has been attempted before…
Design challenge: a system with 700 devs pretending to be an AI
Okay, we've put on our "evil hacker" villain mask and put ethical considerations in the bin: our goal is to build a system where 700 engineers pretend to be a working AI system, all without using any artificial intelligence. Also, it's the year 2024 in this experiment. So, how would we pull it off?
The naive approach: have the devs write code and assume there will never be more than 700 parallel sessions in play:
First attempt at a system where 700 devs can pretend to be an AI
There is one immediate, major problem: latency. No user will believe it's a working AI if it takes 10-30 minutes to provide a response. In that scenario, the deception is likely to be quickly exposed. What's needed is faster response times, so customers could be fooled into believing they're interacting with a machine. Basically, what's called for is something akin to the Mechanical Turk:
"The Mechanical Turk, also known as the Automaton Chess Player, or simply The Turk, was a fraudulent chess-playing machine constructed in 1770, which appeared to be able to play a strong game of chess against a human opponent. For 84 years, it was exhibited on tours by various owners as an automaton.
The machine survived and continued giving occasional exhibitions until 1854, when a fire swept through the museum where it was kept, destroying the machine. Afterwards, articles were published by a son of the machine's owner revealing its secrets to the public: that it was an elaborate hoax, suspected by some, but never proven in public while it still existed."
The Automaton Chess Player concealed a person inside the machine, which went unnoticed for more than 80 years:
The Automaton Chess Machine in action
Back to the current problem, and applying the inspiration of the 18th century chess machine containing a concealed human. To improve latency - and decrease users' suspicion - we could perhaps stream what the "assigned developer" typed:
Reducing latency of the system by streaming typing
This is better, but it remains a giveaway that the system is slow to complete basic tasks. So what about incentivizing our developers with a bonus for completing tasks under 3 minutes, and allowing them to use any tool they want? Incentives are powerful, so it's likely the following would be observed:
Devs complete tasks much faster when they can use their tools!
We did it! We managed to fake a good enough AI.
But wait… how exactly did the devs complete their tasks within the arbitrary time frame of 3 minutes? To find out, questions are asked, and this what we see (remember, it's 2024):
How the "700 devs pretending to be AI" would actually work in 2024
Wait… what?! "Devs pretending to be an AI would use an AI to deliver the outputs in time? This is a logical approach for 2024, when LLMs were already more than capable of generating high-quality code. And this is why it would be irrational to hire 700 developers to pretend to be AI last year, when there were already LLMs that did this much better.
If you hired a competent engineer in 2024 to design a system that takes a prompt and pretends to be an AI, and they could use any tool they liked, and there were 700 devs for the project, what they built would look something like this:
How to pretend to be an AI in 2024… just use an LLM!
Spoiler: Builder.ai did exactly this as well!
Natasha's tech stack
Builder.ai first showcased the idea of Natasha in 2021, well before ChatGPT was announced. Back then, Natasha was positioned as a "personal app builder," and it was clear that the solution worked with a "network of geeks" who built apps to spec:
" You tell us your idea, and me [Natasha] and my network of geeks build it, using building blocks that really work." Source: Builder.ai in 2021
The product promised a cost estimate up front, and a schedule. The idea was that by taking on thousands of projects, the team behind Natasha could create reusable building blocks that speed up building websites and mobile apps.
In December 2023, one year after ChatGPT was released, Builder.ai announced Natasha CodeGen as "your always-on software development partner". In April 2024, the company demoed Natasha CodeGen in a series of videos, which show code generation happening, as well. In the video, there's a cut, and the video returns when the React code is generated. I've confirmed with former engineers at the company that behind the scenes, the system ran for a few minutes before finishing code generation:
Natasha 's log output in April 2024. Source: Builder.ai
Natasha was aimed to be an AI tool for the whole software development cycle:
- Idea : refine an idea with a visual UI of what the app's UI could look like
- Planning : create user stories (tasks) inside a dedicated UI. Tasks include creating acceptance criteria.
- Code generation planning : feed the task into an LLM to plan steps for code generation
- Testing : have the AI add tests first, following a test driven development (TDD) approach, and create a PR only if the tests pass
- Generate code: create the code, and run them against the tests
- Create a PR : only do this if all the tests pass
A team of 15 engineers worked on Natasha Codegen. Most engineers were based in the UK, with around 3 in India. At its peak, Builder.ai's AI team was circa 30 people. On top of building Natasha, the team was building and maintaining many AI products and services. One ex-engineer there told me they thought a lack of focus contributed to the company's demise.
The tech stack behind Natasha:
- Python : for the orchestrator that lines up steps that the agents took
- Ruby on Rails : for parts of the backend and frontend
- React : for a good part of the frontend
- GPT and Claude for LLMs integrated for the code generation step
The web components for Natasha were built using Ruby on Rails. Source:Builder.ai
The team built a set of coding benchmarks that they ran whenever a new model came out, and chose the model that worked best for their use cases.
Natasha had a grander vision than to just be a code generator tool: it was the codename for all AI projects inside Builder.ai, like Microsoft using "Copilot" for all its AI projects, not only GitHub Copilot. Other products using the Natasha brandname:
- A chatbot that customers and developers at Builder.ai could talk to about their codebase, or instruct to implement certain features
- A knowledge graph : a vector database storing relationships between features, the blocks that implement them and customer use cases
- ML models: to predict how long it would likely take to implement a specification requested by a customer
What about the 700 developers?
Builder.ai had a working code generator platform built by around 15 engineers, so why did it need to hire hundreds more more in India? For one thing, Builder hired 300 internal engineers and kicked off building internal tools, all of which could have simply been purchased, including:
- Builder Home (dashboard for customers)
- Builder Meet (similar to Zoom)
- Builder Tracker (similar to JIRA)
- Builder Whiteboard (inspired based on Figma: designers would import Figma designs to Whiteboard, and then use these designs to create clickable wireframes and prototypes. Later, Whiteboard exported React code and components to the working folder of customer projects.)
- Builder Chat (similar to Slack)
- SenseiBot (review and merge PRs and deploy apps to Test/Staging/Prod environments)
One reason Builder.ai failed to grow revenue as quickly as investors were told it was doing, was likely due to this lack of focus and rebuilding tools that already existed without building anything novel.
Builder.ai also sold an "external development network", on top of Natasha. There were around 500-1,000 engineers employed through outsourcing companies like Globant, TatvaSoft, and others. These devs were based in places like Vietnam, Romania, Ukraine, Poland, and other countries, as well as India. Last year, the company was working on more than 500 client apps. This number of outsourced devs is likely to be the origin of the "700 developers in India" claim that went viral.
Former engineers at Builder.ai told me there was internal conflict about what was the main product: was it the Natasha ecosystem, including the code generator, or the bespoke software development service that Builder.ai offered to customers?
The company built Builder IDE with a team of internal 20 devs and Natasha to help the hundreds of outsourced developers build apps for customers. Builder IDE included facial recognition to verify that the developer matched the profile in the system. It also had a fraud detection system that monitored usage. That system flagged cases where contractors billed for 8 hours, but had been active in the IDE for less.
Fraud around developer hours worked vs recorded was rampant for two years, according to Yash Mittal, former associate product director at Builder.ai. He wrote:
"The primary bottleneck [of scaling the business] was with our external developer network. Another pioneering effort by Builder.ai involved onboarding developers globally to customize solutions on our platform using our IDEs. However, we didn't anticipate the significant fraud that would ensue, leading to a prolonged and resource-intensive 'cat and mouse' game lasting nearly two years before we finally got it under control."
Downfall
Builder.ai went bust after the emergence of allegations of accounting fraud. The Financial Times reported that lenders to the company seized remaining funds once a financial audit revealed the company had apparently misled investors about revenue:
"Builder.ai submitted provisional accounts to its auditor showing large reductions to prior revenue estimates, according to people familiar with the matter.
These figures showed that a prior $220mn estimate for 2024 revenues had been revised to around $55mn, while a previously reported 2023 total sales figure of $180mn would be restated to roughly $45mn, the people added."
Lenders withdrawing their capital blew a hole in the accounts, and the fraud allegations ensured no new investors wanted to sink money into the business. The company's fate was sealed.
I 've spoken with engineers who worked at Builder.ai, and they feel disappointed and a bit bitter about the experience. I talked with three engineers who were incredibly disappointed at the company's collapse, and said they didn't spot any warning signs. After all, Builder.ai raised money from Microsoft in April 2024 - which itself showed a strong vote of confidence. One dev told me he trusted Builder.AI's leadership because former CEO Sachin Dev Duggal won Ernst and Young's "World Entrepreneur of the Year" award as recently as last year.
A journey: entrepreneur of the Year in 2024, accused of misleading investors in 2025. Source:Ernst and Young
These engineers did solid work, created an AI system that felt like it was on par in capability terms with the likes of Devin and Factory. Unfortunately, the viral claim that Builder.ai used human devs to pretend to be an AI, has them fearing an impact upon their career prospects.
_This is why I want to share the truth about Builder.ai 's tech stack: that there was no conspiracy to deceive users into interacting with 700 devs in the mistaken belief they were working with a cutting-edge AI. The devs did solid work, and the company's demise was totally unrelated to their efforts. _
Also, I find it hard to believe that devs joining the then-high flying AI company could have had knowledge of machinations taking place at the executive management level of the business.
So, where did the viral claim about 700 devs pretending to be AI, originate. The Financial Times tracked it down to this post from an account on X:
This post from a self-proclaimed crypto enthusiast with no reporting history turned out to be false
The fake claim in this post caught people's attention, including finance newsletter writer Linas Beliūnas, who shared it with his more than 500,000 LinkedIn followers, and many publications quoted that post:
Shocking claims travel fast, even when untrue. Source: Linas Beli ūnas on LinkedIn
This is a good reminder of the importance of checking sources, and to be extra sceptical about social media posts. This also applies to me because last week this publication was among those which reported the claim. This is why I consider it important to recognise the error, and to go get the full story by talking with people who worked at Builder.ai.
If your team is looking to hire engineers with experience building real AI systems, the Builder.ai alumni group is likely a great source of such hires. It's sad to see a startup implode in the AI space over fraud allegations, and good luck to engineers who worked at Builder.ai in finding their next role!
This was one of four sections from The Pulse #137. The full edition additionally covers:
- Industry pulse. A big push to repeal Section 174, Meta throws money at fixing its AI problems, Google might be preparing for job cuts, ChatGPT could be eating Google Search market share, and Arc launches "AI-browser", Dia.
- Stock vesting changes at NVIDIA and Anthropic. Stock grants at NVIDIA are becoming front-loaded, while Anthropic has gone from options to double-trigger RSUs.
- A reminder of vibe coding 's security risks. Readers of this publication proved vibe-coded apps are a security nightmare, by bypassing the upvoting fingerprinting on a simple "vibe coded" app which I instructed an AI to make secure.
-
🔗 News Minimalist U.S. and China reach new trade agreement + 7 more stories rss
In the last 2 days ChatGPT read 58785 top news stories. After removing previously covered events, there are 8 articles with a significance score over 5.9.
[6.0] U.S. and China reach trade agreement —wcvb.com(+218)
The U.S. and China reached a trade agreement Wednesday that includes a 55% U.S. tax on Chinese imports.
The deal, announced by President Trump, still needs final approval. It also entails a 10% Chinese tax on U.S. goods, exchange of magnets and minerals, and continued U.S. study for Chinese students.
[5.6] High Seas Treaty gains momentum as 18 new countries pledge support —wcvb.com(+22)
The High Seas Treaty gained significant momentum Monday as 18 more countries ratified it, bringing the total to 49 and nearing the threshold for enforcement.
The treaty, formally known as the Agreement on Biodiversity Beyond National Jurisdiction, requires 60 ratifications to enter into force and establish marine protected areas in international waters.
This treaty aims to protect marine biodiversity in areas beyond national jurisdiction, addressing threats like overfishing and deep-sea mining.
[5.5] U.S. Environmental Protection Agency proposes rollback on rules limiting emissions from fossil fuel power plants —cbsnews.com(+18)
The EPA proposed rolling back Biden-era emissions rules for fossil fuel power plants, targeting carbon dioxide and toxic air pollutants. The Trump administration claims this will protect the economy.
EPA Administrator Zeldin stated the previous rules "suffocated" the economy. The rollback includes repealing limits on carbon dioxide emissions and loosening restrictions on mercury and other toxins. The EPA estimates the changes will save the power sector $1.2 billion annually.
Critics argue the rollbacks endanger public health and the environment, citing potential increases in premature deaths and asthma incidents. Lawsuits from environmental groups are anticipated, challenging the EPA's legal justification.
Highly covered news with significance over 5.5
[6.0] Israel considers attacking Iran without U.S. support — news.sky.com (+133)
[5.7] Meta to announce $15bn investment in bid to achieve computerised superintelligence — theguardian.com (+23)
[5.5] Worldwide displacement nears 122 million, UN agency reports — abcnews.go.com (+17)
[5.7] Islam grows fastest globally due to population increases — npr.org (+5)
[5.7] Solar Orbiter reveals first images of sun's south pole — theguardian.com (+23)
Thanks for reading!
— Vadim
You can create your own personalized newsletter like this with premium.
-
🔗 organicmaps/organicmaps 2025.06.12-3-android release
• New OSM data as of June 8
• Save planned routes as tracks
• Display plant nurseries, traffic barriers, studios, firepits, ladders, cranes, and love hotels
• Qingdao metro icons
• Show azimuth when tapping on a small arrow with distance
• Fixed crashes and white-on-white text on Android 5&6
• Fixed search for Lithuanian and other languages
• Fix location arrow jumps when navigation is active
• Fixed Cancel Download button
• Improved translations from Weblate…more at omaps.org/news
See a detailed announce on our website when app updates are published in all stores.
You can get automatic app updates from GitHub using Obtainium.sha256sum:
d50462ca3f4a9eb727f97c41f86acc3e8bb153b4f5d7fe19a38f4960d95e4a55 OrganicMaps-25061203-web-release.apk
-
🔗 Console.dev newsletter Somo rss
Description: Socket & port monitoring on Linux.
What we like: Alternative to Netstat with human-friendly output. Uses a table view with filtering options (protocol, ports, IP, program, PID, etc). Launches with common settings from Netstat by default. Built-in kill option based on an interactive ID selector. Available as a single binary (Rust).
What we dislike: Linux only.
-
🔗 Console.dev newsletter edamagit rss
Description: Git manager for VS Code.
What we like: Adds power features to managing Git through VS Code, inspired by Magit. Makes it more efficient to manage branches, stage changes, and create commits. Integrates with VS Code command palette, but is designed for fast keyboard actions. Can also interact with GitHub issues and PRs. Supports vim bindings.
What we dislike: Not fully functional compared to Magit - missing advanced options for diffs, bisect, patch.
-
- June 11, 2025
-
🔗 idursun/jjui v0.8.9 release
What's Changed
- docs: add Homebrew as an installation method by @lvignoli in #84
- Update instruction on installation for archlinux-based linux distros by @TeddyHuang-00 in #85
- feat: support
~/.config
and$XDG_CONFIG_HOME
on macOS by @PrayagS in #86 - Automatically add
--allow-new
argument to new local bookmarks by @idursun in #88 - fix(revisions): set selected item on refresh by @idursun in #103
- fix: snapshot working copy less often by @Jollywatt in #96
- fix: highlight background colour seq calculation by @idursun in #106
- fix: add
--remote
argument to bookmarks with multiple remotes by @idursun in #107 - perf: make the preview pane more responsive when switching commit by @glehmann in #108
- Add compilation instructions and add
/jjui
to.gitignore
by @ilyagr in #112 - Abandon command passes
--retain-bookmarks
by default - New key binding:
@
jumps to working copy revision #111 - New key binding:
J
jump to parent of the currently selected revision - New key binding:
ctrl+z
suspendsjjui
and returns to terminal. Typingfg
should resume it. jjui
won't start and print an error message if the configuration file is malformed #114- When typing a bookmark name, spaces will be automatically replaced with
-
and the input box will expand if it exceeds the initial size. - Git: git push commands will be repeated per remote and
--remote
argument is always displayed.
New Contributors
- @TeddyHuang-00 made their first contribution in #85
- @PrayagS made their first contribution in #86
- @Jollywatt made their first contribution in #96
- @glehmann made their first contribution in #108
- @ilyagr made their first contribution in #112
Full Changelog :
v0.8.8...v0.8.9
-
🔗 idursun/jjui v0.8.10 release
What's Changed
- docs: add Homebrew as an installation method by @lvignoli in #84
- Update instruction on installation for archlinux-based linux distros by @TeddyHuang-00 in #85
- feat: support
~/.config
and$XDG_CONFIG_HOME
on macOS by @PrayagS in #86 - Automatically add
--allow-new
argument to new local bookmarks by @idursun in #88 - fix(revisions): set selected item on refresh by @idursun in #103
- fix: snapshot working copy less often by @Jollywatt in #96
- fix: highlight background colour seq calculation by @idursun in #106
- fix: add
--remote
argument to bookmarks with multiple remotes by @idursun in #107 - perf: make the preview pane more responsive when switching commit by @glehmann in #108
- Add compilation instructions and add
/jjui
to.gitignore
by @ilyagr in #112 - Abandon command passes
--retain-bookmarks
by default - New key binding:
@
jumps to working copy revision #111 - New key binding:
J
jump to parent of the currently selected revision - New key binding:
ctrl+z
suspendsjjui
and returns to terminal. Typingfg
should resume it. jjui
won't start and print an error message if the configuration file is malformed #114- When typing a bookmark name, spaces will be automatically replaced with
-
and the input box will expand if it exceeds the initial size. - Git: git push commands will be repeated per remote and
--remote
argument is always displayed.
New Contributors
- @TeddyHuang-00 made their first contribution in #85
- @PrayagS made their first contribution in #86
- @Jollywatt made their first contribution in #96
- @glehmann made their first contribution in #108
- @ilyagr made their first contribution in #112
Full Changelog :
v0.8.8...v0.8.10
-
- June 10, 2025
-
🔗 dagger/container-use v0.0.0 release
container-use v0.0.0
Download the pre-compiled binaries from the assets below.
Changelog
01c115a
: Addhash -r
(Tibor Vass tiborvass@users.noreply.github.com)c9d1833
: Add a delete command. (Brendan Burns 5751682+brendandburns@users.noreply.github.com)2a7e5a3
: Add initial environment delete. (Brendan Burns 5751682+brendandburns@users.noreply.github.com)2ae1b99
: Add kilo code MCP instructions to README (Murthy Udupa ugmurthy@gmail.com)4b805d5
: Add kilo code MCP instructions to README (Murthy Udupa ugmurthy@gmail.com)5c0291f
: Add kilo code MCP instructions to README (Murthy Udupa ugmurthy@gmail.com)e2aad69
: Adjust logo size and update to container-use.png - Switch from logo.png to container-use.png - Add max-width:300px style constraint for better sizing - Update alt text to be more descriptive (Greg Kogan greg.ny@gmail.com)8e72845
: Create install-for-dummies branch (Greg Kogan greg.ny@gmail.com)31ecfda
: Disable global issue templates (Gerhard Lazu gerhard@dagger.io)8046839
: Environment readme (#46) (Connor Braa 3478454+cwlbraa@users.noreply.github.com)d002416
: Environments (Andrea Luzzardi andrea@luzzardi.com)181065b
: Expose the parameters for cross-compilation in the Makefile and update the README accordingly. (Brendan Burns 5751682+brendandburns@users.noreply.github.com)e4d0ae4
: Fix delete implementation. (Brendan Burns 5751682+brendandburns@users.noreply.github.com)399f0cb
: Fix install target by silencing make find-path output (Julián Cruciani julian@dagger.io)a03913e
: Improve error handling when the directory isn't a git repo. (Brendan Burns 5751682+brendandburns@users.noreply.github.com)632fd34
: Improve the VS Code + Copilot instructions a little. (Brendan Burns 5751682+brendandburns@users.noreply.github.com)6dfdea8
: Merge remote-tracking branch 'upstream/main' (Jason McCallister jason@mccallister.dev)d8eb32f
: Nicer logo, made by a human (Laurel Duermael) (Test User test@example.com)e80a4f7
: README badges (Andrea Luzzardi andrea@luzzardi.com)883acae
: README formatting (Andrea Luzzardi andrea@luzzardi.com)7665cae
: README update (Andrea Luzzardi andrea@luzzardi.com)e9180eb
: README: Update install instructions (Tibor Vass teabee89@gmail.com)5f825d0
: README: add Claude Code instructions (Andrea Luzzardi andrea@luzzardi.com)ea08659
: README: add screencast (Andrea Luzzardi andrea@luzzardi.com)b88dc26
: README: example on how to run examples using claude. formatting fixes (Andrea Luzzardi andrea@luzzardi.com)1dc6ca9
: README: install directly without first building (Tibor Vass teabee89@gmail.com)0d99ea6
: README: update (Andrea Luzzardi andrea@luzzardi.com)4c86135
: README: update screencast using claude (Andrea Luzzardi andrea@luzzardi.com)9cc23dd
: README: use gif for the screencast (Andrea Luzzardi andrea@luzzardi.com)133fbde
: Revert "cmd/list: keep the container-use prefix" (Tibor Vass teabee89@gmail.com)dd5ac4b
: Revert "cmd/list: remove spaces at beginning" (Tibor Vass teabee89@gmail.com)74f0f95
: Revert "fork tool, use unclear rn" (Connor Braa connor@dagger.io)4756719
: Simplified README and installation steps (Andrea Luzzardi andrea@luzzardi.com)aa50990
: Update .gitignore (Tibor Vass teabee89@gmail.com)2799b83
: Update README with additional corrections for kilo code MCP (Murthy Udupa ugmurthy@gmail.com)fa46743
: Update README.md (Yuki Matsukura matsubo@users.noreply.github.com)5e0fee6
: Update README.md (Yuki Matsukura matsubo@users.noreply.github.com)496b958
: Update README.md (Greg Kogan greg.ny@gmail.com)7020f9d
: Update README.md (Greg Kogan greg.ny@gmail.com)e7daa44
: Update README.md (Greg Kogan greg.ny@gmail.com)58588ed
: Update README.md (Greg Kogan greg.ny@gmail.com)3084c06
: Update README.md with touchups (Greg Kogan greg.ny@gmail.com)92dbfb8
: Update container-use.png asset (Greg Kogan greg.ny@gmail.com)3de8186
: add (broken) examples (Andrea Luzzardi andrea@luzzardi.com)d4619c3
: add LICENSE file (Andrea Luzzardi andrea@luzzardi.com)8ad5a2c
: add README.md (Connor Braa connor@dagger.io)efe7e30
: add a quick install with checks for go and docker (Jason McCallister jason@mccallister.dev)262639f
: add multibuild example (Connor Braa connor@dagger.io)83a3c38
: add support for revisions, history, revert (Andrea Luzzardi andrea@luzzardi.com)2e2489e
: check if the watch command is installed (Jason McCallister jason@mccallister.dev)dd42a32
: checkpoint: use content addressable references (Andrea Luzzardi andrea@luzzardi.com)4b03757
: clean up agent.md git instructions (Connor Braa connor@dagger.io)0a54cc3
: cmd/container-use -> cu (Andrea Luzzardi andrea@luzzardi.com)c4bf0e7
: cmd/cu: improve signal handling to recover from raw term (Tibor Vass teabee89@gmail.com)1e806aa
: cmd/list: keep the container-use prefix (Tibor Vass teabee89@gmail.com)d6fa55f
: cmd/list: remove spaces at beginning (Tibor Vass teabee89@gmail.com)a9fdfb5
: cmd: Add "merge" to git merge an environment (Tibor Vass teabee89@gmail.com)87006c7
: cmd: add "list" command to list environments (Tibor Vass teabee89@gmail.com)71623ee
: cmd: auto run with dagger run (Tibor Vass teabee89@gmail.com)bcf54dc
: cmd: move stdio server into stdio command (Andrea Luzzardi andrea@luzzardi.com)543fcec
: cmd: use a default for CU_STDERR_FILE so its not mandatory (Andrea Luzzardi andrea@luzzardi.com)707980e
: container-use watch (Connor Braa connor@dagger.io)0897afd
: container: background run support (Andrea Luzzardi andrea@luzzardi.com)8823fae
: container: fork support (Andrea Luzzardi andrea@luzzardi.com)394ca90
: container: tweak run tools to be more useful: env variables, internal port mapping, entrypoint (Andrea Luzzardi andrea@luzzardi.com)e79fc2e
: dagger-for-github release pipeline, replace Makefile with install.sh, add build check to PRs (#47) (Connor Braa 3478454+cwlbraa@users.noreply.github.com)d2448db
: debug: dump all goroutines to stderr and log file upon SIGUSR1 (Tibor Vass teabee89@gmail.com)2bbe348
: env: add checkpoint (Andrea Luzzardi andrea@luzzardi.com)5ecb712
: environment setup: run the setup commands before mounting the code for better caching (Andrea Luzzardi andrea@luzzardi.com)74828e1
: environment: change default env image (Andrea Luzzardi andrea@luzzardi.com)c09ad6b
: environment: clean up load/save (Andrea Luzzardi andrea@luzzardi.com)4d26eec
: environment: disable re-opening existing environment as its too broken (Andrea Luzzardi andrea@luzzardi.com)343b2bd
: environment: secret support (Andrea Luzzardi andrea@luzzardi.com)64e463f
: environment: store revisions in git notes. wire up context (Andrea Luzzardi andrea@luzzardi.com)138a4d0
: environments: more granular setup, transition away from Dockerfiles (Andrea Luzzardi andrea@luzzardi.com)4b2540f
: examples update (Andrea Luzzardi andrea@luzzardi.com)88ed494
: examples: add history, remove git (Andrea Luzzardi andrea@luzzardi.com)62e0ea6
: examples: hello world (Andrea Luzzardi andrea@luzzardi.com)b2f27c8
: examples: simplify parallel (Andrea Luzzardi andrea@luzzardi.com)510ca33
: examples: update (Andrea Luzzardi andrea@luzzardi.com)08539bc
: filesystem: split fs ops into its own file (Andrea Luzzardi andrea@luzzardi.com)bce19f3
: fix: Makefile (home guillaume@dagger.io)64b5296
: fix: goose configuration (Yves Brissaud gh@lgtd.io)a1f2cdc
: force push currentBranch when setting up worktree to accomodate humans rewriting their branch history (Connor Braa connor@dagger.io)b109fc9
: fork tool, use unclear rn (Connor Braa connor@dagger.io)a1eb5d5
: fs: revision diff (Andrea Luzzardi andrea@luzzardi.com)bb5b7d6
: git add cmd/container-use/watch.go (Connor Braa connor@dagger.io)e513c24
: git commits: handle directories and deleted files (Connor Braa connor@dagger.io)3c5d8d6
: git: add command logs as notes (Andrea Luzzardi andrea@luzzardi.com)59af8c0
: git: add completion log (Andrea Luzzardi andrea@luzzardi.com)175fb2d
: git: do not skip local worktree init if found repo in ~/.config (Tibor Vass teabee89@gmail.com)fb44607
: handle uncommitted files (Connor Braa connor@dagger.io)63c670b
: legit slog wiring (Connor Braa connor@dagger.io)0995cce
: log: Do not output dagger logs to stderr (Tibor Vass teabee89@gmail.com)7d48227
: log: Prevent panic when CU_STDERR_FILE is not set (Tibor Vass teabee89@gmail.com)83f8058
: log: minor output nit (Tibor Vass teabee89@gmail.com)1277882
: log: show tool call errors (Tibor Vass teabee89@gmail.com)2de6106
: make it build (Connor Braa connor@dagger.io)81e7034
: make: better install messages regarding PATH (Tibor Vass teabee89@gmail.com)199fcb0
: make: use build --platform instead of --build-arg (Tibor Vass teabee89@gmail.com)03ca613
: mcp tool hinting (Connor Braa connor@dagger.io)bd9c22d
: mcp: Populate MCP instructions field to rely less on rules files (Tibor Vass teabee89@gmail.com)b8bfc97
: mcp: clean up server (Andrea Luzzardi andrea@luzzardi.com)176ee00
: mcp: cleanup EnvironmentToCallResult (Andrea Luzzardi andrea@luzzardi.com)77bd7a1
: mcp: improve error responses (Andrea Luzzardi andrea@luzzardi.com)3f683c6
: mcp: improve prompts (Andrea Luzzardi andrea@luzzardi.com)d3541c2
: mcp: point to the correct rules for MCP Instructions (Tibor Vass teabee89@gmail.com)534223d
: mcp: wrap tool execution with logs (Andrea Luzzardi andrea@luzzardi.com)0b6a58f
: merge: add required arg (Tibor Vass teabee89@gmail.com)70fbc73
: merge: make stash operations quiet (Tibor Vass teabee89@gmail.com)099a46b
: more re-entrant setup logic so i maintain my sanity in the face of errors (Connor Braa connor@dagger.io)0cefe36
: mostly working, need to figure out tool returns (Connor Braa connor@dagger.io)8ab052d
: move containers to a subdirectory (Connor Braa connor@dagger.io)fef560d
: move path and install logic into makefile (Jason McCallister jason@mccallister.dev)ad13e7c
: petnamify env ids and collapse them with branch and worktree names (Connor Braa connor@dagger.io)8c8f266
: prompt engineering, better host git errors (Connor Braa connor@dagger.io)334b99d
: recomment env open (Connor Braa connor@dagger.io)ea693ef
: refactor: clean up variable names after move to package (Andrea Luzzardi andrea@luzzardi.com)a003194
: refactor: move into sub-packages (Andrea Luzzardi andrea@luzzardi.com)223b978
: remove large gif that was 47MB (Greg Kogan greg.ny@gmail.com)28a1798
: rename cu to build, add install target (Jason McCallister jason@mccallister.dev)862c7ea
: repo org migration (Andrea Luzzardi andrea@luzzardi.com)b0e94f3
: slash delimit name and petname (Connor Braa connor@dagger.io)724d1c7
: terminal hack improvements (Andrea Luzzardi andrea@luzzardi.com)17196ad
: terminal support (Andrea Luzzardi andrea@luzzardi.com)92712aa
: terminal: Use bash but with the same pretty PS1 as in dagger (Tibor Vass teabee89@gmail.com)ffb6c22
: terminal: revert to /bin/sh but keep same PS1 for bash (Tibor Vass teabee89@gmail.com)38ac88b
: terminal: use /bin/bash instead of default /bin/sh (Tibor Vass teabee89@gmail.com)76488fe
: update README: modify Claude Code command to skip permissions (buddypia shoridevel@gmail.com)1ded49b
: update docs for restarting your terminal (Jason McCallister jason@mccallister.dev)eca67dc
: update install steps to include new target (Jason McCallister jason@mccallister.dev)4e496c4
: update readme with pr feedback (Jason McCallister jason@mccallister.dev)a973126
: watch: use Go library instead of exec-ing to watch (Tibor Vass teabee89@gmail.com)7ed54ad
: wip (Connor Braa connor@dagger.io)
Full Changelog :
...v0.0.0
-
🔗 News Minimalist New gluten intolerance test developed + 6 more stories rss
In the last 4 days ChatGPT read 104297 top news stories. After removing previously covered events, there are 7 articles with a significance score over 5.9.
[6.1] Australian scientists simplify and accelerate gluten intolerance diagnosis —abc.net.au(+3)
Australian researchers are developing a new blood test for coeliac disease that doesn't require patients to consume gluten beforehand. This could significantly improve diagnosis rates and patient comfort.
The new test analyzes blood samples mixed with gluten to detect disease- causing T cells. Current testing requires weeks of gluten consumption, a barrier that often deters individuals seeking diagnosis.
Researchers plan to confirm the test's accuracy across diverse populations and aim to make it available within two years.
[5.8] Russia advances into Ukraine's Dnipropetrovsk region for the first time —thehindu.com[$] (+463)
Russia announced Sunday it is advancing into Ukraine's Dnipropetrovsk region, marking a significant escalation in the three-year conflict. This is the first time fighting has reached this central region of Ukraine.
The Russian Defence Ministry stated its forces are pushing into the region after reaching the Donetsk border. Dnipropetrovsk is a vital mining and industrial center, and further Russian gains there would severely impact Ukraine's military and economy.
Previously, Ukrainian military sources suggested the flat terrain of Dnipropetrovsk could allow for rapid Russian advances due to limited natural defenses for Ukrainian forces.
Highly covered news with significance over 5.5
[5.5] India, Poland, Hungary launch first astronauts to space — forbes.com (+43)
[5.6] Iran threatens to release Israeli nuclear secrets — theguardian.com (+20)
[5.5] Russian security service views China as the enemy — dn.se (Swedish) (+7)
[6.2] AI tool finds gene combinations causing complex diseases — news.northwestern.edu (+3)
[5.7] Telescope images show a giant planet forming — phys.org (+3)
Thanks for reading!
— Vadim
You can track significant news in your country with premium.
-
🔗 @trailofbits@infosec.exchange In 2023, we reviewed one of the first DKLs23 libraries built by Silence mastodon
In 2023, we reviewed one of the first DKLs23 libraries built by Silence Laboratories. Read more about our process and dive into the key issues and recommendations we identified:
https://blog.trailofbits.com/2025/06/10/what-we-learned-reviewing-one-of-the- first-dkls23-libraries-from-silence- laboratories/ -
🔗 sacha chua :: living an awesome life Making and re-making: fabric is tuition rss
Sewing together with A+ is helping me learn so much about making and re-making, and about saying yes.
I'm not good at saying yes. Sometimes it's because I have no idea how to make something happen, and I don't want to overcommit. Sometimes it's because I don't think something will be practical or worthwhile. Sometimes it's because I want to spend the time or money on other things instead. Sometimes I don't know how to make it something that she can help with. But A+ asks with shining eyes, and I'm learning, slowly, slowly, to say yes. I'm beginning to trust that the mistakes don't matter as much as the memories do.
A+ has always had ideas about what she wants to wear. At five, she was all about floor-length dresses. I sewed her A-line dresses in comfortable cotton Lycra, peasant-style dresses that matched my tops. I also made a knee-length swim skirt for her. She liked it and requested a floor-length version so that she could twirl and twirl and twirl at the splash pad. She wore it into the wading pool too, enjoying how it swirled around her, trapping air under the skirt and marvelling as it ballooned. The following year, she asked me to attach a bodice to it to make it a dress. I turned the knee-length skirt into the bodice for the floor-length dress, took out the stitches that had previously narrowed the then-too-large waist, and it was good for another year of twirling.
When she was 6 and in the throes of a Cinderella obsession (we read through 50+ variants of the story from the library), I made her a powder blue charmeuse ballgown with a full-circle skirt supported by the petticoats and tutus that she layered with abandon: 19 layers of tulle in total. She loved curtsying and twirling with that whole shebang at the pretend tea parties she hosted at the playground, and it survived the washing machine surprisingly well.
A+ is nine now and has long outgrown the ballgown, which has been stashed in the closet until I figure out if it's going to become a skirt for her or for me. But she still wears the A-line dresses from years ago, which now reach her knees instead of her ankles. She still likes fanciful clothes. I made a floor-length light blue dress so that she could wear it to her cousin's wedding. She picked out some ribbon for the waist, a lace trim to place near the hem, and some ribbon flowers as embellishments, and she asked me to sew a hooded cloak with a ribbon closure. After the wedding, I trimmed the dress to knee-length and re-sewed the lace close to the new hem so that she could wear it while biking to the playground.
Inevitably, she's beginning to grow up. Her fancy is tempered by a few nods to practicality:
- knee-length skirts because they don't get in the way of riding her bike
- she likes stretchy fabric more than woven fabric
- skorts are great for doing cartwheels or hanging upside down.
We prefer to buy fabric in person so that she can feel the fabric on her skin. At the store, A+ zeroed in on a sheer floral print organza that she had seen on a mannequin in the window display. "The organza doesn't have a border," she said. "We can make it a circle skort." She's learning to think about the characteristics of the fabric and what we can do with it. She matched the sheer floral organza fabric with a peach polyester-spandex from the swimwear section and the right colour of thread from the basement.
This will be the fourth warm-weather skirt this year. We make little tweaks each time, as she learns more about what she likes to wear. Here's the progression so far:
- For her first summer skirt this year, I made a lavender knee-length rectangle skirt with scallop-edged embroidered mesh over bridal satin, gathered at a 1:2 ratio. She liked the dressiness of it, but 1:2 turned out to not be enough ease for cartwheels, so she changes into something else when she wants to be more active.
- The second was a mermaid scale skort made from the swimwear fabric I ordered last year, based on one of the purchased skorts she liked. It'll be her new swim skirt.
- The third one was a purple skort. I changed it from side seams to a single back seam so that it's easier for A+ to tell the difference between front and back.
I love being able to change things based on her feedback. We've browsed nearby clothing stores and bought a few pieces, but she rarely finds things that she really likes. Her last pick from the store was a peach skort with a matching top. I removed the waist elastic from the top because she doesn't like elastics, and now it's good to go. It'll be the model for the new skort, I think: a non-stretchy skirt with a stretchy fabric used for the shorts. This time she wants a knee-length circle skirt instead of the mid-thigh length of the commercial skorts. Easy enough - just a matter of drawing a bigger circle.
I appreciate how all this experience re-making things makes it easier to say yes to A+'s ideas. For example, the hat I sewed for her last year is starting to feel a bit small. I cut pieces for a new bucket hat using the free AppleGreen Cottage pattern that I'd previously used to make two other hats for her and one for me. This time, I wanted to make the outer layer from the floral canvas left over from reupholstering long-gone dining room chairs and the inner layer from the linen tea toweling that we decided not to use in the kitchen. Midway through the process, A+ asked me if I could make the hat pointy instead, like a witch's hat. I put the brim pieces together, sketched out a quick quarter-circle, sewed the outer layer, and tested the fit on her head. Then I used the inner brim layer to cover up the seams, finished with some topstitching, and it was good to go. I figured that if she changed her mind and wanted a flat hat, I could easily make one from the scraps, or I could even modify this pointy hat to put a different crown on it.
Sewing is becoming more enjoyable and less stressful. I worry less about making mistakes because I've learned how to recover from many of them. Sometimes something's more of a loss, like that lavender floor-length cotton dress with a split organza overskirt that she wore a couple of times before it was declared too uncomfortable, or the scraps that she cuts up when trying to fashion a dress for her doll. That's fine, fabric is tuition for learning.
A+'s becoming more adept, too. She's no longer limited to standing still for measurements, fetching pieces of fabric, or other make-work I could think of to keep her busy while I sewed. Now she can get the sewing machine to wind the bobbin and she can thread the needle. She can sew straight seams and stop when the machine makes an unexpected sound. She can turn straps right side out and unpick seams when we make mistakes or change our minds. She knows it isn't just a matter of how a fabric looks, but also what it feels like and how it moves. She's gradually learning what she likes and what she doesn't like. And if I have the temerity to remind her how to do something ("Make a 'p' shape with the thread when you put it in the bobbin case"), I get a glimpse of the teenager she'll become ("I know how to do it, Mom.").
We're getting better at seeing the clothes as their component parts: patterns, fabric, pieces we can recombine. "Can you copy this, but without sleeves?" she asks, and I figure it out. Looking at the yardage left, I can start to think: ah, I can squeeze a matching training bra out of this part, and I think I have enough here to make a top, and this rectangle is large enough for a headband, and I can turn these scraps into flowers while I'm waiting for her at a playdate.
I'm learning from all her requests. By myself, I tend to settle into comfortable routines. In 2015, I made 18 tops based on the Colette Sorbetto woven tank top pattern, eventually taking advantage of Hacklab's laser cutter to precisely cut the fabric so that my notches lined up every time. When I find something I like, I make it again and again. A+'s still figuring out what she likes. We're learning so much.
Sewing for A+ is a time-limited opportunity, and I want to make the most of it. There are only so many clothes I can sew for her. Eventually she may want to wear the same things as everyone else, or eventually she might be comfortable doing all the sewing herself. Eventually she'll be off on her own life. Maybe the ballgowns will turn into skirts or camisoles, and from there into headbands or scrunchies.
・・・・・
Re-making echoes through our past. My mom tells me this story of how her mom sewed, and how their family was poor. My mom rarely got a new dress, so when her mom sewed a red dress for her, that was special. She wore it until the bodice couldn't fit any more. Her mom undid the seams, sewed a new bodice onto the skirt, and gave the dress back to her. She wore it until the skirt was all worn out. Her mom undid the seams and replaced the skirt. My mom said to her mom, "Does this mean I have a new dress now?" This was not the only dress my grandmother made for her. My mom also tells a story of how one time she hovered by her mom's sewing machine, impatiently waiting for her mom to finish sewing the dress that she was going to wear to a party that day. My grandmother must have also worked on re-making, on learning how to say yes. My mom didn't make clothes for me, but she passed on the stories.
All this reminds me a little of two picture books we borrowed from the library. My Forever Dress by Harriet Ziefurt and Liz Murphy (2009, video) shows how a grandmother extended and transformed a dress as her granddaughter grew. Something from Nothing by Phoebe Gilman (1992, video) retells the Yiddish folktale about Joseph's overcoat, this time with a special blanket that gets worn down and transformed into a jacket, a vest, a tie, a handkerchief, ending as a fabric-covered button. The button gets lost, but it turns into a story. Of the two, I liked Something from Nothing more. I liked the lighter touch it told the story with, and I liked the reminder that cherished things can be turned into stories.
A+ was in the kitchen, making a grocery list on an LCD writing tablet. She wanted to buy apple sauce, yogurt cups, and mac and cheese. She wanted to do it herself, with her own money. W- will walk her to the store, let her loose, and meet up with her in front of one of the aisles. "Mama, you can stay home," she said.
Challenge: She wanted her own bag for groceries. Her backpack was too small. I rummaged through the reusable bags hanging on the coat hooks. There's this cotton tote we got from an event, but the straps are too long. When she put it on her shoulder, it threatened to fall down. When she carried the bag by its straps, the bag dragged on the floor. I shortened one strap to see if she can hold it then. The body of the bag itself was too long. I sewed a seam across the bottom. Now it's the right height for her. I shortened the other strap and serged the bottom seam to make it neat. She wanted a pocket for her purse and the KN95 mask that she'll wear in the supermarket. W- was almost ready to head out. "Give me another five minutes and I can make her a pocketed bag," I said. He waited. I opened up the scrap from the bottom, sewed the edges together in the other direction, turned it into a pocket, and sewed it to the top hem of the bag. A+ pronounced it perfect. She tucked her purse, mask, and shopping list into the bag, looped the straps over her shoulder, snugged the bag under her elbow, and headed out into the world.
・・・・・
I still sweat my way through figuring out how to sew what she comes up with, but it's good for me. I make and re-make so she can have things that fit her ideas, and so that she can dream of more. She's learning that her ideas matter. It can take several tries, but we can make them happen together. Someday she'll make and re-make things all on her own.
This post was inspired by the June IndieWeb Carnival theme of Take Two.
You can comment on Mastodon or e-mail me at sacha@sachachua.com.
-
🔗 Julia Evans Using `make` to compile C programs (for non-C-programmers) rss
I have never been a C programmer but every so often I need to compile a C/C++ program from source. This has been kind of a struggle for me: for a long time, my approach was basically "install the dependencies, run
make
, if it doesn't work, either try to find a binary someone has compiled or give up"."Hope someone else has compiled it" worked pretty well when I was running Linux but since I've been using a Mac for the last couple of years I've been running into more situations where I have to actually compile programs myself.
So let's talk about what you might have to do to compile a C program! I'll use a couple of examples of specific C programs I've compiled and talk about a few things that can go wrong. Here are three programs we'll be talking about compiling:
step 1: install a C compiler
This is pretty simple: on an Ubuntu system if I don't already have a C compiler I'll install one with:
sudo apt-get install build-essential
This installs
gcc
,g++
, andmake
. The situation on a Mac is more confusing but it's something like "install xcode command line tools".step 2: install the program's dependencies
Unlike some newer programming languages, C doesn't have a dependency manager. So if a program has any dependencies, you need to hunt them down yourself. Thankfully because of this, C programmers usually keep their dependencies very minimal and often the dependencies will be available in whatever package manager you're using.
There's almost always a section explaining how to get the dependencies in the README, for example in paperjam's README, it says:
To compile PaperJam, you need the headers for the libqpdf and libpaper libraries (usually available as libqpdf-dev and libpaper-dev packages).
You may need
a2x
(found in AsciiDoc) for building manual pages.So on a Debian-based system you can install the dependencies like this.
sudo apt install -y libqpdf-dev libpaper-dev
If a README gives a name for a package (like
libqpdf-dev
), I'd basically always assume that they mean "in a Debian-based Linux distro": if you're on a Macbrew install libqpdf-dev
will not work. I still have not 100% gotten the hang of developing on a Mac yet so I don't have many tips there yet. I guess in this case it would bebrew install qpdf
if you're using Homebrew.step 3: run
./configure
(if needed)Some C programs come with a
Makefile
and some instead come with a script called./configure
. For example, if you download sqlite's source code, it has a./configure
script in it instead of a Makefile.My understanding of this
./configure
script is:- You run it, it prints out a lot of somewhat inscrutable output, and then it either generates a
Makefile
or fails because you're missing some dependency - The
./configure
script is part of a system called autotools that I have never needed to learn anything about beyond "run it to generate aMakefile
".
I think there might be some options you can pass to get the
./configure
script to produce a differentMakefile
but I have never done that.step 4: run
make
The next step is to run
make
to try to build a program. Some notes aboutmake
:- Sometimes you can run
make -j8
to parallelize the build and make it go faster - It usually prints out a million compiler warnings when compiling the program. I always just ignore them. I didn't write the software! The compiler warnings are not my problem.
compiler errors are often dependency problems
Here's an error I got while compiling
paperjam
on my Mac:/opt/homebrew/Cellar/qpdf/12.0.0/include/qpdf/InputSource.hh:85:19: error: function definition does not declare parameters 85 | qpdf_offset_t last_offset{0}; | ^
Over the years I've learned it's usually best not to overthink problems like this: if it's talking about
qpdf
, there's a good change it just means that I've done something wrong with how I'm including theqpdf
dependency.Now let's talk about some ways to get the
qpdf
dependency included in the right way.the world's shortest introduction to the compiler and linker
Before we talk about how to fix dependency problems: building C programs is split into 2 steps:
- Compiling the code into object files (with
gcc
orclang
) - Linking those object files into a final binary (with
ld
)
It's important to know this when building a C program because sometimes you need to pass the right flags to the compiler and linker to tell them where to find the dependencies for the program you're compiling.
make
uses environment variables to configure the compiler and linkerIf I run
make
on my Mac to installpaperjam
, I get this error:c++ -o paperjam paperjam.o pdf-tools.o parse.o cmds.o pdf.o -lqpdf -lpaper ld: library 'qpdf' not found
This is not because
qpdf
is not installed on my system (it actually is!). But the compiler and linker don't know how to find theqpdf
library. To fix this, we need to:- pass
"-I/opt/homebrew/include"
to the compiler (to tell it where to find the header files) - pass
"-L/opt/homebrew/lib -liconv"
to the linker (to tell it where to find library files and to link iniconv
)
And we can get
make
to pass those extra parameters to the compiler and linker using environment variables! To see how this works: insidepaperjam
's Makefile you can see a bunch of environment variables, likeLDLIBS
here:paperjam: $(OBJS) $(LD) -o $@ $^ $(LDLIBS)
Everything you put into the
LDLIBS
environment variable gets passed to the linker (ld
) as a command line argument.secret environment variable:
CPPFLAGS
Makefiles
sometimes define their own environment variables that they pass to the compiler/linker, butmake
also has a bunch of "implicit" environment variables which it will automatically pass to the C compiler and linker. There's a full list of implicit environment variables here, but one of them isCPPFLAGS
, which gets automatically passed to the C compiler.(technically it would be more normal to use
CXXFLAGS
for this, but this particularMakefile
hardcodesCXXFLAGS
so settingCPPFLAGS
was the only way I could find to set the compiler flags without editing theMakefile
)As an aside: it took me a long time to realize how closely tied to C/C++
make
is -- I used to think thatmake
was just a general build system (and of course you can use it for anything!) but it has a lot of affordances for building C/C++ programs that it doesn't have for building any other kind of program.two ways to pass environment variables to
make
I learned thanks to @zwol that there are actually two ways to pass environment variables to
make
:CXXFLAGS=xyz make
(the usual way)make CXXFLAGS=xyz
The difference between them is that
make CXXFLAGS=xyz
will override the value ofCXXFLAGS
set in theMakefile
butCXXFLAGS=xyz make
won't.I'm not sure which way is the norm but I'm going to use the first way in this post.
how to use
CPPFLAGS
andLDLIBS
to fix this compiler errorNow that we've talked about how
CPPFLAGS
andLDLIBS
get passed to the compiler and linker, here's the final incantation that I used to get the program to build successfully!CPPFLAGS="-I/opt/homebrew/include" LDLIBS="-L/opt/homebrew/lib -liconv" make paperjam
This passes
-I/opt/homebrew/include
to the compiler and-L/opt/homebrew/lib -liconv
to the linker.Also I don't want to pretend that I "magically" knew that those were the right arguments to pass, figuring them out involved a bunch of confused Googling that I skipped over in this post. I will say that:
- the
-I
compiler flag tells the compiler which directory to find header files in, like/opt/homebrew/include/qpdf/QPDF.hh
- the
-L
linker flag tells the linker which directory to find libraries in, like/opt/homebrew/lib/libqpdf.a
- the
-l
linker flag tells the linker which libraries to link in, like-liconv
means "link in theiconv
library", or-lm
means "linkmath
"
tip: how to just build 1 specific file:
make $FILENAME
Yesterday I discovered this cool tool called qf which you can use to quickly open files from the output of
ripgrep
.qf
is in a big directory of various tools, but I only wanted to compileqf
. So I just compiledqf
, like this:make qf
Basically if you know (or can guess) the output filename of the file you're trying to build, you can tell
make
to just build that file by runningmake $FILENAME
tip: look at how other packaging systems built the same C program
If you're having trouble building a C program, maybe other people had problems building it too! Every Linux distribution has build files for every package that they build, so even if you can't install packages from that distribution directly, maybe you can get tips from that Linux distro for how to build the package. Realizing this (thanks to my friend Dave) was a huge ah-ha moment for me.
For example, this line from the nix package for
paperjam
says:env.NIX_LDFLAGS = lib.optionalString stdenv.hostPlatform.isDarwin "-liconv";
This is basically saying "pass the linker flag
-liconv
to build this on a Mac", so that's a clue we could use to build it.That same file also says
env.NIX_CFLAGS_COMPILE = "-DPOINTERHOLDER_TRANSITION=1";
. I'm not sure what this means, but when I try to build thepaperjam
package I do get an error about something called aPointerHolder
, so I guess that's somehow related to the "PointerHolder transition".step 5: installing the binary
Once you've managed to compile the program, probably you want to install it somewhere! Some
Makefile
s have aninstall
target that let you install the tool on your system withmake install
. I'm always a bit scared of this (where is it going to put the files? what if I want to uninstall them later?), so if I'm compiling a pretty simple program I'll often just manually copy the binary to install it instead, like this:cp qf ~/bin
step 6: maybe make your own package!
Once I figured out how to do all of this, I realized that I could use my new
make
knowledge to contribute apaperjam
package to Homebrew! Then I could justbrew install paperjam
on future systems.The good thing is that even if the details of how all of the different packaging systems, they fundamentally all use C compilers and linkers.
it can be useful to understand a little about C even if you're not a C
programmer
I think all of this is an interesting example of how it can useful to understand some basics of how C programs work (like "they have header files") even if you're never planning to write a nontrivial C program if your life.
It feels good to have some ability to compile C/C++ programs myself, even though I'm still not totally confident about all of the compiler and linker flags and I still plan to never learn anything about how autotools works other than "you run
./configure
to generate theMakefile
".Also one important thing I left out is
LD_LIBRARY_PATH / DYLD_LIBRARY_PATH
(which you use to tell the dynamic linker at runtime where to find dynamically linked files) because I can't remember the last time I ran into anLD_LIBRARY_PATH
issue and couldn't find an example. - You run it, it prints out a lot of somewhat inscrutable output, and then it either generates a